Spring Boot RabbitMQ 入门(四)之 Topic交换器

来源:互联网 发布:java web truelicense 编辑:程序博客网 时间:2024/04/28 05:01

0.回顾


Spring Boot RabbitMQ 入门(三)之 Fanout交换器
上篇文章我们学习了以下几点:
* 1.如何创建消息生产者
* 2.如何使用消息生产者发送消息
* 3.如何定义Fanout交换器
* 4.将对列绑定到交换器从而测试其特性

1.Topic交换器介绍


Topic.png
如上图所示
此类交换器使得来自不同的源头的消息可以到达一个对列,其实说的更明白一点就是模糊匹配的意思,例如:上图中红色对列的routekey为usa.#,#代表匹配任意字符,但是要想消息能到达此对列,usa.必须匹配后面的#好可以随意。图中usa.news usa.weather,都能找到红色队列,符号“#”匹配一个或多个词,符号“”匹配不多不少一个词。因此“usa.#”能够匹配到“usa.news.XXX”,但是“usa.” 只会匹配到“usa.XXX”。
注:
交换器说到底是一个名称与队列绑定的列表。当消息发布到交换器时,实际上是由你所连接的信道,将消息路由键同交换器上绑定的列表进行比较,最后路由消息

2.Topic交换器实践


2.1创建交换器


 @Bean    public TopicExchange topicExchange() {        return new TopicExchange(EXCHANGE);    }

2.2创建队并


 @Bean    public Queue queue() {        return new Queue("spring-queue", true); //队列持久    }    @Bean    public Queue queue2() {        return new Queue("spring-queue2", true); //队列持久    }

2.3对列绑定并关联到ROUTINGKEY

此处要理解Topic交换器介绍中的注部分就明白
两个对列分别匹配两个不同规则

public static final String EXCHANGE   = "spring-topic-exchange";    public static final String ROUTINGKEY1 = "weather-routingKey.*";    public static final String ROUTINGKEY2 = "msg-routingKey.#";
    @Bean    public Binding binding() {        return BindingBuilder.bind(queue()).to(topicExchange()).with(ROUTINGKEY1);    }    @Bean    public Binding binding2() {        return BindingBuilder.bind(queue2()).to(topicExchange()).with(ROUTINGKEY2);    }

2.4创建消费者,分别消费两对列


Bean    public SimpleMessageListenerContainer messageContainer() {        SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(connectionFactory());        container.setQueues(queue());        container.setExposeListenerChannel(true);        container.setMaxConcurrentConsumers(1);        container.setConcurrentConsumers(1);        container.setAcknowledgeMode(AcknowledgeMode.MANUAL); //设置确认模式手工确认        container.setMessageListener(new ChannelAwareMessageListener() {            @Override            public void onMessage(Message message, Channel channel) throws Exception {                byte[] body = message.getBody();                          System.out.println("receive msg queue: " + new String(body));                          Thread.sleep(10000);                channel.basicAck(message.getMessageProperties().getDeliveryTag(), false); //确认消息成功消费            }        });        return container;    }    @Bean    public SimpleMessageListenerContainer messageContainer2() {        SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(connectionFactory());        container.setQueues(queue2());        container.setExposeListenerChannel(true);        container.setMaxConcurrentConsumers(1);        container.setConcurrentConsumers(1);        container.setAcknowledgeMode(AcknowledgeMode.MANUAL); //设置确认模式手工确认        container.setMessageListener(new ChannelAwareMessageListener() {            @Override            public void onMessage(Message message, Channel channel) throws Exception {                byte[] body = message.getBody();                System.out.println("receive msg queue2: " + new String(body));                Thread.sleep(10000);                channel.basicAck(message.getMessageProperties().getDeliveryTag(), false); //确认消息成功消费            }        });        return container;    }

2.5消息生产者生产消息


@Autowired    RabbitTemplate template;    public void send(String context) {        template.convertAndSend(RabbitConfig.EXCHANGE, "weather-routingKey.a", context);    }

2.验证


此处为了方便验证就不采用发送者发送了,直接用RabbitMQ管理端进行发送
* 1情况一

f.png
我们匹配对列2的msg-routingKey.#
输出结果如下
预计情况会queue2对列消费者消费消息

receive msg queue2: 21213
  • 2情况二
    我们前文讲到采用#可以匹配多个字符
    我们使用routingKey =msg-routingKey.a.b如果前文正确,则
    输出结果如下
receive msg queue2: msg-routingKey.a.b
  • 3.情况三
    *匹配只能是单个字符所以我们我们使用routingKey =weather-routingKey.a如果前文正确,则输出对列queue接受到消息
    结果如下:
receive msg queue: weather-routingKey.a
  • 4.情况四
    我们模拟*匹配“多个字符”的情况routingKey =weather-routingKey.a.b
    如果前文正确,则消息会进入消息”黑洞”,被丢弃,没有输出。
    结果如下:
.

最后

注:此处的多个字符是指以”.”间隔为一个。
Direct其实就是要求routingKey 完全匹配,所以就不再赘述

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 群发不小心发错怎么办 qq群成员满了怎么办 qq知道密码没手机号验证怎么办 改房本上的名字怎么办 支付宝租给别人怎么办 微信麻将房间卡怎么办 皮肤挤伤了发黑怎么办 指甲被挤了黑了怎么办 手指被挤了变黑怎么办 榆次买房太原户口怎么办 皮肤又红又黑怎么办 打仙桃晃晃老输怎么办 微信支付忘了摇怎么办 苹果手机微信摇一摇摇不了怎么办 打麻将牌背的时候怎么办 打麻将背的时候怎么办 同城游台球初使化失败怎么办 qq密码改忘了怎么办啊 qq头像显示不出来怎么办 qq的重要数据被清理怎么办 把qq数据删除了怎么办 手机qq头像显示不同怎么办 手机qq图片显示不出来怎么办 微信群聊右上角双人头像没了怎么办 支付宝好友没了怎么办 手机qq好友头像没了怎么办 微信语音变成听筒模式怎么办 微信语音为听筒模式怎么办 微信设置成听筒模式怎么办 微信验证看不全怎么办 qq看视频无法放大怎么办 苹果6功能键坏了怎么办 qq显示不了头像和图片怎么办 关于学校随便更换老师家长怎么办 qq群昵称改不了怎么办 电脑qq群视频进不去怎么办 微信头像没保存怎么办 qq群信息不响怎么办 微信封面换不了怎么办 微信头像没有了怎么办 科二超过5次怎么办