springboot关于@RabbitListener以及@QueueBinding的路由键设置没效果?

发布于 2022-09-12 22:11:45 字数 2712 浏览 58 评论 0

我使用rabbitmq和springboot集成出现一个坑。
那就是我发送消息时使用的是同一个消息队列以及同一个直连交换器,通过不同的key发给不同的消息监听器。
结果key-a的消息可以被key-b接受,我很奇怪。是springboot的bug吗?还是我的使用方式有问题。
springboot-amqp使用的2.1.3版本的

<groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-amqp</artifactId>
  <version>2.1.3.RELEASE</version>

a类:

@RabbitListener(
        bindings = {
                @QueueBinding(
                        value = @Queue(value = "QUEUE_All"),
                        exchange = @Exchange("itc-mq-exchange_All"),
                        key = {
                                "key_A"
                        }
                )
        }
)
public class ReceiverKeyA {

    private final Logger logger = LoggerFactory.getLogger(this.getClass());

    //由于rabbitTemplate的scope属性设置为ConfigurableBeanFactory.SCOPE_PROTOTYPE,所以不能自动注入
    private RabbitTemplate rabbitTemplate;
    /**
     * 构造方法注入rabbitTemplate
     */
    @Autowired
    public ReceiverKeyA(RabbitTemplate rabbitTemplate) {
        this.rabbitTemplate = rabbitTemplate;
//        rabbitTemplate.setConfirmCallback(this); //rabbitTemplate如果为单例的话,那回调就是最后设置的内容

    }

    @RabbitHandler
    public void process(String hello) {
        System.out.println("Receiver 接受spring-boot-routingKey_A队列 : " + hello);
    }


}

b类:

@RabbitListener(
        bindings = {
                @QueueBinding(
                        value = @Queue(value = "QUEUE_All"),
                        exchange = @Exchange("itc-mq-exchange_All"),
                        key = {
                                "key_B",
                        }
                )
        }
)
public class ReceiverKeyB {

    private final Logger logger = LoggerFactory.getLogger(this.getClass());

    //由于rabbitTemplate的scope属性设置为ConfigurableBeanFactory.SCOPE_PROTOTYPE,所以不能自动注入
    private RabbitTemplate rabbitTemplate;
    /**
     * 构造方法注入rabbitTemplate
     */
    @Autowired
    public ReceiverKeyB(RabbitTemplate rabbitTemplate) {
        this.rabbitTemplate = rabbitTemplate;
//        rabbitTemplate.setConfirmCallback(this); //rabbitTemplate如果为单例的话,那回调就是最后设置的内容

    }

    @RabbitHandler
    public void process(String hello) {
        System.out.println("Receiver 接受spring-boot-routingKey_B队列 : " + hello);
    }


}

结果是

Receiver 接受spring-boot-routingKey_A队列 : sdfaf 123sadfqwer asdf 东方购物
Receiver 接受spring-boot-routingKey_B队列 : sdfaf 123sadfqwer asdf 东方购物
Receiver 接受spring-boot-routingKey_A队列 : sdfaf 123sadfqwer asdf 东方购物
Receiver 接受spring-boot-routingKey_B队列 : sdfaf 123sadfqwer asdf 东方购物

太奇怪了,这个问题。。。

希望大家帮忙解决这个问题

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文