2017-02-14 6 views
4

私のJettyサービスでは、いくつかのスレッドを実行させるトリガとなるエンドポイントがあります。私は現在ThreadExecutorPoolを使ってRunnableを実行しています。しかし、エンドポイントへの個々の要求ごとに残っているジョブの数を知り、複数の同時要求を許可したいと考えています。1つのエグゼキュータが残りのトラッキングを行うための実行キューを分離する

私の考えは、リクエストごとに1つのキューがあり、ラウンドロビン方式で各キューから取り出す何らかのエグゼキュータを持つようなことです。私はこのようなものが箱から出てくるかどうか疑問に思います。

実行順序は気にしないことに注意してください。私が気にしているのは、各リクエスト(つまりセッション)に等しい時間が与えられ、各セッションについて、まだ開始/完了していないスレッドの数がわかるということです。

だから、私はMultiQueueExecutorかそのようなものを推測しますか?

答えて

0

しかし、エンドポイントへの個々のリクエストごとに残っているジョブの数を知り、複数の同時リクエストを許可したいと考えています。

FutureExecutionCompletionServiceと組み合わせて使用​​します。 ECSを使用している場合、各タスクが完了するとすぐにWeb要求が通知されるので、実行するタスクの数は常に把握されます。

私が気にしているのは、各リクエスト(つまりセッション)には等しい時間が与えられ、セッションごとに、まだ開始/完了していないスレッドの数がわかるということです。

「均等な時間」は保証されておらず、スレッドのプール属性に基づいてジョブがスレッドプールに送信されたときに競合状態が発生しています。このソリューションが機能するかどうかは、問題の情報をどのように処理するかによって大きく左右されます。

+0

ほぼ等しい時間。私。リクエスト1はリクエスト2をブロックすべきではありません。 Futuresをポーリングする際の私の問題は、タスクがキューに追加されるまでに時間がかかることです。だから、私が何かを逃していない限り、ポーリングの未来は、タスクが完了したときに単に教えてくれるだけですが、現在キューにいる人の数はわかりません。 – marisbest2

+0

それぞれの要求は、完了したタスクの数と残っている数を知ることになります。また、TPEキューを調べて、キュー内のタスクの総数を確認することもできます。あなたはあなたの要件に関してより具体的になりますか? @ marisbest2 – Gray

+0

同じ時間の点では、いくつかの選択肢があります。新しい要求ごとに新しいスレッドをフォークするキャッシュされたスレッドプールを作成できます。あなたがたくさんのリクエストを受けている場合、これはうまくいかないかもしれません。それ以外の場合は、リクエストがTPE上にある場合を除き、以前に送信されたタスクによってブロックされていないタスクがどのように開始されるのか分かりませんが、サーバー@ marisbest2をスラッシュする可能性があります。 – Gray

関連する問題