我如何在Rabbitmq中合并频道?

问题描述 投票:9回答:2

我一直在尝试共享线程之间的连接,并且仅在创建线程时才打开通道,但是在进行了更多研究之后,我想我也想尝试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
java multithreading rabbitmq
2个回答
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


5
投票

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

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

示例代码:

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.