2012-02-01 6 views
6

私はので、私はEJB環境での正しい方法を、次のことを行う方法がわからない、EJBコンテナにスレッドをいじくりてはいけない知っている:関与EJB環境で.wait()や.notify()のように動作するものはありますか?

です:

  • ステートレスセッション豆 "クライアント" "キュー" からのメッセージを処理
  • ステートレスSession Bean "サーバー"
  • メッセージキュー "キュー"
  • メッセージドリブンBeanの "MDB"
  • Wnはスルー
  • NステートレスセッションBean W1を

シナリオある:次にキューにいくつかのメッセージを送信サーバのメソッドを呼び出し

クライアント。その後、サーバは他にもいくつかあります。その間に、Mdbがメッセージを消費し、かなり遅い計算を行うWiを呼び出し、結果を取得します。今すぐMdb結果はサーバになります。 サーバが送信したすべてのメッセージのすべての「結果」が得られた場合、Wの結果をさらに計算し、その結果をクライアントに返します。

私の問題

のJava SEでは、私は単にサーバーを送った後、作業を​​した後、W秒の結果をサーバー待機を持っている)(.WAITを行うだろうメッセージ。その後、mdbは結果を設定したときに.notify()になります。私はEJBコンテナでスレッド化する必要はありません。仕様通り、EJB環境で同じ動作を実現するための適切な方法が見つからなかったため、失われてしまいました。

この問題に関するお手伝いは、事前に感謝します。

P .: JBoss 5.1.0でこの問題に取り組むベンダー固有の対策がある場合に備えています。

答えて

4

これに対する適切な解決策は、メッセージングの「要求/応答」パターンです。簡単に言えば、メッセージを送信して応答メッセージ(これはすべてJ2EEの世界では合法です)を待つことで、メッセージングシステムを介して「同期」操作を行うことができます。実際にこれを実現する方法はさまざまですが、一般的な考え方では、一意の識別子を使ってリクエストメッセージを送信した後、リクエストIDに対してメッセージフィルタセットを使用してレスポンスメッセージを待つことです送信されました(これは一般に"correlationId" fieldが使用されているものです)。 MDBは要求メッセージを取得して処理し、要求メッセージから指定された一意の識別子を使用して応答メッセージを送信します。 1つのキューでこれをすべて実行することも、別々の要求/応答キューを使用することもできます。または、"temporary" response queues(リクエストごと)の作成などの狂気のことを行うこともできます。 Message.setJMSReplyToメソッドを使用して要求メッセージを送信する場所をMDBに伝えることができます。

一般的なパターンは次のとおりです。

  1. クライアントがサーバー
  2. サーバーを呼び出します。
    1. は、メッセージを作成し、correlationIdにとのreplyTo
    2. はQueueSenderのを作成し設定し、(
  3. MDBメッセージを送信各メッセージについて繰り返す):
    1. メッセージを
    2. プロセスメッセージを受信
    3. はcorrelationIdのと
  4. サーバ応答メッセージを送信する:すべてのメッセージまで
    1. はcorrelationIdにしてメッセージフィルタを作成
    2. メッセージセレクタとにQueueReceiver作成
    3. コールを受信され処理される(またはタイムアウトする)

クライアントに応答し、最終処理を行う(、明らかサーバは4段階にステップ2から直接進み、私はちょうどそれを制御フローを強調するために、このように書いた。)

+0

それは私が考えたものに似ていますが、私の最大の問題は「応答メッセージを待つ」という部分です。それは私がSEで待機通知を使用する場所です。だから私はMDBsと実際の待機のメカニズムを探しています。あなたはそれについてヒントを持っていますか? – Daniel

+1

@Daniel - あなたはMessageConsumerをセットアップし、それに 'receive()'を呼び出すでしょう。これは方程式の「待機」部分です。最終的な処理にはMDBを使用せず、分散作業のみを使用しています。 – jtahlborn

+0

サーバーがreceive()を呼び出す前に完了したMDBからのメッセージをサーバーが見逃す可能性のある競合状態はありますか? –

-1

MDBがすべてのメッセージを返すサーバーとして機能するオブジェクトは何ですか?メッセージの数(MDBによってゼロに達するまで変更される)のサイズで待つために、おそらく何らかの種類のCountDownLatchが必要です。ゼロになると、起床してクライアントに返すコードを実行できます。 CountDownLatchのAPIドキュメントを参照してください。

+1

あなたが上がりませんJ2EE世界でCountDownLatchのようなものを使用しているはずですが、wait/notifyと同じ問題です。 – jtahlborn

+0

私はそれが別のスレッドへの議論だと思います。 J2EEはまだJavaなので、そうすることができます。スレッドで作業する必要がある場合は、そのようなコードをサポートできるようにアプリケーションを設計する必要があります。 – breezee

+1

実際には、アプリケーションサーバーによっては、できません。そのようなツールは許可されていないので、実際にはカスタムのSecurityManager(jvmでサポートされている範囲内)を使ってアプリを実行するアプリケーションサーバーもあります。 – jtahlborn

関連する問題