What is the purpose of RabbitMQ AMQP Java client shutdown handlers?
被接受的答案仍然有效吗?如果服务器丢失,则抛出ShutdownSignalException,因此我们“了解连接/通道关闭”。
此外,从3.3.0版本开始,有了自动恢复功能。这是否意味着不再需要添加我自己的ShutdownListener?(因此Lyra库不再有用了吗?)
我的用例是我向rabbitmq集群发送消息,当我停止我的客户端所连接的节点时,basicPublish抛出一个ShutdownSignalException。我捕获它并等待,直到客户端连接到另一个rabbitmq节点。(如果我等待,客户端将自动连接),如下所示:
public void sendMessageToQueue(BasicProperties properties, Model model, String routingKey) {
try {
channel.basicPublish("exchange", routingKey, properties, message.getBytes());
} catch (ShutdownSignalException e) {
resend(properties, model, routingKey);
}
}
private void resend(BasicProperties properties, Model model, String routingKey){
int triedToConnect = 0;
while (triedToConnect < 3) {
try {
Thread.sleep(1000);
if(channel.isOpen()){
sendMessageToQueue(properties, model, routingKey);
break;
} else {
triedToConnect++;
}
} catch (InterruptedException e1) {
e1.printStackTrace();
}
}
if(triedToConnect == 3){
System.exit(1);
}
}但我在很多地方都叫basicPublish,basicConsume。我会包装这些方法调用,以便捕获所有SSE并等待,直到重新连接发生,然后重试发送。
这是正确的方法吗?还是我应该使用ShutdownListeners?(如何?)
发布于 2016-01-06 11:58:50
我猜关闭处理程序最初的目的是帮助您从故障中恢复,但事实证明,手动从故障中正确恢复相当复杂。使用自动恢复功能或Lyra是处理此问题的唯一好方法。关闭监听程序对于您可能想要执行的其他操作非常有用,例如与关闭相关的资源、日志消息等。在Lyra中,与关闭监听程序有点类似的事件可用于恢复和重新建立某些类型的资源,这些资源不能自动恢复,如RpcClients:
https://github.com/jhalterman/lyra/wiki/Lyra-Cookbook#recoverable-rpcclient
对于Lyra与amqp-client,Lyra提供了一些额外的功能,如事件和重试(可以帮助重新发送),但它也主要专注于恢复,并从可能发生的每一种类型的故障中恢复,包括连接、通道和消费者故障。
https://github.com/jhalterman/lyra/wiki/Failure-Scenarios
amqp-client的内置自动恢复只关注连接故障,这仍然很棒,但对于某些用例来说可能还不够。
https://stackoverflow.com/questions/33776794
复制相似问题