1

私の jax-ws Web サービス (クライアント要求がヒットした後) は、(ソケットを介して) バックエンドのレガシー プラットフォームに要求を送信し、応答を 20 秒間待機します。

そのリクエストを行う前に、一意のトランザクション番号でテーブルを更新します。

別のリスナー スレッド (スタンドアロンの Java アプリケーション) がそのソケットで応答を待機しています。各応答にはトランザクション番号が含まれており、どの要求 (以前に送信された) に関連付けられているかを識別します。

このスタンドアロンの Java アプリケーションは、Web サービスで待機しているスレッドに、応答が来て処理を続行できることをどのように伝えることができますか。

現在、リスナースレッドが(トランザクション番号に基づいて)テーブルを更新して、応答が到着したことを示すことができると考えています。また、Web サービス スレッドは、応答が到着したかどうかにかかわらず、データベースでポーリング (2 秒ごとにチェック) を続けることができます。

この場合、ポーリングの代わりにプッシュ通知を探しています。応答が到着したときに Web サービス スレッドに通知するにはどうすればよいですか。

4

1 に答える 1

1

要求を処理してソケット要求を行うスレッドと、ソケット応答を受信するスレッドがすべて同じ jvm にあると仮定すると
、標準の Java 待機/通知パターンを使用できます。
http://docs.oracle.com/javase/tutorial/essential/concurrency/guardmeth.html .

基本的に、req/socket スレッドは、シングルトン (または同様の) マップ内にオブジェクト (「ロック」オブジェクト) を作成します。キーは一意のトランザクション番号です。そのスレッドは、そのオブジェクトを待機します。これにより、別のスレッドがそのトランザクション ID のロック オブジェクトに対して通知を行うまで、そのスレッドがブロックされます。
ロック オブジェクトは単なるオブジェクトであることに注意してください。
待機にタイムアウトを設定して、永遠に待機しないようにすることもできます。

次に、他のスレッドがトランザクション ID のロック オブジェクトを取得し、通知を行います。これにより、最初のスレッドのブロックが解除されます。
2 番目のスレッドでトランザクション ID のロック オブジェクトが見つからない場合は、何か問題が発生しており、エラーなどをログに記録する必要があります。

Ps マップは共有リソースであるため、おそらく ConcurrentHashMap が必要になります。そうしないと、複数のスレッドが同時に更新するという問題が発生する可能性があります。

于 2012-07-13T22:06:09.517 に答える