クライアント側の非同期サンプルのポーリングとコールバックの両方を正常に実装しましたが、サーバー側の非同期で Web サービスを実装することに興味があります。インフラストラクチャは、JBoss AS 6.x を使用する Java EE です。
私が実装しようとしているパターン (私が理解しているように) には、2 つの Web サービス操作が含まれます。
- クライアントは、SOAP over HTTP 経由で検索パラメーターを使用して Web サービス エンドポイント操作 1 を呼び出します。
- Web サービス エンドポイントは、JMS キュー 1 を介して要求をメッセージ駆動型 Bean に送信します。
- メッセージ駆動型 Bean (MDB) は、キュー 1 から要求を受け取ります。
- MDB は、コリレーター ID を含むメッセージを JMS キュー 2 経由で Web サービス エンドポイントに送信することにより、サービス要求を確認します。(このコリレーター ID は、生成された JMS メッセージ ID になると想定しています。)
- MDB は、元のメッセージを確認して、キュー 1 から削除します。
- MDB は長時間実行されるデータベース クエリを開始します。おそらく、コリレータ ID を検索キーとして使用して、結果を一時テーブルに作成します。
- Web サービス エンドポイントは、コリレータ ID を含む応答を SOAP over HTTP 経由でクライアントに返します。
結果を取得するのに長いクエリは必要ないため、JMS は必要なく、単純にデータベースにクエリを実行して、結果の準備ができているかどうかを確認できると思います。したがって、2 番目の操作は次のようになります。
- クライアントは、SOAP over HTTP 経由でコリレータ ID を使用して Web サービス エンドポイント操作 2 を呼び出します。
- Web サービスは、コリレータ ID を使用してデータベースにクエリを実行します。結果コードは、結果が見つからない、操作がまだ進行中、または結果が見つかりました。
- Web サービスは、結果コードと任意の結果を組み合わせるある種の複雑な構造でクライアントに応答します。
それで、私は多くの質問があります。非同期のサーバー側のサポートに関する言及を見たことがありますが、それらはすべて何らかの形でサーバー固有のようです。たとえば、この最初の操作を正確に説明している図を見たことがありますが、OC4J 固有のようです。誰かがこのようなものを実装する一般的な例やチュートリアルに私を導くことができるなら、そうしてください. クライアントに返すための相関子として JMS メッセージ ID を使用する必要がありますか? MDB が Web サービスに応答を送信してキューからメッセージを削除できるように、JMS セッション モードとして CLIENT-ACKNOWLEDGE を使用する必要があると想定しています。それとも、気にする必要がありますか?Web サービス エンドポイントが JMS メッセージを生成するだけの場合、それをキューにポップし、JMS キュー 2 を介して MDB に相関子を送り返すという厳密な役割をすべて経ることなく、メッセージ ID をサービス クライアントに直接返しますか? [編集: 実際、考えれば考えるほど、Web サービスがメッセージを送信してから、キュー 2 で応答を待ってブロックするのは間違っているように思えます。]