用RabbitMQ使用者暂停骆驼路线会触发AlreadyClosedException

时间:2019-08-27 16:34:30

标签: java rabbitmq apache-camel

我在Spring Boot应用程序上工作,并使用Camel和RabbitMQ处理一些消息传递和处理。我有一条由多个处理器组成的路由,并且其中一个处理器中有一个条件可以使用控制总线挂起路由。

一切正常,除了在路由成功挂起后总是出现以下异常:

com.rabbitmq.client.AlreadyClosedException: connection is already closed due to clean connection shutdown; protocol method: #method<connection.close>(reply-code=200, reply-text=OK, class-id=0, method-id=0)
    at com.rabbitmq.client.impl.AMQChannel.ensureIsOpen(AMQChannel.java:253)
    at com.rabbitmq.client.impl.AMQChannel.transmit(AMQChannel.java:422)
    at com.rabbitmq.client.impl.AMQChannel.transmit(AMQChannel.java:416)
    at com.rabbitmq.client.impl.recovery.RecoveryAwareChannelN.basicAck(RecoveryAwareChannelN.java:93)
    at com.rabbitmq.client.impl.recovery.AutorecoveringChannel.basicAck(AutorecoveringChannel.java:436)
    at org.apache.camel.component.rabbitmq.RabbitConsumer.doHandleDelivery(RabbitConsumer.java:134)
    at org.apache.camel.component.rabbitmq.RabbitConsumer.handleDelivery(RabbitConsumer.java:78)
    at com.rabbitmq.client.impl.ConsumerDispatcher$5.run(ConsumerDispatcher.java:149)
    at com.rabbitmq.client.impl.ConsumerWorkService$WorkPoolRunnable.run(ConsumerWorkService.java:104)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)

通过查看RabbitConsumer类中的代码,我发现问题出在我的端点配置有autoAck = false的事实,这不可避免地导致了行channel.basicAck(...)被调用。但是由于通道现在已关闭,因此无法发送确认,并且会引发异常。 这可能是因为某些消息仍被消耗,直到路由最终挂起。很好,但是我不想例外。

这似乎是无法解决的,但我希望您能给我一些提示,以避免此堆栈跟踪。我必须说我很惊讶,我是唯一遇到此问题的人,因为使用RabbitMQ时试图挂起路由的任何人都应该碰到它。

0 个答案:

没有答案
相关问题