2016-10-25 7 views
0

私は、マルチスレッド環境(私は複数のコンシューマーを持っている>複数のウサギリスナーコンテナ)でspring amqpのアノテーションベースのアプローチを使用しています。マルチスレッド環境では、受信するrabbitListenerコンポーネント内にスレッドに依存するデータをどこに格納する必要がありますか?

@RabbitListener(queues = "tasks") 
public void receiveMessage(@Payload Task task) { 
    // usage of httpClient here with its own httpContext (would be fine) 
    // this method gets called from different listenerContainers/threads 
} 

注釈付きのreceiveMessage()メソッドを含む私のコンポーネントは、apache httpクライアントで何らかのhttp呼び出しを行う必要があります。私は同時に複数のコンシューマを扱っているので、このメソッドは別のスレッドから呼び出され、Apacheのhttpクライアントのドキュメントによれば、各スレッドがスレッドセーフであるためにはhttpContextを作成する必要があります。すべてのスレッドが同じコンポーネントメソッドを呼び出すので、私はコンポーネントにhttpContextを置くことができません。

httpClientContextを置くことができる各リスナーコンテナのリスナコンテナコンテキストのようなものがありますか?あるいは、誰かがこれを簡単に解決する方法を知っていますか?私はThreadLocalまたはhttpContextsのための中央レジストリについて考えましたが、これがより簡単なのであれば問題ありません。

答えて

1

フレームワークで提供されているようなものはありません。一番簡単な解決策は、LinkedBlockingQueueのようなものにそれらを保存し、それをチェックし、それを使用して、完了したらそれをキューに戻すことです(キューが空の場合は必要に応じてキューを作成します)。

ThreadLocalでも動作しますが、私はプールを使用することをお勧めします。

関連する問題