浏览器停止加载后停止服务器线程

时间:2014-08-25 06:36:10

标签: java http java-ee servlets tcp

我试图在用户点击URL后处理一些业务逻辑。服务器端会运行一个繁重的循环。在等待服务器返回结果时,浏览器将加载(我们可以在顶部看到旋转动画)。

我们不讨论是否正确在HTTP连接中执行重循环,我的问题是,当浏览器正在等待结果时,如果用户想要停止处理,则关闭浏览器/选项卡或按ESCAPE或按“X”十字按钮(在浏览器栏),浏览器可能会停止从服务器端接收任何数据。现在,我的问题是,处理繁重循环的服务器线程不会以某种方式停止(甚至浏览器不再接收数据)。我怎么能阻止它?

我认为,根据TCP传输,如果套接字的一端关闭,另一端也会被通知并关闭。我希望我的服务器会有Servlet抛出的类似“套接字关闭异常”的东西。但事实并非如此,因此Servlet中的循环仍在运行,直到完成。不知道怎么能阻止它?如果用户继续点击URL并取消请求,则会导致“内存不足”问题。

2 个答案:

答案 0 :(得分:1)

尝试做这样的事情:

  1. 创建服务以处理新线程中的繁重循环(由您手动创建)。
  2. 当用户在浏览器中点击URL时,在新线程中创建带有大量循环的线程(通过处理服务)并返回给用户该线程的一些内部id(此id可能由您生成),这将允许您识别此线程从第1点开始服务。
  3. 从客户端到服务器创建一些pinger(例如,每5秒客户端将使用线程ID ping处理服务)。在线程处理服务中为此线程写上次ping操作。
  4. 在第1点的线程处理服务中,如果ping在最后5秒内,则创建下一个线程以检查每个线程。如果不是 - 中断线程。

答案 1 :(得分:1)

实际上,您必须加载页面才能提供javascript侧绑定事件,例如关闭浏览器窗口:

$(window).bind('beforeunload', function(eventObject) {...})

在功能上,您可以生成ajax request到服务器端,这可以像停止线程的标记一样。

当您的页面被请求时,您为繁重的任务创建一个新线程并将timer添加到页面,该页面以某个间隔轮询服务器以查看任务是否完成(也通过ajax)。任务完成后,您可以自由选择要做的事情 - 重定向到真实页面或更新此页面以加载结果。