13

私はスレッド間の接続を共有しようとしており、スレッドの作成時にのみチャンネルを開いていますが、もう少し調査した後、私も試してみたいと思いますconnection pooling. rabbitmq でこれを行うにはどうすればよいですか? それとも、これは私が一般的に適用できる一般的なアイデアですか?私の目標は、X スレッドを生成し、新しいチャネルを開く必要がないようにすることです (これには、クライアントとサーバー間のラウンド ロビンの確立が必要です)。

スレッドは独自のクラスであるため、スレッドを生成するクラス自体にプールを配置する必要があるのか​​ 、それともスレッドがどこに移動するのかがわかりません。また、これらの接続を共有したい複数のタイプのスレッドがあります( 1つだけ)。それは可能ですか?

一般的な考え方を示すために、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

チャネルを使用する場合は、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 に答える
8

必要なのは、Channelスレッドがプルできるオブジェクトのプールだけです。

ObjectPoolApache コモンズには、実際に使用できるジェネリックが既に含まれています。

インターフェイスの javadoc は、http: //commons.apache.org/pool/api-1.6/org/apache/commons/pool/ObjectPool.htmlにあります。

ビルド済みの実装の 1 つの Javadoc は、http: //commons.apache.org/pool/api-1.6/org/apache/commons/pool/impl/GenericObjectPool.htmlにあります。

それを使用するためのチュートリアルはここにあります: http://commons.apache.org/pool/examples.html

単純なニーズに対してこれが複雑すぎる場合、実際に行う必要があるのは、一連のChannelオブジェクトを管理するクラスを作成し、スレッドがそれらをチェックアウトしてプールに返すことを可能にし、適切な同期を使用して 2 つのスレッドが同期されないようにすることです。同じことを理解するChannel

于 2012-04-28T17:36:56.600 に答える