4

/spawn 新しい Java スレッドを MDB 内から開始できますか? MDB のコードからいくつかの並列処理を実行してから、コントロールを MDB に戻す必要があります。

要件: メッセージが MDB に到着し、コードの処理が行われます。次に、いくつかの並列作業を行う 2 つの新しいスレーブ スレッドが開始されます。それまでMDBは待っています。スレッドが作業を終了したとき。その後、制御が MDB に戻され、関連する最終/クリーンアップ作業が完了します。

MDB から新しいスレッド (Runnable) を開始するのは良い考えですか? そうでない場合、代替手段は何ですか?

4

4 に答える 4

2

スレッドでトランザクション作業を実行している場合、それは悪い考えです。

EJB コンテナによって開始されたトランザクションで現在作業を実行しているスレッドは、トランザクション コンテキストに関連付けられます。あなたの場合、MDB の onMessage メソッドが新しいトランザクションを開始し (NotSupported 記述子を指定していない限り)、このトランザクションを実行するスレッドはトランザクション コンテキストに関連付けられます。新しいスレッドを開始しても、トランザクション コンテキストは子スレッドに伝播されません。これにより、子スレッドがトランザクション コンテキストなしでトランザクション リソースにアクセスしようとしていることをコンテナが検出すると、新しいトランザクションが作成されます。

一部の (またはほとんどの) トランザクション マネージャーは、同じトランザクション コンテキストを所有する複数のスレッドの存在をサポートしていますが、これは、アプリケーションによって開始されたスレッドには適用されない可能性があります (ほとんどの場合、適用されません)。

于 2011-06-07T14:03:32.703 に答える
1

MDB からスレッドを開始すると、仕様に違反します。

Enterprise JavaBeansTM、Version 3.0、EJB Core Contracts and Requirements のセクション 21.1.2 プログラミングの制限:

  • エンタープライズ Bean は、複数のインスタンスの実行を同期するためにスレッド同期プリミティブを使用してはなりません。

  • エンタープライズ Bean は、スレッドの管理を試みてはなりません。エンタープライズ Bean は、スレッドの開始、停止、一時停止、再開、またはスレッドの優先順位や名前の変更を試みてはなりません。エンタープライズ Bean は、スレッド グループの管理を試みてはなりません。

于 2011-06-07T14:24:43.907 に答える
1

MDB で新しいスレッドを開始するのは悪い習慣です。これは機能しますが、新しいスレッドはアプリケーション コンテナーを制御できないため、予期しない動作をする可能性があります。コンテナが維持しようとしているスレッド管理を台無しにすることさえあります。最悪の影響は、アプリケーションがクラスターにデプロイされている場合、ユーザー定義のスレッドがひどく失敗することです。

あなたのシナリオでは:新しいスレッドを開始する代わりに、スレッドのロジックで新しいMDBを作成し(このようにしてコンテナによって管理されます)、これらの新しいMDBにメッセージを送信します。コントロールを親 MDB に戻したい場合は、グローバル トランザクションで親 MDB を使用して、親 MDB が子 MDB が終了するのを待ち、コントロールが戻るようにします。

于 2011-06-08T16:45:42.853 に答える
1

Java EE と MDB の要点を根本的に見逃しています。

Java EE コンテナーは、管理されたランタイム環境です。Java EE コンテナーの背後にある基本的な考え方は、トランザクション管理などの特定の直交する問題をコンテナーに委譲することによって、コンポーネントは引き続きビジネス ロジックに焦点を当て、(ユートピアでは) ランタイム環境についてほとんど想定しない再利用可能なコンポーネントになるというものです。

MDB が登場する前は、Java EE コンテナーは、コンテナー側の非同期アクティブ エージェントのアクションを調整する手段を持たないパッシブ リアクティブ システムでした。その後、メッセージ駆動型 Bean はこれに対処し、サーバー側で非同期アクションを開始するための標準的な方法を提供しました。

e0によって消費されるオリジナルのイベントがありMBD0ます。メッセージに対して、は への応答としてメッセージMDB0を生成e1してキューに入れます。MBD1その後、メッセージはその作業を行い、 に msg を送信しますMDB2

そこには、pub/subメッセージング セマンティクス (および非同期セマンティクスを使用した o/c) を使用した n シーケンシャル ステップの単純なワークフローがあり、関連するすべてのスレッドは container によって管理されます。並行アクターが動作し、結果を収集して最終アクションを開始したい場合は、JMSトピックを含むパターンの使用を検討してください。

于 2011-06-07T14:30:48.577 に答える