关闭空闲/悬空通道
我有一个多线程应用程序,它将传入的消息发布到rabbitmq交换机。 使用rabbitmq java客户端,我在应用程序启动时创建一个rabbitmq连接,并在所有线程中共享它。 每个线程都会创建一个新的通道(threadlocal),以便通过rabbitmq文档所推荐的方式不会在多个线程之间共享通道。 我正在使用netty,我看到与netty通道管道线程创建的rabbitmq通道数量相同。 到现在为止还挺好。
但是,我的网络线程上有2分钟的活期(我需要这个,不能改变它)。 所以,如果一个线程闲置2分钟就会死掉。 但是,与该线程关联的通道不会被终止,并且在连接关闭之前保持空闲状态。 因此,我得到越来越多的IDLE频道,并且永远不会关闭。 在rabbitmq文档中,我没有看到解决悬挂频道问题的任何内容。 有没有办法让我关闭一段闲置一段时间的频道? 如果没有,解决这个问题的最佳选择是什么?
实际上,由于通道绑定到连接,因此无法从Web控制台关闭通道。 所以你可以做的是去Connections
选项卡,点击连接(它与通道具有相同的ID,因此很容易识别),并在打开的页面上单击Force Close
您可以使用RabbitMQ Management 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");
}
链接地址: http://www.djcxy.com/p/34097.html
上一篇: Close Idle/dangling channels
下一篇: How can I recover unacknowledged AMQP messages from other channels than my connection's own?