7

私が理解していることから、EJBのライフサイクルに干渉する可能性があるため、EJB内からスレッドを生成することは違法です。ただし、EJB、特にMDB内でExecutorなどのスレッドを内部で生成および処理するJDKから事前定義されたJavaクラスを使用することは違法ですか?

4

4 に答える 4

11

これが EJB 3.1@Asynchronousの目的であり、Executor の代わりに使用する必要があります。一般に、コンテナーのスレッド プールと競合することは非常に危険です。そうすることは、パフォーマンスを低下させる素晴らしい方法です。

サポートはコンテナーのAsynchronousスレッド プールを使用するため、はるかに安全です。仕組みの詳細については、この回答を参照してくださいAsynchronous

于 2012-02-26T05:14:55.617 に答える
11

スレッド、スレッドプール、エグゼキューターなど、上記のすべてを「使用できません」(すべきではありません)。アプリ サーバーを使用するポイントは、ビジネス ロジックのみを記述し、面倒な作業はアプリ サーバーに任せることです。本当に本当に独自のスレッド化が必要な場合は、EJB 3.1 の「シングルトン」サービスを使用してスレッド化を管理してください。ただし、他の人が述べたように、これはアプリ サーバーに任せるのが最善です。アプリ サーバーで並列処理を行う 1 つの方法は、MDB を使用することです (既に使用されているようです)。ただし、並列処理の種類によっては、MDB が重すぎる場合があります。

于 2011-01-03T20:59:16.313 に答える
6

スレッドと EJB の最大の問題は、スレッドがコンテナーによって頻繁に使用される限られたリソースであり、スレッドの誤りが原因でスレッド プール リークが発生し、JVM インスタンス全体が事実上停止する可能性があることです。

Executorはより適切に動作するはずですが、それでもある程度の時間スレッドを使い果たします。また、利用可能なスレッドを使い果たすように誰かがコンテナーを調整した場合にも、すぐに失敗する可能性があります。

要約すると、綱渡りになるということです。

于 2011-01-03T19:47:14.510 に答える
1

@Charlie Martin の回答に追加するには、Executor が必要とするものは何でも、Executor なしで同じアクションを実行するように別の EJB を設計できます。これにより、コンテナによって処理される別のスレッドで新しい EJB を実行できます。欠点は、JVM からスレッド/エグゼキューターを使用したくないため、「ホイールを再実装」する必要がある場合があることです。また、1 つの EJB が別の EJB を検索/要求/接続/呼び出しするためのオーバーヘッドも増加します。

要するに、EJB はそれ自体がワーカー スレッドであると想定されているということです。Executor を使用する代わりにコードを複製するのはやり過ぎのように思えるかもしれませんが、それはある程度までです。最大の違いはスケールの 1 つです。エグゼキューターは単一の JVM に制限されますが、EJB は JVM 間およびサーバー間でスケーリングできます。

于 2011-01-03T20:02:46.907 に答える