关闭请求并在Java中启动异步计算

时间:2017-10-04 07:54:04

标签: java servlets asynchronous

我正在尝试创建一个异步servlet,以便客户端发出请求,得到一个类似于"进程启动的答案"并停止等待。 servlet将启动一些计算并将结果写入DB,然后用户将能够检查进程是否终止并查看其结果。

好吧,每次我尝试这样做都会得到错误。在请求中我有一个Connection对象,如果我将它传递给一个Thread然后启动它,当主servlet结束时,连接被关闭,并且Thread抛出一个异常('连接已经关闭' )。

有没有办法只给客户端一个响应并告诉它在servlet完成所有工作时不再等待?

提前谢谢!

3 个答案:

答案 0 :(得分:0)

如果您提到数据库连接,为什么不在线程中创建连接?

答案 1 :(得分:0)

浏览器中存在 Ajax (JavaScript)以发出呼叫,并且稍后会收到成功/失败的回调。那将是最常规的方式。

如果需要更多,请在队列中注册调度请求=在数据库中存储某些内容。然后在您的应用中执行计时器任务(例如来自Spring)。这可以防止过载,DoS。

答案 2 :(得分:0)

实际上,如果在关闭响应输出流(或编写器)时看起来响应完全发送到客户端,并且您可以继续servlet内部的处理而不会出现任何线程问题。不幸的是我永远无法确认是否在servlet规范中明确允许,但我可以在Tomcat中成功完成(使用版本7)

因此,如果您在粗体注释中注明,您的servlet代码可能如下所示:

void service(ServletRequest req, ServletResponse resp) {
    OutputStream out = res.getOutputStream();
    ...   // generate the output
    out.close();       // the response is sent to client
    // asynchonous processing
    ...
}