3

いくつかのエッジでajaxを使用するgrailsアプリケーションがあります。

client -> controller -> service -> controller -> client私はajaxを介して大規模な計算()をトリガーabort()し、現在実行中のすべてのリクエストを呼び出すことがあります。(たとえば、ユーザーがいくつかのパラメーターを変更した場合)

問題は、ajax-requestsを呼び出すとabort()、これらのリクエストは実際にはクライアント側で停止しますが(完璧です!)、サーバーはこれらの中止されたリクエストを計算し続けます-ユーザーが中止したことを認識せず、それ以上の処理は役に立たないです。

サーバーに「ねえ、このリクエストをやめて、もう必要ない」と伝える方法/プラグインなどを検索しましたが、解決策が見つかりませんでした。

私がこれにどのように取り組むか、または他の人がこれにどのように対処したかについてのアイデアはありますか?

4

2 に答える 2

0

別の ajax リクエストをサーバーに送信し、コントローラーにサービス中のプレビュー処理を「停止」させるよりも簡単な方法があるとは思えません。

この質問を確認してください:実行された ajax リクエストをキャンセルする方法 (サーバー側)

于 2012-07-09T10:24:25.973 に答える
0

他の人が言ったように、サーバーにリクエストの処理を停止させるためにできることはあまりありません。何らかの制御を行うことができる唯一の場所は、長時間実行される計算を処理しているサービス内です。

頭に浮かぶ解決策の 1 つは、計算サービスが中止するように指示する何らかのフラグをチェックすることです。フラグが設定されていることがわかった場合は、すぐに返すか、小さなジャンク値を返すだけです。とにかくもう聞いていません。

サービスはデフォルトでトランザクション セーフであるため (私が思うに)、トランザクションに依存しない方法でフラグを設定するように注意する必要があります。つまり、セッションとデータベース (トランザクション リレーショナル データベースを使用していると仮定) がオフになっていることを意味します。これは、後続の「停止」リクエストによって行われた変更がサービスに表示されないためです。代わりに、外部の非トランザクションの非常に高速なキー値データ ストアであるため、Redis のようなものが理想的かもしれません。

「アーキテクチャ」の例として、基本的には、計算を停止するように指示する特定のユーザーまたはセッションの redis キーを設定する「停止」アクションがあります。次に、計算サービスが実行中にそのキーをチェックし、設定されていることが判明した場合は処理を停止します。

この種のことを可能にする他の (おそらくより良い) アーキテクチャがありますが、現在のシステムを考えると、これは最も単純なものの 1 つになると思います。

于 2012-07-09T17:42:20.320 に答える