我怎样才能在rabbitmq中汇集频道?

我一直在尝试在线程之间共享连接,并且只在创建线程时才打开通道,但在研究了一点之后,我想我也想尝试connection pooling 。 我怎么能在rabbitmq上做到这一点? 或者这是一般性的想法我可以普遍适用吗? 我的目标是生成X线程,然后让它们不必打开新的通道(这需要在客户端和服务器之间建立循环)。

由于线程是它们自己的类,我不确定是否需要将池放入生成线程的类本身或它们去哪里?我还有多种类型的线程我想要在它们之间共享这些连接(不是只是一个)。 那可能吗?

为了给你一个大致的想法,这里是如何在rabbitmq中建立连接/渠道:

 ConnectionFactory factory = new ConnectionFactory(); factory.setHost("localhost"); Connection connection = factory.newConnection(); Channel channel = connection.createChannel(); //I want to share several of these between threads 

您所需要的只是一个Channel对象池,您的线程可以从中提取。

Apache commons实际上已经有了一个可以使用的通用ObjectPool

接口的javadoc可以在这里找到: http : //commons.apache.org/pool/api-1.6/org/apache/commons/pool/ObjectPool.html

可以在此处找到其中一个预构建实现的javadoc: http : //commons.apache.org/pool/api-1.6/org/apache/commons/pool/impl/GenericObjectPool.html

可以在此处找到使用它的教程: http : //commons.apache.org/pool/examples.html

如果这对于您的简单需求来说过于复杂,那么您真正需要做的就是编写一个管理一组Channel对象的类,允许线程将它们检出并将它们返回到池中,并通过适当的同步来防止两个线程从获得相同的Channel

如果使用通道,也可以使用ThreadLocal对象。

RabbitMq建议您使用每个线程的通道,这样就完美匹配了。

示例代码:

  private final ThreadLocal channels = new ThreadLocal<>(); ... Channel channel = channels.get(); if (channel == null){ channel = connection.createChannel(); channels.set(channel); } 

无需关闭通道,因为当连接关闭时,应用程序将关闭它们。 虽然如果你大量创建新线程,这个解决方案可能不适合你,因为这将分配许多永远不会被关闭的新频道。 但如果你这样做,你可能做错了什么。