2017-10-04 20 views
0

我试图创建一个异步servlet,以便客户端发出请求,获得像“进程启动”的答案并停止等待。 servlet将启动一些计算并将结果写入数据库,然后用户将能够检查进程是否终止并查看其结果。关闭请求并启动Java中的异步计算

那么,每次我尝试做到这一点就会得到错误。在请求中我有一个Connection对象,并且如果我将它传递给一个线程然后启动它,当主Servlet结束连接时关闭并且线程抛出一个异常('连接已经关闭')。

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

预先感谢您!

+0

请分享您的代码。 –

+0

@chade我应该分享哪些代码?我正在寻求一种办法,而不是为了解决错误...... –

+0

您可以让您的客户端使用Ajax或类似技术来执行异步请求。当存在回购时,回调机制将被用来获得它。 – breezee

回答

0

如果你提到一个数据库连接,为什么不创建连接内部你的线程?

+0

因为我没有连接的密码。我正在为我的社会开展一个大型项目,带来了很多安全问题。如果有克隆已经有效的连接的方法将会很好 –

+1

你真的需要发布你的“大项目”的更多细节来获得帮助。你在使用Hibernate吗?你在使用Spring事务管理器吗? – Qianlong

+0

这是我最终采纳的解决方案,谢谢 –

0

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

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

+0

我不需要将请求放在队列中。如果我使用Ajax,并且用户关闭了它的浏览器,servlet是否仍然会执行到最后? –

+0

是一直处理到最后(否则有时不合需要)。我的意思是“队列”,如果处理需要很长时间,只需将其所需的任务与其参数一起存储起来,基于定时器的处理就会更好。 –

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 
    ... 
} 
+0

如果客户收到回复后关闭浏览器会怎么样?服务器可能注意到套接字被客户关闭并且终止了进程,不是吗? –

+0

我不这么认为,因为HTTP是一个断开的协议。 –