如何在rabbitmq中汇集频道?

Los*_*oul 9 java multithreading 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
Run Code Online (Sandbox Code Playgroud)

Rom*_*man 8

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

RabbitMQ 建议您为每个线程使用通道,这样就可以完美匹配。

示例代码:

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

无需关闭通道,因为当连接关闭时它们将被您的应用程序关闭。

但是,如果您大量创建新线程,则此解决方案可能不太适合您,因为这将分配许多永远不会关闭的新通道。但如果你这样做,你可能做错了什么。


Bri*_*ach 6

您所需要的只是一个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