2

Webサービスを構築するためにaxis2を使用し、すべてのアプリケーションのロジックを実行するためにJbossサーバーを使用します。応答に最大1時間かかる可能性のあるBeanと通信するWebサービスを構築するように依頼されたため(リクエストのサイズによって異なります)、その間、消費者との接続を維持することはできませんでした。

非同期Webサービスを使用することもできますが、それはあまりうまくいきませんでした。そのため、Webサービスの背後にあるロジックを実行するBeanを実装し、サービスにそのBeanを非同期で呼び出させることができると判断しました。Webサービスは、コンシューマーに渡すトークンを生成し、コンシューマーはそれを使用してリクエストのステータスを照会できます。

私が持っている質問は次のとおりです。

  1. Beanを作成したサービスのメソッドから戻った後、JBossサーバーでBeanのステータスを照会する方法。ステートフルBeanを使用する必要がありますか?
  2. Webサービス側から非同期呼び出しを実行したい場合、ステートフルBeanを使用できますか?
4

2 に答える 2

3

もう 1 つの方法は、JMS と DB を利用することです。

プロセスは次のようになります

  1. Web サービス呼び出しで、メッセージを JMS キューに入れる
  2. レコードを DB テーブルに挿入し、そのレコードの一意の ID をクライアントに返します
  3. キューをリッスンする MDB で、Bean を呼び出します
  4. Bean が戻ったら、DB レコードを「完了」ステータスで更新します。
  5. クライアントがステータスを要求すると、DB レコードを読み取り、レコードに応じて「未完了」または「完了」を返します。
  6. クライアントが呼び出し、レコードが「Done」を示している場合、「Done」を返し、レコードを削除します

このプロセスはリソースの使用量が少し増えますが、いくつかの利点があります

  • Bean メソッドが例外をスローすると、Durable JMS Queue が再配信されます
  • サーバーが再起動すると、永続的な JMS キューが再配信されます
  • 一部の静的データの代わりに DB テーブルを使用することで、クラスター化または負荷分散された環境をサポートできます
于 2009-12-03T04:44:07.210 に答える
1

ステートフル セッション Bean が問題の解決策になるとは思いません。それらは長時間実行される会話セッション用に設計されていますが、これはシナリオではありません。

Executorsファクトリ クラスを使用して作成された、Java5 スタイルのExecutorServiceスレッド プールを使用することをお勧めします。

  1. Web サービス サーバーが初期化されたら、ExecutorServiceインスタンスを作成します。
  2. Web サービス呼び出しが着信すると、ハンドラーはCallableのインスタンスを作成します。このCallable.call()メソッドは、ビジネス ロジック Bean に対して実際の呼び出しを行います。形式は問われません。
  3. これCallableは に渡され、呼び出しの最終的な結果を表すオブジェクトExecutorService.submit()がすぐに返されます。は別のスレッドであなたのFuture呼び出しExecutorを開始します。Callable
  4. ランダムなトークンを生成し、トークンをキーとして に格納Futureします。Map
  5. トークンを Web サービス クライアントに返します (手順 1 から 4 はすぐに実行する必要があります)。
  6. その後、Web サービス クライアントは結果を要求する別の呼び出しを行い、トークンを渡します。
  7. サーバーはFuture、トークンを使用して を検索し、タイムアウト値を指定しget()てを呼び出しFuture、応答を短時間だけ待機するようにします。呼び出しは、呼び出されget()たものの実行結果を返しCallableます。
    • 回答がある場合は、それをクライアントに返し、Futureマップから を削除します。
    • それ以外の場合は、クライアントに後で戻ってくるように伝えます。

これはかなり堅実なアプローチです。ExecutorService必要に応じて、同時に実行できる呼び出しの数を制限するように を設定することもできます。

于 2009-12-02T23:46:03.080 に答える