我正在尝试创建一个异步servlet,以便客户端发出请求,得到一个类似于"进程启动的答案"并停止等待。 servlet将启动一些计算并将结果写入DB,然后用户将能够检查进程是否终止并查看其结果。
好吧,每次我尝试这样做都会得到错误。在请求中我有一个Connection对象,如果我将它传递给一个Thread然后启动它,当主servlet结束时,连接被关闭,并且Thread抛出一个异常('连接已经关闭' )。
有没有办法只给客户端一个响应并告诉它在servlet完成所有工作时不再等待?
提前谢谢!
答案 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
...
}