我一直在尝试共享线程之间的连接,并且仅在创建线程时才打开通道,但是在进行了更多研究之后,我想我也想尝试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<Channel> channels = new ThreadLocal<>();
...
Channel channel = channels.get();
if (channel == null){
channel = connection.createChannel();
channels.set(channel);
}
无需关闭通道,因为关闭连接后,您的应用程序将关闭它们。
但是,如果您要大量创建新线程,则此解决方案可能不太适合您,因为这将分配很多永远不会关闭的新通道。但是,如果您这样做,可能是您做错了。