Java下使用
Maven依赖
RabbitMQ 支持多种语言访问,以 Java 为例看下一般使用 RabbitMQ 的步骤。
maven工程的pom文件中添加依赖
1 | <dependency> |
获取连接
1 | import com.rabbitmq.client.Connection; |
QUEUE
我这里暂且把当前的这种方式定义为队列模式
队列模式的特点
- 先打开生产者发送消息消息不会丢失
- 多个消费者不会收到同一个消息 由服务器去分配
- 生产者把消息直接放在队列中 队列由生产者创建
- 发布消息是交换机的名字填空字符串
- RabbitMQ内置一个名称为空字符串的默认交换机,它根据Routing key将消息路由到与队列名与Routing key完全相等的队列中
消息生产者
1 | import com.rabbitmq.client.Channel; |
消息消费者
1 | import com.rabbitmq.client.*; |
注1:queueDeclare第一个参数表示队列名称、第二个参数为是否持久化(true表示是,队列将在服务器重启时生存)、第三个参数为是否是独占队列(创建者可以使用的私有队列,断开后自动删除)、第四个参数为当所有消费者客户端连接断开时是否自动删除队列、第五个参数为队列的其他参数
注2:basicPublish第一个参数为交换机名称、第二个参数为队列映射的路由key、第三个参数为消息的其他属性、第四个参数为发送信息的主体
EXCHANGE
我这里暂且把当前的这种方式定义为路由模式
路由模式的特点
- 先打开生产者发送消息,消息会丢失
- 多个消费者会收到同一个消息 由服务器根据规则去分配
- 需要队列和路由进行绑定
- 队列可以多次和路由绑定 只要routingKey不同即可
- 交换机类型:fanout(发布订阅模式),direct(精准匹配模式), topic(通配符模式), headers(头匹配模式)
fanout(发布订阅模式)
这种模式的特点
- routingKey 为空字符串
- 只要订阅后都能收到消息
消息生产者
1 | import com.rabbitmq.client.Channel; |
消息消费者
1 | import com.rabbitmq.client.*; |
direct(精准匹配模式)
特点
- 根据routingKey精准匹配消息
topic(通配符模式)
特点
根据routingKey模糊匹配消息
routingKey为aa.bb形式
可以用
*
和#
进行匹配a.*可以匹配 a.a、a.b 不能匹配a.b.c
a.#既可以匹配 a.a、a.b 也能匹配a.b.c
headers(头匹配模式)
- x-match = all :表示所有的键值对都匹配才能接受到消息
- x-match = any :表示只要有键值对匹配就能接受到消息
消费者
1 | //声明路由名字和类型 |
生产者
1 | //声明路由名字和类型 |
上面的例子中name
的值都为jack
匹配上了一个 就能收到消息
发送工具类
1 | package com.xhkjedu.utils; |
注意
channel.queueDeclare(queueName, false, false, false, null);
这是创建了一个队列,如果队列本来就存在,可以不用写这句代码。
Spring集成
这里的示例是用的QUEUE的方式
注意下面的这行配置
1 | <rabbit:template id="rabbitTemplate" connection-factory="connectionFactory" exchange="" routing-key="myqueue"/> |
一定要配置的是routing-key="myqueue"
不要配成queue="myqueue"
我就是在这里折腾了好久。
下面是具体的配置:
1) 添加依赖
1 | <dependencies> |
2) 在resources
中添加文件rabbitmq.xml
内容如下
1 |
|
3) 消息的生产者
1 | import org.springframework.amqp.rabbit.core.RabbitTemplate; |
4) 消息的消费者
1 | import com.rabbitmq.client.Channel; |