Java 如何在rabbitmq中共享通道?

Java 如何在rabbitmq中共享通道?,java,multithreading,rabbitmq,Java,Multithreading,Rabbitmq,我一直在尝试在线程之间共享连接,并且只在创建线程时打开通道,但在进行了更多研究之后,我想我也想尝试连接池。如何在rabbitmq上执行此操作?或者这是一个我可以普遍应用的一般想法?我的目标是生成X个线程,然后让它们不必打开新通道(这需要在客户端和服务器之间建立循环) 由于线程是它们自己的类,我不确定是否需要将池放在生成线程的类本身中,或者放在它们的位置?我还有多种类型的线程希望在它们之间共享这些连接(而不仅仅是一种连接)。可能吗 为了让您大致了解,以下是如何在rabbitmq中创建连接/通道:

我一直在尝试在线程之间共享连接,并且只在创建线程时打开通道,但在进行了更多研究之后,我想我也想尝试
连接池
。如何在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
对象池,线程就可以从中提取这些对象

apachecommons实际上已经有了一个通用的
ObjectPool
,您可以使用它

该接口的javadoc可在以下位置找到:

其中一个预构建实现的javadoc可以在这里找到:

可以在以下位置找到使用它的教程:

如果这对于您的简单需求来说过于复杂,那么您真正需要做的就是编写一个类来管理一组
Channel
对象,允许线程将它们签出并返回到池中,通过适当的同步,以防止两个线程接触到相同的
通道

,您还可以使用object,以防使用通道

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

示例代码:

private final ThreadLocal<Channel> channels = new ThreadLocal<>();
...
Channel channel = channels.get();
 if (channel == null){
        channel = connection.createChannel();
        channels.set(channel);
    }
private final ThreadLocal channels=new ThreadLocal();
...
Channel=channels.get();
如果(通道==null){
channel=connection.createChannel();
频道。设置(频道);
}
无需关闭通道,因为当连接关闭时,应用程序将关闭通道


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

谢谢,我会研究它以了解更多信息,但是objectpool是否可以在其他类之间共享?假设我有一个上传的类和另一个下载的类,都可以使用来自同一个对象池的通道?@Lostsoul-我已经有一段时间没有玩兔子了,但是如果
Channel
类既用于生产也用于消费,那么是的。我明白这一点,我的意思是多个类可以访问同一个对象池,还是我需要为每个要使用它的类创建对象池?对不起,误解了-池的目的是让所有类都使用它的同一个实例,是的。实现这一点的一般方法是通过依赖注入;让池成为传递给其他对象的构造函数的对象之一。如果不可能的话,你可以让这个池成为一个单独的池,但最好是前者。我认为你需要小心重用通道。如果出现错误(例如,您发布到一个不存在的exchange),那么通道在该点之后就没有用处了。它不应该返回到池中,因为它不能用于进一步的操作,甚至可能无限期地阻塞线程。