RabbitMQ:查找由于消费者异常而导致频道关闭的原因

时间:2018-09-27 12:38:56

标签: java rabbitmq amqp

我有一个使用RabbitMQ Java client library创建的RPC服务器,并且在使用消息时收到以下错误:

com.rabbitmq.client.ShutdownSignalException: clean channel shutdown; protocol method: #method<channel.close>(reply-code=200, reply-text=Closed due to exception from Consumer (amq.ctag-CAqHaJnRsaP6dfovPnR8lw) method handleDelivery for channel AMQChannel(amqp://guest@127.0.0.1:5672/,1), class-id=0, method-id=0)
    at com.rabbitmq.client.impl.ChannelN.close(ChannelN.java:588)
    at com.rabbitmq.client.impl.ChannelN.close(ChannelN.java:541)
    at com.rabbitmq.client.impl.StrictExceptionHandler.handleChannelKiller(StrictExceptionHandler.java:72)
    at com.rabbitmq.client.impl.StrictExceptionHandler.handleConsumerException(StrictExceptionHandler.java:61)
    at com.rabbitmq.client.impl.ConsumerDispatcher$5.run(ConsumerDispatcher.java:154)
    at com.rabbitmq.client.impl.ConsumerWorkService$WorkPoolRunnable.run(ConsumerWorkService.java:104)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)

但是,仅当我在RPC客户端实现中进行了某些更改时,才会发生这种情况,否则RPC服务器可以正常工作。无论是否发生错误,客户端发送的消息始终是相同的。

RabbitMQ日志未提及有关通道关闭的任何信息。

我如何更详细地了解导致频道关闭和使用者异常的原因?

编辑

以下是创建连接,通道和使用者的代码。没有其他东西使用此通道,并且每当一条消息从REQUEST_QUEUE发送到此代码时,就会发生上述错误。

public static void main(String[] args) {
    ConnectionFactory factory = new ConnectionFactory();
    factory.setHost("localhost");
    try {
        Connection connection = factory.newConnection();
        channel = connection.createChannel();
        channel.queueDeclare(REQUEST_QUEUE, false, false, true, null);
        channel.basicConsume(REQUEST_QUEUE, true, RpcServer::onMsgReceived, RpcServer::onCancel);
        channel.addShutdownListener(new ShutdownListener() {
            @Override
            public void shutdownCompleted(ShutdownSignalException cause) {
                cause.printStackTrace();
            }
        });
        System.out.println("Waiting for RPC requests");
    } catch (IOException | TimeoutException e) {
        e.printStackTrace();
    }
}

1 个答案:

答案 0 :(得分:0)

这可能是因为默认情况下您的连接配置为使用com.rabbitmq.client.impl.StrictExceptionHandler

如果您不希望在发生异常的情况下关闭通道,则可能需要编写自己的异常处理程序,或者使用com.rabbitmq.client.impl.ForgivingExceptionHandler

还请注意,默认情况下,连接将使用com.rabbitmq.client.impl.DefaultExceptionHandler,它扩展了 com.rabbitmq.client.impl.StrictExceptionHandler

还有一件事。您可以使用 setExceptionHandler 方法在连接工厂中设置异常处理程序。