Java 删除exchange后RabbitTemplate发送失败
我有以下问题。我使用的是spring-rabbit-2.0.5.RELEASE中的RabbitTemplate类。并使用它向不同的交易所发送消息。默认情况下,一切正常。但是,当其中一个交换被删除并且有很多消息需要处理时,向现有交换发送消息会出现问题—但不会抛出错误—消息只是默默地丢弃 代码可以简化为这样。在删除exchange EX2后的给定场景中,只有部分消息会发送到EX1。简单的解决方法是在每次发送后添加一个Thread.sleep(50),但这显然是不可接受的Java 删除exchange后RabbitTemplate发送失败,java,rabbitmq,spring-amqp,spring-rabbit,Java,Rabbitmq,Spring Amqp,Spring Rabbit,我有以下问题。我使用的是spring-rabbit-2.0.5.RELEASE中的RabbitTemplate类。并使用它向不同的交易所发送消息。默认情况下,一切正常。但是,当其中一个交换被删除并且有很多消息需要处理时,向现有交换发送消息会出现问题—但不会抛出错误—消息只是默默地丢弃 代码可以简化为这样。在删除exchange EX2后的给定场景中,只有部分消息会发送到EX1。简单的解决方法是在每次发送后添加一个Thread.sleep(50),但这显然是不可接受的 RabbitTemp
RabbitTemplate rabbitTemplate = new RabbitTemplate();
for (int i = 0; i < 1000; i++) {
rabbitTemplate.send("EX1", "RK1", someMessage);
rabbitTemplate.send("EX2", "RK2", someMessage);
}
rabbitmplate rabbitmplate=新的rabbitmplate();
对于(int i=0;i<1000;i++){
rabbitTemplate.send(“EX1”,“RK1”,someMessage);
rabbitTemplate.send(“EX2”,“RK2”,someMessage);
}
在做了一些调查之后,我得出了以下结论:
1) 我正在重用一个现有的频道——这是显而易见的
2) 将消息发送到不存在的exchange通道后,通道将被关闭,不幸的是,Rabbit本身似乎正在关闭,而关机消息将异步发送到驱动程序
3) 在收到关于关闭连接的消息后,驱动程序重新创建一个通道,但同时发送的消息丢失
其中一个可能的解决方案是为每个交换机提供不同的通道(在我的情况下,它将起作用,因为我只向几个交换机发送消息(少于10个))
但总的来说,这似乎只是RabbitTemplate的预期行为(当您不使用确认时)我认为您需要研究什么是Publisher确认和返回:
另外,请点击有关范围操作的链接。感谢您的回复。我知道确认和范围化操作,但不幸的是,由于性能原因,我们无法提供这种解决方案。我对问题的根源做了一些调查(我编辑了我的问题)