1

Java アプリケーションと jax-ws Web サービスの間のスレッド間通信で投稿された元の質問の前提がいくつか変更されました(また、質問を単純化して、理解しやすくする (したがって、回答を得られるようにします)。モデレーターに問題がないことを願っています)。 .)

Web サービス スレッド (THREAD-1) が要求をソケットに配置し、応答を待機してスリープ状態になります。別のリスナー スレッド (THREAD-2) (応答を受信すると、別の Web アプリケーションとして実行されます) は、THREAD-1 をスリープ状態から復帰させる必要があります。

どうすればいいですか(プッシュ通知の方法で)?

どちらもデータベース テーブルにアクセスできます。THREAD-1 は、スリープ状態になる前に固有の ID をテーブルに入れることができます。THREAD-2 は、応答を受け取り、それが THREAD-1 に属していると判断すると、データベース テーブルの適切な行を更新します。これで、THREAD-1 はデータベース テーブルに対して (一定の間隔で) ポーリングを実行して、応答が到着したかどうかを確認できます。

しかし、私はプッシュ通知の方法でそれをやろうとしています。THREAD-1 は、数秒ごとにポーリングする必要なく、応答が到着したときにすぐに通知される必要があります。

4

2 に答える 2

3

バックエンドリクエストがすぐに完了し、処理するクライアントリクエストの急流がない場合は、開いたばかりの同じソケットを介してWebサービスに応答を待機させることができます。応答の読み取り待機をブロックできます。

ただし、サーブレット3.0(Tomcat 7など)にアクセスできる場合は、非同期HTTPリクエストを使用できます。これにより、クライアントの要求に応答することなく、Webサービスクライアントを処理しているスレッドをプールに戻すことができます。バックエンドサービスから応答メッセージが到着すると、サーブレットコンテナから適切なWebサービスクライアント要求を取得し、最終応答をWebサービスクライアントに送り返します。

于 2012-07-14T19:22:17.030 に答える
2

コメントが示唆しているように、これを自分で実装しようとしない方がよいでしょう。ただし、基本的には、wait()/ notify()で標準のJavaスレッド同期を使用できます。

  • スレッド1は、一意の呼び出しIDとともにスレッド2へのリモート呼び出しのセットです。
  • スレッド1は(ではなく)wait()同期オブジェクトで実行されるようになりましたsleep()
  • スレッド2は作業を行い、結果を返すために、JVMスレッド1が存在するリモートコールバックメソッドを呼び出します-call-IDは結果と一緒に渡されます
  • スレッド1側のコールバックメソッドは、call-IDを介して結果を利用可能にし、次の方法で待機中のすべてのスレッドをウェイクアップします。notifyAll()
  • スレッドを含む。スレッド1は、結果が到着したかどうかを確認します。到着した場合は、再度そうでない場合は引き続き機能wait()します。

スレッド1側の擬似コード:

HashMap<String, Object> results;

// Called by Thread-1 to access Thread-2
public void doIt() {
    String callId = "aUniqueCallId";
    Object result = null;
    remoteCallToThread2(callId);
    synchronized(results) {
        while((result = results.remove(callId)) == null) {
            results.wait();
        }
    }
    doSomethingWith(result);
}

// Called remotely by Thread-2 when result is available
public void callback(String callId, Object result) {    
    synchronized(results) {
        results.put(callId, result);
        results.notifyAll();
    } 
}

もちろん、これは単なる基本的な考え方であり、そのように使用することはできません。ここで考慮すべきことがたくさんあります。

于 2012-07-14T18:27:56.113 に答える