RabbitTemplate删除交换后发送失败

时间:2019-01-23 14:05:35

标签: java rabbitmq spring-amqp spring-rabbitmq

我遇到了以下问题。我正在使用spring-rabbit-2.0.5.RELEASE中的RabbitTemplate类。并使用它向不同的交易所发送消息。默认情况下,一切正常。但是,当其中一个交换中心被删除并且要处理的消息很多时,将消息发送到现有的交换中心就会出现问题-但不会引发任何错误-消息只会被静默丢弃。

代码可以简化为此。在给定方案中,删除交换EX2后-仅将部分消息发送到EX1。一个简单的解决方法是在每次发送后添加一个Thread.sleep(50)-但这显然是不可接受的。

    RabbitTemplate rabbitTemplate = new RabbitTemplate();
    for (int i = 0; i < 1000; i++) {
        rabbitTemplate.send("EX1", "RK1", someMessage);
        rabbitTemplate.send("EX2", "RK2", someMessage);
    }

经过一些调查,我得出以下结论:

1)我正在重用现有频道-这很明显

2)在关闭向不存在的交换通道的消息发送后,不幸的是,它似乎已被Rabbit自身关闭,并且关闭消息正在异步发送给驱动程序

3)在收到有关封闭连接驱动程序的消息后,重新创建一个通道,但与此同时发送的消息丢失了

一种可能的解决方案是为每个交易所使用不同的渠道(在我的情况下,这是可行的,因为我仅向几个交易所发送消息(少于10个))。

但是通常,这似乎只是RabbitTemplate的预期行为(当您不使用确认时)

1 个答案:

答案 0 :(得分:1)

我认为您需要研究什么是发布商确认和退回https://docs.spring.io/spring-amqp/docs/2.1.3.RELEASE/reference/html/_reference.html#cf-pub-conf-ret

也请点击有关范围操作的链接。