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。
服务(请求,响应){  
  尝试 {  
    客户端启动(请求);  
    tx_start();
    做所有工作();
    tx_commit();  
  } 捕捉(CanceledException ce){  
    tx_rollback();  
    扔 ce;
  } 最后 {
    client_join();  
  }
}

客户端启动(请求){
  客户=新客户(请求);
  client_thread = new Thread(client).start();
}

客户加入(){
  client_thread.join(1000); // 等待 1s 等待客户端线程结束  
}

于 2011-05-09T07:35:38.970 回答