1

それほど短期間ではないリクエストで、ユーザーが接続をキャンセルした (つまり、リクエストが完了する前にブラウザを閉じた) 場合、サーバー側で何が起こるでしょうか?

ただし、サーバーに依存する必要があります。しかし、一般的な方法は何でしょうか?

一部の要求は、完了するまでにかなり長い時間がかかります。たとえば、分散 DBMS トランザクションでは、データが異なる国の複数の異なるサーバーにコミットされます。(銀行の申し込みではよくあることだと思います)

たとえば、ユーザーが大きな添付ファイルをダウンロードする場合など、一部の要求はクライアントに大量のデータを送信します。

特定のタイムアウト後にリクエストスレッドをキャンセルする必要がありますか?

私の Web アプリケーションがユーザー アクティビティを処理し、次のように自分でトランザクションをキャンセルする必要があります。

service(request, response):
    tx_start();
    do {
        do_some_work()
        if (user_canceled) break;
        do_some_work()
        if (user_canceled) break;
        do_some_work()
        if (user_canceled) break;
        do_some_work()
        if (user_canceled) break;
        do_some_work()
        if (user_canceled) break;

        tx_commit();
        return;
    } while (false);
    tx_rollback();
    throw new CanceledException();
}

するべきか?

4

1 に答える 1

0

問題:

  • do_some_work() が予想よりも長くかかり、クライアント接続が切断された場合、トランザクションが不要になったときに do_some_work() が続行されることがあります。

ソリューション:

  • 別のスレッドを使用して、サーバー トランザクション作業とクライアント入力を分離します。
  • クライアントが do_all_work() に割り込み、CanceledException がスローされるようにします。
サービス(リクエスト、レスポンス) {  
  試す {  
    client_start(リクエスト);  
    tx_start();
    do_all_work();
    tx_commit();  
  } catch (CanceledException ce) {  
    tx_rollback();  
    ceを投げます。
  } 最後に {
    client_join();  
  }
}

client_start(リクエスト) {
  クライアント = 新しいクライアント (要求);
  client_thread = 新しいスレッド (クライアント).start();
}

client_join() {
  client_thread.join(1000); // クライアント スレッドが終了するまで 1 秒待ちます  
}

于 2011-05-09T07:35:38.970 に答える