我有一个使用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();
}
}
答案 0 :(得分:0)
这可能是因为默认情况下您的连接配置为使用com.rabbitmq.client.impl.StrictExceptionHandler。
如果您不希望在发生异常的情况下关闭通道,则可能需要编写自己的异常处理程序,或者使用com.rabbitmq.client.impl.ForgivingExceptionHandler。
还请注意,默认情况下,连接将使用com.rabbitmq.client.impl.DefaultExceptionHandler,它扩展了 com.rabbitmq.client.impl.StrictExceptionHandler 。
还有一件事。您可以使用 setExceptionHandler 方法在连接工厂中设置异常处理程序。