3

私は、Tomcat サーバーに対して複数の重複する読み取り専用要求をユーザーが開始できるようにする JavaScript アプリケーションを持っています。リクエストが来るまでクライアント側のコントロールをすべて無効にすることもできますが、有効にしたままにして、ユーザーがいつでもクリックできるようにし、以前のリクエストをキャンセルしたいと思います。

私がやりたいことは、サーバーが決して見られない要求を完了するのに時間を無駄にしないように、最新の要求を除くすべてをキャンセルすることです。サーバーのリソースを削減するために、サーバーがそのリクエストに対して実行中のスレッドを中止するようにします。

これを行う最善の方法は何ですか?

4

2 に答える 2

2

サーバーの CPU 時間を節約することがすべてである場合、クライアント側でリクエストをキャンセルしても役に立ちません。簡単な方法は次のとおりです。それを無視し、サーバー側のリクエスト プロセッサがその出力ストリームが閉じられて失敗することを認識するまで、リクエストが引き続き計算されることを受け入れます。

実際に完了するまでにかなりの時間がかかる負荷の高い操作がある場合は、サーバー側の作業をチャンクで実行することを選択し、仲介者として、リクエストがまだ続行する必要があるかどうかを確認します。新しいリクエストは、同じユーザーの他のスレッドがチェックしているフラグを設定する可能性があります。

Java スレッド レベル (Thread.stop など) での対話は、アプリケーション ロジックでの対話には適切な方法ではありません。ただし、どのユーザーがどの操作を実行する必要があるかを判断するアプリケーション ロジックがあり、各操作がまだ必要かどうかを確認できる場合は、それが役立つ場合があります。それでも数サイクルは無駄になりますが、必ずしも全額ではありません。

また、Java スレッド レベルで対話する場合、スレッドはアプリケーション サーバーによって所有されている可能性が高く、リクエスト処理のためにスレッド プールで使用されることに注意してください。

于 2013-07-05T19:46:14.460 に答える
0

サーバー上でこれを行うことができると思いますが、コメントで暗示されているように、少し非現実的です。

追跡するデータ構造(おそらくHashMap)が必要になります

  • リクエストを行っているユーザー
  • リクエストを処理している現在のThreadオブジェクト
  • リクエストの識別に役立つその他の文脈上のもの

サーブレットへの着信 HTTP 要求で、ルックアップ テーブルを調べて、Thread オブジェクトが既に格納されているかどうかを調べます。その場合は、スレッドを停止し、現在のスレッドで実行を続行します。スレッドがコンテンツをクライアントに返す前に、スレッドのエントリを HashMap から必ず削除してください。

これはかなり複雑な状況です。並行性を扱うときはいつでも、本当に混乱するリスクがあります。サーバー側のリソースを本当に節約したい場合にのみ、このルートに従います。それ以外の場合は、 Aleks Gが提案したように、AJAX を使用してクライアント側で以前の呼び出しをキャンセルする方がおそらくはるかに簡単です。

于 2013-07-05T15:22:38.903 に答える