前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >RabbitMq备胎交换器

RabbitMq备胎交换器

作者头像
写一点笔记
发布2022-08-11 15:54:11
1830
发布2022-08-11 15:54:11
举报
文章被收录于专栏:程序员备忘录程序员备忘录

备胎交换器简称AE,生产者在发送消息的时候如果不设置mandatory参数,那么消息在未被路由的情况下将会丢失;如果设置了mandatory参数,那么需要添加reutrnListener的编程逻辑。生产者的代码将变得复杂,如果既不想复杂化生产者的编程逻辑,又不想消息丢失,那么可以备份交换器,这样可以将未被路由的消息存储在rabbitmq中,再需要的时候再去处理这些消息。

我们可以在定义交换器的时候添加alternate-exchange参数来实现。

代码语言:javascript
复制
Mapargs=new HashMap();
args.put(”alternate-exchange”,”b”);
channel.exchangeDeclare(”a”,”direct”,true,false,args);
channel.exchangeDeclare(”b”,”fanout”,true,false,null);
channel.queueDeclare(”aa”,true,false,false,null);
channel.queueDeclare(”b”,true,false,false,null);
channel.queueBind(”a”,”a”,”aaa”);
channel.queueBind(”b”,”bb”,””);

如上图所示,当消息发送到交换机A的时候,如果路由键为aaa那么就发送到AA的消息队列中,如果路由键不是aaa,那么就发送到备胎交换器b,然后发送到队里BBB中!

代码语言:javascript
复制
 /**
     * 任務接受隊列
     */
    @Bean
    public Queue AAQueue() {
        return new Queue("AA");
    }
    /**
     * 任務接受隊列
     */
    @Bean
    public Queue BBQueue() {
        return new Queue("BB");
    }




    @Bean
    public DirectExchange exchangeA() {
        Map map=new HashMap<>();
        map.put("alternate-exchange","B");
        return new DirectExchange("A",true,false,map);
    }




    /**
     * 直接交换
     */
    @Bean
    public FanoutExchange exchangeB() {
        return new FanoutExchange("B");
    }


    /**
     *
     * @param BBQueue    队列
     * @param exchangeB 延迟交换器
     */
    @Bean
    public Binding delayBindingB(Queue BBQueue, FanoutExchange exchangeB) {
        return BindingBuilder.bind(BBQueue).to(exchangeB);
    }


    /**
     *
     * @param AAQueue    队列
     * @param exchangeA 延迟交换器
     */
    @Bean
    public Binding delayBindingA(Queue AAQueue, DirectExchange exchangeA) {
        return BindingBuilder.bind(AAQueue).to(exchangeA).with("aaa");
    }


    /**
     *  @param exchangeB    队列
     * @param exchangeA 延迟交换器
     * @return
     */
    @Bean
    public Binding exchangeBinding(FanoutExchange exchangeB, DirectExchange exchangeA) {
        return BindingBuilder.bind(exchangeB).to(exchangeA).with("");
    }
代码语言:javascript
复制
    @Test
    public void testAE(){
        //设置消息相关属性
        MessageProperties messageProperties = new MessageProperties();
        messageProperties.setMessageId(UUID.randomUUID().toString());
        messageProperties.setContentType(MediaType.APPLICATION_JSON_VALUE);
        rabbitMqTemplate.sendAndReceive("A","aaa",new Message("123".getBytes(),messageProperties));
        rabbitMqTemplate.sendAndReceive("A","aaab",new Message("1234".getBytes(),messageProperties));
    }

代码运行效果:消息队列

备胎交换器

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-03-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 写点笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
消息队列 CMQ 版
消息队列 CMQ 版(TDMQ for CMQ,简称 TDMQ CMQ 版)是一款分布式高可用的消息队列服务,它能够提供可靠的,基于消息的异步通信机制,能够将分布式部署的不同应用(或同一应用的不同组件)中的信息传递,存储在可靠有效的 CMQ 队列中,防止消息丢失。TDMQ CMQ 版支持多进程同时读写,收发互不干扰,无需各应用或组件始终处于运行状态。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档