RabbitMQ AMQP Java客户端关闭处理程序的用途是什么? V2

时间:2015-11-18 09:55:40

标签: java rabbitmq

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? (如何?)

1 个答案:

答案 0 :(得分:0)

我猜测关机处理程序最初是为了帮助您从故障中恢复,但事实证明,从手动故障中正确恢复是相当复杂的。使用自动恢复功能或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的内置自动恢复仅关注连接失败,这仍然很好,但对于某些用例可能还不够。