spring-boot | rabbitMq-Topic Exc

作者: 代码_搬运工 | 来源:发表于2017-08-30 14:41 被阅读304次

    上篇文章我们主要介绍了rabbitMq的Direct模式,上手比较简单,但是存在一定局限性,不能基于多重条件进行路由选择。今天给大家介绍另外一种比较灵活的方式。主题转发模式(Topic Exchange)。这种模式的优势在于可以根据routing_ke的不同绑定到不同的队列,接收不同的消息。

    在发送端增加配置

    @Configuration
    public class TopicConfig {
            
        //创建两个队列
        @Bean(name = "queuemessage")
        public  Queue queuemessage(){
            return new Queue("topic.message");
            
        }
    
        
        @Bean(name = "queuemessages")
        public Queue queuemessages(){
            return new Queue("topic.messages");
        }
        
        //创建交换机
        @Bean
        public TopicExchange exchange(){
            return new TopicExchange("exchange");
        }
        
        
        //绑定队列
        @Bean
        Binding binding1(@Qualifier("queuemessage")Queue queuemessage,TopicExchange exchange){
            return BindingBuilder.bind(queuemessage).to(exchange).with("topic.message");
        }
        
        //绑定队列
            @Bean
            Binding binding2(@Qualifier("queuemessages")Queue queuemessages,TopicExchange exchange){
                return BindingBuilder.bind(queuemessages).to(exchange).with("topic.#");
            }
        
    }
    
    

    匹配规则:

    星号(*) :只能匹配一个单词
    井号(#):可以匹配0个或多个单词

    如果一个队列绑定的键为"#"时,将会接收所有的队列,类似于fanout转发器。
    如果绑定的队列不包含"#"和"*"时,这时候类似于Direct模式,直接匹配。

    接收端绑定指定队列

    @Component
    public class Receive {
    
       @RabbitListener(queues="topic.message")    
        public void processC(String obj) {
            System.out.println("receiver:topic.message:"+obj);
        }
        
        @RabbitListener(queues="topic.messages")    
        public void topics(String obj) {
            System.out.println("receiver:topic.messages:"+obj);
        }
    
    }
    

    测试类,一个三个参数,第一个参数是交换机的名字,第二个参数是队列的名字,第三个参数是发送的内容。

    Component
    public class Sender {
        
        @Autowired
        private AmqpTemplate template;
        
        @Scheduled(cron="0/5 * * * * ? ")   //每5秒执行一次 
        public void send() {
        //User user = new User(1, "张三", "男");
       DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
      template.convertAndSend("exchange","topic.message",sdf.format(new Date())+"主题转发模式!");
    
        }
        
    }
    

    当我们将队列名字设置为topic.message的时候,看下控制台发现,同一时间发送的消息会同时被两个队列接收。



    我们再将队列名字设置为topic.test看一下

    @Component
    public class Sender {
        
        @Autowired
        private AmqpTemplate template;
        
        @Scheduled(cron="0/5 * * * * ? ")   //每5秒执行一次 
        public void send() {
        //User user = new User(1, "张三", "男");
            DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
        template.convertAndSend("exchange","topic.test",sdf.format(new Date())+"主题转发模式!");
        }
        
    }
    

    发现只有topic.#匹配到了队列,到这里Topic Exchange以整合完毕。我会继续整合其他模式。


    (未完待续)

    相关文章

      网友评论

        本文标题:spring-boot | rabbitMq-Topic Exc

        本文链接:https://www.haomeiwen.com/subject/nzradxtx.html