13

我一直在尝试共享线程之间的连接,并且仅在创建线程时才打开通道,但经过更多研究后,我想我也想尝试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
4

2 回答 2

8

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

于 2012-04-28T17:36:56.600 回答
8

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

RabbitMQ 建议您在每个线程中使用通道,这将是一个完美的匹配。

示例代码:

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

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

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

于 2013-11-04T10:47:29.510 回答