5

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

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

4

3 回答 3

6

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

于 2016-11-16T18:39:17.360 回答
0

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

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

于 2014-06-23T11:56:09.390 回答
0

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

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

         // 320: connection-forced
         channel.Close(320, "Service stopped");
     }
于 2016-07-14T15:41:22.220 回答