3

Async Webサービスを実装する必要があります。 WebサービスのAsync WebサービスのJava ExecutorService

  • 行動:

私たちは、サーバーへのアカウントのリクエストを送信し、それが承認IDと同期応答を返します。その後、私たちは、そのAcknowledgement IDを含む複数のCallback要求を取得します。確認応答IDの最後のコールバック要求には、レスポンスにテキスト(完了:true)が含まれます。これは、これがそのアカウントおよび確認応答IDの最後のコールバック要求であることを通知します。これにより、特定のアカウントの非同期呼び出しが完了し、その最終ステータスをマークすることができます。複数のアカウントに対してこのWebサービスを実行する必要があります。だから、私たちは多くのアカウントのコールバック要求を受け取ります。

  • 質問:

複数のアカウントのために来て、これらの複数のコールバック要求を処理する最適な方法は何ですか。私たちが考える

  • ソリューション:
  • ExecutorServiceの固定スレッドプール:これは並列弊社のコールバック要求を処理しますが、懸念は、それが配列を維持しないということです。したがって、確認応答ID(アカウント)に対する最後のコールバック要求が来たと判断することは困難です。したがって、私たちは、そのアカウントの最終ステータスを豪快に完了したものとしてマークすることはできません。
  • ExecutorServiceシングルスレッド実行者:ここでは、プール内にキューがunboudedのスレッドが1つしかありません。これを使用すると、実際に処理されるスレッドが1つだけなので処理がかなり遅くなります。

メモリとパフォーマンスの両方の要件を実装する最適な方法を提案してください。

答えて

2

1つのことを明確にしましょう:HTTPはブロック型の同期プロトコルです。要求/応答のペアは非同期ではありません。あなたがやっていることは、非同期リクエストを生成し、リクエストが処理されている(HTTP 200)かどうか(HTTP 500)を知らせるために呼び出し元に戻ります。

私はこのような状況に最適な知っていることをわからないんだけど、他の考慮事項があります。

  1. あなたが設定することができExecutorServiceThreadPoolを使用してください。これらのスレッドを他のスレッドと区別できる接頭辞が付いていることを確認してください。
  2. リクエストタスクをブロッキングデキューに追加し、コンシューマスレッドのプールを処理します。デキューとコンシューマスレッドプールのサイズを調整できます。
  3. 処理が集中する場合は、要求メッセージを別のサーバー上で実行されているキューに送信します。キューリスナーのプールに要求を処理させる。

コールバックが特定の順序で返されるとは想定できません。 「最後」が「真」であることに依存しないでください。完了した時点を知るために、すべてのスレッドに一緒に参加する必要があります。

Webサービスでは、ユーザーがステータスを照会できるようにする必要があります。

+0

WebサービスにはURLがありません。すべてのコールバックを送信していることを伝えます。また、私たちにすべて送信しても、最後のステータスは、すべて受信したかどうかによって決まります。 ExecutorService固定スレッドプールを続行するには、ExecutorService Single Thread Executorを使用する必要があります。 – pogo22

+0

追加してください。彼らはすべてが戻って来なかったら偽を返します。それがアイデアです。スレッドプールはそれを変更しません。 – duffymo

関連する問題