2016-07-06 21 views
0

パブリックEJBメソッドへの非同期呼び出しの結果、EJBコンテナのスレッドプールによって割り当てられた別の子スレッドに渡すInheritableThreadLocal変数があります。非同期呼び出しを開始する親の呼び出し元は、ステートレスEJBであるRESTリソースです。 InheritableThreadLocalは、子スレッドが新規作成された場合にのみ、値を子スレッドに渡します。スレッドがプールに作成されると、サーバーがバウンスされるまでスレッドを破壊することはありません。ThreadLocal変数をEJBコンテナに渡すスレッドプール

上記の事実を考慮すると、私のケースの子スレッドは、EJBコンテナによって管理されるスレッドプールから得られます。 InheritableThreadLocalの値を子スレッドに渡すのは、サーバーの起動後に初めてResourceが呼び出された場合、またはスレッドプールで作成されたばかりの新しいスレッドが子スレッドとして割り当てられた場合のみです。他のすべてのケースでは、スレッドが最初に作成されて割り当てられたときに、プールから子スレッドに割り当てられた初期値を取得しています。

IBM WebSphereでコードを実行していて、非同期呼び出しのメソッドパラメータとしてThreadLocal値を渡すことはオプションではありません。

ThreadLocalの値を再割り当てして、実行ごとに子スレッドに割り当てられている現在の値を取得できるようにするにはどうすればよいですか?

以下のリンクは多少似ていますが、私の場合、ThreadPoolはEJBコンテナによって提供されるものです。

Propagating ThreadLocal to a new Thread fetched from a ExecutorService

+0

回答が得られない場合は、コードスニペットを追加することをおすすめします。そうすれば、誰かが正しく読んでいるかどうかを簡単に確認できます。 –

答えて

0

にThreadLocalを使用すると、移植可能な方法ではありません。コンテナがどのようにスレッドを処理するかを正確に知る必要があります。

私の見解から、ThreadLocalはコンテナが同じスレッドを使用して、同期Servler/REST/EJB呼び出しのシーケンスを処理するために一般的に保存されます。 Asyncが起動した場合、これは機能しません。

私はパラメータや永続性のような移植可能な方法を使用します。

関連する問題