RabbitMQ - 关闭空闲/悬空通道

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RabbitMQ - 关闭空闲/悬空通道相关的知识,希望对你有一定的参考价值。

我有一个多线程应用程序,它将传入的消息发布到rabbitmq交换。使用rabbitmq java客户端,我在应用程序启动时创建一个rabbitmq连接,并在我的所有线程中共享它。每个线程都会创建一个新通道(threadlocal),以便不按照rabbitmq文档的建议在多个线程之间共享通道。我正在使用netty,我看到相同数量的rabbitmq通道被创建为netty通道管道线程。到现在为止还挺好。

但是,我的netty线程有2分钟的保持活动时间(我需要这个并且不能改变它)。因此,如果一个线程闲置2分钟就会死掉。但是,与线程关联的通道不会被终止,并且在连接关闭之前保持空闲状态。因此,我得到了越来越多的IDLE通道,永远不会关闭。我没有在rabbitmq文档中看到任何解决悬空频道问题的内容。我有办法关闭一段闲置一段时间的频道吗?如果没有,解决这个问题的最佳方法是什么?

答案

实际上,由于通道绑定到连接,因此无法从Web控制台关闭通道。所以你可以做的是转到Connections选项卡,点击连接(它与通道具有相同的ID,因此很容易识别)并在打开的页面上单击Force Close

另一答案

您可以使用RabbitMQ管理HTTP API并列出通道,然后列出自通道空闲时您可以看到的每个通道的详细信息,并做出相应的反应,例如关闭通道。

见这里:http://hg.rabbitmq.com/rabbitmq-management/raw-file/3646dee55e02/priv/www-api/help.html

另一答案

我有类似的要求。已经有一段时间了,所以我不记得我在哪里找到了有关它的信息。但这就是我关闭频道的方式。

    if (cancellationToken.IsCancellationRequested)
    {
         logger.InfoFormat("Cancellation requested, stopping case processor.");

         // 320: connection-forced
         channel.Close(320, "Service stopped");
     }

以上是关于RabbitMQ - 关闭空闲/悬空通道的主要内容,如果未能解决你的问题,请参考以下文章

AnyEvent::RabbitMQ 关闭通道的问题

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

WSO2 rabbitMQ - 创建但未关闭的通道 - 内存泄漏问题

SpringCloud系列十一:SpringCloudStream(SpringCloudStream 简介创建消息生产者创建消息消费者自定义消息通道分组与持久化设置 RoutingKey)(代码片段

在 BasicAcks 中关闭 RabbitMQ 通道

初尝RabbitMQ消息队列