我一直在尝试在线程之间共享连接,并且只在创建线程时打开通道,但经过更多的研究后,我想我也想尝试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
答案 0 :(得分: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
答案 1 :(得分:3)
如果您使用频道,也可以使用ThreadLocal对象。
RabbitMq建议您使用每个线程的通道,这样就可以完美匹配。
示例代码:
private final ThreadLocal<Channel> channels = new ThreadLocal<>();
...
Channel channel = channels.get();
if (channel == null){
channel = connection.createChannel();
channels.set(channel);
}
无需关闭通道,因为当连接关闭时,应用程序将关闭它们。 虽然如果你大量创建新线程,这个解决方案可能不适合你,因为这将分配许多永远不会被关闭的新频道。但如果你这样做,你可能做错了。