RabbitMQ工作模式
一、Work queues工作队列模式
针对一个生产者,对应多个消费者,同时多个消费者是竞争关系,消息只能被一个消费者消费。生产者将消息发送到对列,由消费者进行处理。
生产者:
//创建连接
Connection connection = ConnectionUtil.getConnection();
//创建频道
Channel channel = connection.createChannel();
//声明对列
channel.queueDeclare(QUEUE_NAME, true, false, false, null);
//消息推送
channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
消费者(多)
//创建连接
Connection connection = ConnectionUtil.getConnection();
//创建频道
Channel channel = connection.createChannel();
//声明对列
channel.queueDeclare(QUEUE_NAME, true, false, false, null);
//创建消费者;并设置消息处理
DefaultConsumer consumer = new DefaultConsumer(channel){
@Override handleDelivery
-- 消息处理
//确认消息
channel.basicAck(envelope.getDeliveryTag(), false);
}
//监听消息
channel.basicConsume(Producer.QUEUE_NAME, false, consumer);
结果:多个消费者消费的消息不会重复
二、订阅模式类型
生产者将消息发送到交换机,交换机将消息传递给某个对列或者递交给所有对列或者丢弃消息(取决于交换机类型Direct、Fanout、Topic、Headers)。交换机只做转发,不做消息处理。
Direct Exchange:将消息中的Routing key
与该Exchange
关联的所有Binding
中的Routing key
进行比较,如果相等,则发送到该Binding
对应的Queue
中。
Topic Exchange:将消息中的Routing key
与该Exchange
关联的所有Binding
中的Routing key
进行对比,如果匹配上了,则发送到该Binding
对应的Queue
中。 符号“#”匹配一个或多个词,符号“*”只能匹配一个词。
Fanout Exchange:直接将消息转发到所有binding
的对应queue
中,这种exchange
在路由转发的时候,忽略Routing key
。
Headers Exchange:将消息中的headers
与该Exchange
相关联的所有Binging
中的参数进行匹配,如果匹配上了,则发送到该Binding
对应的Queue
中。
生产者:
//创建连接
Connection connection = ConnectionUtil.getConnection();
// 创建频道
Channel channel = connection.createChannel();
/**
* 声明交换机
* 参数1:交换机名称
* 参数2:交换机类型,fanout、topic、direct、headers
*/
channel.exchangeDeclare(FANOUT_EXCHAGE, BuiltinExchangeType.FANOUT);
// 声明(创建)队列
/**
* 参数1:队列名称
* 参数2:是否定义持久化队列
* 参数3:是否独占本次连接
* 参数4:是否在不使用的时候自动删除队列
* 参数5:队列其它参数
*/
channel.queueDeclare(FANOUT_QUEUE_1, true, false, false, null);
channel.queueDeclare(FANOUT_QUEUE_2, true, false, false, null);
//队列绑定交换机
channel.queueBind(FANOUT_QUEUE_1, FANOUT_EXCHAGE, "");
channel.queueBind(FANOUT_QUEUE_2, FANOUT_EXCHAGE, "");
//发送消息
channel.basicPublish(FANOUT_EXCHAGE, "", null, message.getBytes());
消费者:
//创建连接
Connection connection = ConnectionUtil.getConnection();
// 创建频道
Channel channel = connection.createChannel();
//声明交换机
channel.exchangeDeclare(Producer.FANOUT_EXCHAGE, BuiltinExchangeType.FANOUT);
// 声明(创建)队列
/**
* 参数1:队列名称
* 参数2:是否定义持久化队列
* 参数3:是否独占本次连接
* 参数4:是否在不使用的时候自动删除队列
* 参数5:队列其它参数
*/
channel.queueDeclare(Producer.FANOUT_QUEUE_1, true, false, false, null);
//队列绑定交换机
channel.queueBind(Producer.FANOUT_QUEUE_1, Producer.FANOUT_EXCHAGE, "");
//创建消费者;并设置消息处理
DefaultConsumer consumer = new DefaultConsumer(channel){
@Override handleDelivery
-- 消息处理
}
//监听消息
channel.basicConsume(Producer.FANOUT_QUEUE_1, true, consumer);
三、Publish/Subscribe发布与订阅模式
每个消费者都监听自己的队列,生产者将消息发给broker,由交换机将消息转发到绑定此交换机的每个队列,每个绑定交换机的队列都将接收到消息。如果多个消费者同时绑定到同一个队列,起到订阅的效果。
四、Routing路由模式 Direct Exchange
路由模式的特点:
1、队列与交换机的绑定需要制定RoutingKey
2、消息的发送方在向Exchange发送消息时,也必须指定消息的RoutingKey
五、topic主题模式(路由模式的一种)