RabbitMQ-使用DefaultConsumer在使用者断开连接后生存

RabbitMQ-使用DefaultConsumer在使用者断开连接后生存,rabbitmq,Rabbitmq,使用java客户机QueueingConsumer,我编写了以下代码来帮助客户恢复 while (true) { try{ .. create connection .. create channel & queue while (true) { final QueueingConsumer.Delivery delivery = consumer.nextDelivery(); ....

使用java客户机QueueingConsumer,我编写了以下代码来帮助客户恢复

while (true) {
   try{
      .. create connection
      .. create channel & queue
      while (true) {
             final QueueingConsumer.Delivery delivery = consumer.nextDelivery();
             ....
      } catch {
          handleException()
      }
}
每次我重新启动rabbit时,它都会存活下来,因为它从一开始就创建了连接。
现在,我明白我应该与DefaultConsumer合作。
所以我有这个方法

public void handleDelivery(...) throws IOException {
}
我的问题是:

  • 我无法捕获内部异常并重新创建连接
  • 这仅在ack失败时恢复。如果在流程的另一个阶段失败怎么办? 如何恢复这些故障?
    谢谢
    您应该更新到RabbitJava客户端的3.3.0版本。最后,它们增加了对拓扑的重新连接和重新声明的支持

    您只需在设置
    连接工厂时设置此选项即可:

    ...
    connectionFactory.setAutomaticRecoveryEnabled(true);
    connectionFactory.setTopologyRecoveryEnabled(true);
    ...
    

    您应该更新到RabbitJava客户端的3.3.0版本。最后,它们增加了对拓扑的重新连接和重新声明的支持

    您只需在设置
    连接工厂时设置此选项即可:

    ...
    connectionFactory.setAutomaticRecoveryEnabled(true);
    connectionFactory.setTopologyRecoveryEnabled(true);
    ...
    

    这是一个很好的问题,第一个代码可以工作,因为它是同步的和阻塞的,您可以捕获错误然后决定。第二,你必须改变开发系统的方式。。。更多事件驱动:)!,您应该使用连接关闭事件来了解连接状态。无论如何,如果你没有得到答案,我会准备一个简单的例子。这是一个好问题,第一个代码是有效的,因为它是同步和阻塞的,你可以捕捉错误然后决定。第二,你必须改变开发系统的方式。。。更多事件驱动:)!,您应该使用连接关闭事件来了解连接状态。无论如何,如果你没有得到答案,我会准备一个简单的例子。那么,它是否也恢复了通道状态?是的,我认为它恢复了。我创建了这段代码来测试它:在强制关闭连接后,我可以使用所有消息,并且不会丢失任何消息。谢谢hecktor!!谢谢你的推荐。顺便说一句:我想知道Rabbit Lyra现在有什么好处。@最主要的是Java amqp客户端恢复只有在连接失败时才会启动。Lyra将从任何故障中恢复,包括通道故障或使用者故障,当然它提供了灵活的恢复策略,用于指示恢复应如何进行。@Jonathan,Java amqp客户端可以恢复队列、交换、绑定和使用者(客户端除外)。你好,hector,我还没有尝试过。那么,它是否也恢复了通道状态?是的,我认为它恢复了。我创建了这段代码来测试它:在强制关闭连接后,我可以使用所有消息,并且不会丢失任何消息。谢谢hecktor!!谢谢你的推荐。顺便说一句:我想知道Rabbit Lyra现在有什么好处。@最主要的是Java amqp客户端恢复只有在连接失败时才会启动。Lyra将从任何故障(包括通道故障或使用者故障)中恢复,当然,它还提供了灵活的恢复策略,用于指示恢复应如何进行。@Jonathan,Java amqp client可以恢复队列、交换、绑定和使用者(客户端除外)。