Multithreading RabbitMQ-关闭空闲/悬挂通道

Multithreading RabbitMQ-关闭空闲/悬挂通道,multithreading,rabbitmq,netty,channels,Multithreading,Rabbitmq,Netty,Channels,我有一个多线程应用程序,它将传入的消息发布到rabbitmq交换。使用rabbitmq java客户机,我在应用程序启动时创建一个rabbitmq连接,并在所有线程之间共享它。每个线程创建一个新的通道(threadlocal),这样通道就不会按照rabbitmq文档的建议在多个线程之间共享。我正在使用netty,我看到创建的rabbitmq通道数与netty通道管道线程数相同。到目前为止还不错 然而,我在netty线程上有一个2分钟的保持活动时间(我需要这个,不能更改它)。因此,如果一个线程空闲

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


然而,我在netty线程上有一个2分钟的保持活动时间(我需要这个,不能更改它)。因此,如果一个线程空闲2分钟,它就会死掉。但是,与线程关联的通道不会被终止,并且在连接关闭之前保持空闲状态。因此,我得到了一个不断增加的空闲通道列表,这些通道从未关闭过。我在rabbitmq文档中没有看到任何解决悬空通道问题的内容。有没有办法关闭一段时间闲置的频道?如果没有,解决此问题的最佳替代方案是什么?

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


请看这里:

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

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

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

实际上,无法从web控制台关闭该频道,因为该频道已绑定到连接。因此,您可以做的是转到
连接
选项卡,单击连接(它与频道具有相同的id,因此很容易识别),然后在打开的页面上单击
强制关闭

如何关闭频道?也许您链接的页面已更改,但截至2015年10月16日,它只显示列出频道的方法,没有显示关闭频道的方法。我不记得管理API是否允许您终止单个频道或整个连接。无论如何,作为一名黑客,你可以找到频道的Erlang PID并杀死itThanks以获得建议!我可以在管理员和api中找到关闭连接的方法,但不能关闭单个通道。要关闭通道,可能需要编写一些erlang代码。通道只是Erlang进程。您找到解决方案了吗?我也有同样的问题。。。。