当用户取消请求时,常见的Web服务器会做什么?

时间:2011-05-09 06:35:55

标签: http transactions cancellation

对于不那么短期间的请求,并且用户取消了连接(即,他/她在请求完成之前关闭了浏览器),那么服务器端会发生什么呢?

但它应该依赖于服务器。但是常见的方式是什么?

某些请求需要相当长的时间才能完成,例如,分布式DBMS事务,它将数据提交到不同国家/地区的多个不同服务器。 (我知道这在银行申请中很常见)

有些请求会向客户端发送大量数据,例如,当用户下载大型附件时。

是否应在特定超时后取消请求线程?

我的网络应用程序应该处理用户活动,并自行取消交易:

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();
}
我应该吗?

1 个答案:

答案 0 :(得分:0)

问题:

  • 如果do_some_work()花费的时间超过预期且客户端连接已关闭,则在不再需要事务时,do_some_work()可能会继续。

解决方案:

  • 使用其他线程分离服务器事务工作和客户端输入。
  • 让客户端中断do_all_work(),然后抛出CanceledException。
service(request, response) {  
  try {  
    client_start(request);  
    tx_start();
    do_all_work();
    tx_commit();  
  } catch(CanceledException ce) {  
    tx_rollback();  
    throw ce;
  } finally { 
    client_join();  
  }
}

client_start(request) {
  client = new Client(request);
  client_thread = new Thread(client).start();
}

client_join() {
  client_thread.join(1000); // wait 1s for the client thread to end  
}