//durable 是否持久化消息
QueueingConsumer consumer = new QueueingConsumer(channel);
//参数:队列名称、是否自动ACK、Consumer
channel.basicConsume(queueName, true, consumer);
//循环获取消息
while(true){
//获取消息,如果没有消息,这一步将会一直阻塞
Delivery delivery = consumer.nextDelivery();
String msg = new String(delivery.getBody());
System.out.println(“收到消息:” + msg);
}
}
}
测试结果:
注意需要routingKey保持一致。可以自己尝试修改routingkey,是否能收到消息。
-
所有发送到Topic Exchange的消息被转发到所有管线RouteKey中指定Topic的Queue上
-
Exchange将RouteKey和某Topic进行模糊匹配,此时队列需要绑定一个Topic
注意:可以使用通配符进行模糊匹配
符号 “#” 匹配一个或多个词
符号 “_" 匹配不多不少一个词
例如:“log.#” 能够匹配到 “log.info.oa”
"log._” 只会匹配到 “log.error”
在一堆消息中,每个不同的队列只关心自己需要的消息。
4.1 代码演示
生产端:
/**
-
@ClassName: Producer4TopicExchange
-
@Description: 生产者
-
@author Coder编程
-
@date2019年7月19日 下午22:32:41
*/
public class Producer4TopicExchange {
public static void main(String[] args) throws Exception {
//1创建ConnectionFactory
Connection connection = ConnectionUtils.getConnection();
//2创建Channel
Channel channel = connection.createChannel();
//3声明
String exchangeName = “test_topic_exchange”;
String routingKey1 = “user.save”;
String routingKey2 = “user.update”;
String routingKey3 = “user.delete.abc”;
//4发送
String msg = “Coder编程 Hello World RabbitMQ 4 Topic Exchange Message …”;