spring-boot | rabbitMq-Topic Exchange

上篇文章我们主要介绍了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以整合完毕。我会继续整合其他模式。


(未完待续)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,179评论 19 139
  • 来源 RabbitMQ是用Erlang实现的一个高并发高可靠AMQP消息队列服务器。支持消息的持久化、事务、拥塞控...
    jiangmo阅读 13,524评论 2 34
  • RabbitMQ 即一个消息队列,主要是用来实现应用程序的异步和解耦,同时也能起到消息缓冲,消息分发的作用。 消息...
    彩虹之梦阅读 4,739评论 2 1
  • RabbitMQ 即一个消息队列,主要是用来实现应用程序的异步和解耦,同时也能起到消息缓冲,消息分发的作用。 消息...
    极乐君阅读 4,866评论 0 13
  • 1 RabbitMQ安装部署 这里是ErLang环境的下载地址http://www.erlang.org/down...
    Bobby0322阅读 6,780评论 0 11

友情链接更多精彩内容