Topic
topics 模式支持模糊匹配RoutingKey,就像是sql中的 like子句模糊查询,而路由模式等同于sql中的where子句等值查询
topic 交换机背后的路由算法类似于 direct 交换,使用特定路由键发送的消息将被传递到使用匹配绑定键绑定的所有队列。
如上图,主题模式不能具有任意的 routingKey,必须由一个英文句点“.”分隔的字符串(分割符),比如 “ fruit.orange.mango ”。
交换机和队列的Binding key用通配符来表示,有两种语法:
- 星号* 表示至少,且只能占位一个单词。代表进入该队列的消息,指定的routingKey只能是3个单词组成,单词与单词之间用 * 间隔符,且中间的单词是product
- # 可以替代 0 或多个单词;
例如 #.com.#
#可以表示0级或多级。xx.com、com.xx、com、xx.com.xx.xx、xx.xx.com.xx都可以
例如 *.com. *
*表示一级,xx.com.xx 可以 ,com.xx 不可以,前面缺少一级,xx.com.xx.xx不可以,com后面只能有一级xx,最终格式必须是 xx.com.xx
=============================创建Topic主题===============================
public void createTopic() { //交换机 String exchangeName = "EW_EXCHANGE"; //队列 String queueProductName = "EW_PRODUCT"; //key String routKeyProduct = "*.product.*"; //队列 String queueDeviceName = "EW_DEVICE"; //key //key= *.*.device,消息投递指定的routingKey只能是3个单词组成,且最后一个单词为rabbit String routKeyDevice = "*.*.device"; //key= #.device2,由于#号表示,占位0个或多个,也就是说,不管routingKey是 device2还是 xx.xx.device2都是符合的,但是device2单词后面不能再有单词,比如 device2.xx... String routKeyDevice2 = "#.device2";
/** * 交换机 * 第一个参数为队列名字, * 第二个参数为是否持久化, * 第三个参数为不使用队列时自动删除 */ TopicExchange exchange = new TopicExchange(exchangeName, true, false); amqpAdmin.declareExchange(exchange);
/** *队列 * 第一个参数为队列名字, * 第二个参数为是否持久化, * 第三个参数为是否排他(true:一个连接只能有一个队列,false:一个连接可以有多个(推荐)) * 第四个参数为不使用队列时自动删除 */
//产品 Queue queue = new Queue(queueProductName, true, false, false); amqpAdmin.declareQueue(queue); //设备队列 Queue queueDevice = new Queue(queueDeviceName, true, false, false); amqpAdmin.declareQueue(queueDevice); //交换机与设备绑定 //一个队列可以绑定多个 key值
/** * 第一个参数为目的地,就是交换机或者队列的名字 * 第二个参数为目的地类型,交换机还是队列 * 第三个参数为交换机,QUEUE-队列 EXCHANGE-交换机 * 第四个参数为路由键,匹配的名称 */ Binding bindingProduct = new Binding(queueProductName, Binding.DestinationType.QUEUE, exchangeName, routKeyProduct, null); amqpAdmin.declareBinding(bindingProduct); Binding bindingDevice = new Binding(queueDeviceName, Binding.DestinationType.QUEUE, exchangeName, routKeyDevice, null); amqpAdmin.declareBinding(bindingDevice); Binding bindingDevice2 = new Binding(queueDeviceName, Binding.DestinationType.QUEUE, exchangeName, routKeyDevice, null); amqpAdmin.declareBinding(bindingDevice2 ); }
=======================发送消息========================
String msg="好了么"; Message message = MessageBuilder.withBody(msg.getByte()) .setContentType(MessageProperties.CONTENT_TYPE_JSON) .setContentEncoding("UTF-8") .setMessageId(UUID.randomUUID().toString()).build(); rabbitTemplate.convertAndSend(exchangeName, routKeyProduct, message, new CorrelationData(UUID.randomUUID().toString()));
============================yml==============================