- 问题
生产者第一次建立交换机所绑定的routingkey
重启生产者,若减少了绑定不生效,只能去后台手动点击取消
- RabbitMQ官方地址
http://www.rabbitmq.com/
https://www.rabbitmq.com/getstarted.html
RabbitMQ是由erlang语言开发,基于AMQP(Advanced Message Queue 高级消息队列协议)协议实现的消息队列,它是一种应用程序之间的通信方法,消息队列在分布式系统开发中应用非常广泛。
RabbitMQ提供了6种模式:简单模式,work模式,Publish/Subscribe发布与订阅模式,Routing路由模式,Topics主题模式,RPC远程调用模式(远程调用,不太算MQ;暂不作介绍);
2.启用管理插件
rabbitmq-plugins enable rabbitmq_management
3.启动RabbitMQ
systemctl start rabbitmq-server.service
systemctl status rabbitmq-server.service
systemctl stop rabbitmq-server.service
简单模式
生产者直接将消息发送到队列中,消费者去队列中取消息 1v1
工作模式:work
生产者将消息发送到队列中,多个消费者去队列中取消息(默认是平均分配)
要想消费者彼此争抢:
/**
* 两个消费者 默认是均分的
* 设置根据消费者自动争抢须要:
* 1、关闭自动确认 channel.basicConsume(QUEUE_NAME,false,consumer);
* 2、添加手动确认代码 channel.basicAck(envelope.getDeliveryTag(), false);
* 3、//消费掉一个消息后再去消费另一个 channel.basicQos(1);
*
*/
public class WorkConsumer1 {
static final String QUEUE_NAME = "work_queue";
public static void main(String[] args) throws Exception {
Connection connection = ConnectionUtils.getConnection();
Channel channel = connection.createChannel();
// channel.queueDeclare(QUEUE_NAME,true,false,false,null); 可以不声明
//消费掉一个消息后再去消费另一个
channel.basicQos(1);
Consumer consumer = new DefaultConsumer(channel){
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
System.out.println("body:"+new String(body));
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
channel.basicAck(envelope.getDeliveryTag(), false); //第二个参数是是否确认多个消息
}
};
// channel.basicConsume(QUEUE_NAME,true,consumer);
channel.basicConsume(QUEUE_NAME,false,consumer);
}
}
订阅模式:
1、fanout广播模式
每个消费者监听指定的队列
生产者将消息发给broker,由交换机将消息转发到绑定此交换机的每个队列,每个绑定交换机的队列都将接收到相同的消息。
2、routing路由模式
队列与交换机的绑定,不能是任意绑定了,而是要指定一个RoutingKey(路由
key)
消息的发送方在 向 Exchange发送消息时,也必须指定消息的 RoutingKey。
Exchange不再把消息交给每一个绑定的队列,而是根据消息的Routing Key进行
判断,只有队列的Routingkey与消息的 Routing key完全一致,才会接收到消
息
路由模式:队列绑定交换机指定的key和发送消息指定的key相同时,才能发送出去。
3、Topics通配符模式
Topic类型与Routing相比,都是可以根据RoutingKey把消息路由到不同的队列。只不过Topic类型Exchange可以让队列在绑定Routing key 的时候**使用通配符**!
Routingkey 一般都是有一个或多个单词组成,多个单词之间以”.”分割,例如: item.insert
通配符规则:
#:匹配零个或多个词
*:匹配不多不少恰好1个词
举例:
item.#:能够匹配item.insert.abc 或者 item.insert
item.*:只能匹配item.insert
评论区