Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 删除exchange后RabbitTemplate发送失败_Java_Rabbitmq_Spring Amqp_Spring Rabbit - Fatal编程技术网

Java 删除exchange后RabbitTemplate发送失败

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

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

代码可以简化为这样。在删除exchange 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);
    }
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确认和返回:


另外,请点击有关范围操作的链接。

感谢您的回复。我知道确认和范围化操作,但不幸的是,由于性能原因,我们无法提供这种解决方案。我对问题的根源做了一些调查(我编辑了我的问题)