14

Web アプリケーションと ejb アプリケーションが同じマシン (同じ JVM) 上にあり、すべての ejb 呼び出しがローカル呼び出しである場合、 を使用すると、ThreadLocalWeb から ejb に情報を渡すときに問題が発生しますか?

ejb 呼び出しがリモートの場合の回避策はありますか? ThreadLocalWeb アプリケーションから EJB アプリケーションまで情報を利用できますか? そのようなシナリオでは を使用することをThreadLocalお勧めしますか?

4

7 に答える 7

14

最初の質問については、すべての呼び出しの最後に ThreadLocal 変数を削除する限り、問題はありません。コンテナー (サーブレットまたは ejb) は通常、スレッドプールを使用してスレッドを再利用するため、これは重要です。これには 2 つの効果があります。1 つの「呼び出し」で、以前の呼び出しからのスレッドローカル情報が表示される可能性があり、JVM を停止せずにコンテナーからアプリを削除した場合です。一部のクラスは、まだコンテナー スレッドによって参照されているため、ガベージ コレクションされない場合があります。したがって、データをスレッドローカルの try / finally ブロックに入れ、finally 部分で削除します。

この問題を処理する 1 つの方法を示す投稿を次に示します: Web アプリケーションの ThreadLocal

2番目の質問については、データがスレッドローカルであるため、リモート呼び出しには付属していません。インターフェイスにパラメーターを追加し、一方の側でスレッドローカルデータを抽出し、もう一方の側で再作成する必要があります...

于 2012-04-26T07:00:10.730 に答える
3

EJB 3.1 を使用すると、コンテキスト データを使用してEJBContext内のコンテキスト情報を渡すことができます。これは単なる.Map<String,Object>

于 2013-01-30T10:19:42.137 に答える
3

ThreadLocal は EJB コンテキストでは使用しないでください。EJB メソッドの呼び出しがすべて同じスレッド上で行われることを保証することはできません (もちろんそうすべきです)。

EJB には、 TransactionSyncrhonizationRegistryを呼び出す別のアプローチがあります。詳細については、説明/使用法を参照してください。

于 2013-05-03T07:14:40.917 に答える
2

すべての ejb 呼び出しはローカル呼び出しです。ThreadLocal を使用すると問題が発生します。

いいえ、あなたは自分で質問に答えました。呼び出しはローカルであるため、1 つのスレッドのコンテキストで実行されます。

ejb 呼び出しがリモートの場合の回避策はありますか?

リモート呼び出しの場合、Java EE コンテナーは別の JVM で実行され、着信 RMI 要求を処理するために独自のスレッドを生成します。リモート Java EE コンテナーが宣言されたスレッド ローカル変数を認識する方法はありません。反対側。パラメーター オブジェクトとして渡します。

于 2012-04-26T07:01:03.223 に答える
0

渡す情報によって異なります。最初の質問はあまりにも一般的です。ここでThreadLocal に関連する JavaDoc を読むことをお勧めします。

ThreadLocal はアプリケーションのサーバー側に存在し、Thread オブジェクトの呼び出しをスレッドセーフにするために使用されます。

于 2012-04-26T06:51:16.590 に答える
0

ローカル呼び出しの場合、ThreadLocalすべてが同じスレッドで行われる限り、 は正常に機能するはずです。

別のサーバーで実行される可能性があるリモート呼び出しの場合は、何か別のものを考え出す必要があります。すべての値をパラメーターとして渡す (これは機能しますが、コードが複雑になります) か、すべてのクラスター ノードがアクセスできるglobal のように機能する、Hazelcastなどの分散キャッシュのようなものを使用します。HashMap

于 2012-04-26T07:05:10.093 に答える