RabbitMQ-使用DefaultConsumer在使用者断开连接后生存
使用java客户机QueueingConsumer,我编写了以下代码来帮助客户恢复RabbitMQ-使用DefaultConsumer在使用者断开连接后生存,rabbitmq,Rabbitmq,使用java客户机QueueingConsumer,我编写了以下代码来帮助客户恢复 while (true) { try{ .. create connection .. create channel & queue while (true) { final QueueingConsumer.Delivery delivery = consumer.nextDelivery(); ....
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 {
}
我的问题是:
谢谢李>
您应该更新到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可以恢复队列、交换、绑定和使用者(客户端除外)。