0

私は次のJavaサーブレットの構築を完了しました:[主なアイデアは消費者プロデューサーのアイデアだと思います]

  1. 複数のhttpPOSTリクエストを受信するJavaサーブレット

  2. すべてのリクエストをキューに入れます[ConcurrentLinkedQueue]

  3. キュー内のすべてのリクエストは、単一の独立したスレッド(エンジンなど)によって処理されます。このスレッドはサーブレットとは独立して機能します。処理を行うには、いくつかの異なるhttpリクエストからのデータが必要なので、別のスレッドには十分な理由があります。キューは、十分な要求があるまで待機してから、処理を開始します。

これで最終ステップになります。たとえば、httpリクエストNo1が独立スレッドエンジンによって処理されたら、返信できるように、つまり応答を送り返すことができるように、特定のサーブレットスレッド(たとえばNo1)に通知する必要があります。対応するクライアントに。

このスレッドの問題を解決するにはどうすればよいですか?シングルスレッドエンジンはどのようにして毎回正しいサーブレットスレッドに通知できますか?これをどのようにコーディングすればよいですか?

4

3 に答える 3

2

これらの要件がどこから来ているのかはわかりませんが、この問題に対する他のはるかに単純なアプローチがいくつかあります。

  • を使用しExecutorServiceます。タスクをプールに送信し、返されたFutureオブジェクトをブロックするだけです。非常にシンプルで効果的です。タスクの準備ができたら、Future.get()結果を返します

  • サーブレット3.0を使用すると、処理全体を非同期スレッドに入れることができます。これははるかにスケーラブルです。基本的に、タスクを送信し、HTTPスレッドをすぐに解放します。非同期スレッドは、そのキュー内のアイテムを処理するだけでなく、AsyncContextオブジェクトを介してHTTP応答を返します。

本当にキューと別のスレッドを使用する必要がある場合は、Javaのロック条件を確認してください。しかし、それははるかに低レベルの作業です。

于 2012-07-22T13:44:12.170 に答える
1

SingleThreadExecutorを使用します。サーブレットにCallableオブジェクトを作成させ、それらをエグゼキュータに送信してからget()、返されたFutureを呼び出します。

Callable<Foo> callable = new Callable<Foo>() {
    // TODO implement call();
};
Future<Foo> future = executor.submit(callable);
Foo result = future.get();
于 2012-07-22T13:44:31.683 に答える
0

作業を実行するために別のスレッドにキューがあるのには十分な理由がありますか?サーブレットがクライアントに応答を返す前に処理の結果を待つ必要がある場合は、同じスレッドで処理を実行して結果を同期的に返すのはなぜですか?

本当に非同期で処理したい場合は、Futureオブジェクトを使用して、計算の完了ステータスを確認し、その結果を取得できます。

于 2012-07-22T13:42:39.093 に答える