我有一个多线程应用程序,它将传入的消息发布到rabbitmq交换。使用rabbitmq java客户端,我在应用程序启动时创建一个rabbitmq连接,并在我的所有线程中共享它。每个线程都会创建一个新通道(threadlocal),以便不按照rabbitmq文档的建议在多个线程之间共享通道。我正在使用netty,我看到相同数量的rabbitmq通道被创建为netty通道管道线程。到现在为止还挺好。
但是,我的netty线程有2分钟的保持活动时间(我需要这个并且不能改变它)。因此,如果一个线程闲置2分钟就会死掉。但是,与线程关联的通道不会被终止,并且在连接关闭之前一直处于空闲状态。因此,我得到了越来越多的IDLE通道,永远不会关闭。我没有在rabbitmq文档中看到任何解决悬空频道问题的内容。我有办法关闭一段闲置一段时间的频道吗?如果没有,那么解决这个问题的最佳方法是什么?
答案 0 :(得分:4)
实际上,由于频道绑定到连接,因此无法从Web控制台关闭频道。所以你可以做的是转到Connections
标签,点击连接(它与频道的ID相同,因此很容易识别),在打开的页面上点击Force Close
答案 1 :(得分:0)
您可以使用RabbitMQ管理HTTP API并列出频道,然后列出自频道空闲时您可以看到的每个频道的详细信息,并做出相应的反应,例如关闭频道。
见这里:http://hg.rabbitmq.com/rabbitmq-management/raw-file/3646dee55e02/priv/www-api/help.html
答案 2 :(得分:0)
我有类似的要求。已经有一段时间了,所以我不记得我在哪里找到了有关它的信息。但这就是我关闭频道的方式。
if (cancellationToken.IsCancellationRequested)
{
logger.InfoFormat("Cancellation requested, stopping case processor.");
// 320: connection-forced
channel.Close(320, "Service stopped");
}