我正在研究一个可能需要几个小时才能完成请求的servlet。但是,调用servlet的客户端只对知道servlet是否已收到请求感兴趣。客户端不希望等待几小时才能从servlet获得任何响应。此外,由于调用servlet是一个阻塞调用,因此客户端在收到来自servlet的响应之前无法继续。 为了避免这种情况,我想在servlet代码中实际启动一个新线程。 servlet启动的线程将执行耗时的处理,允许servlet非常快速地向客户端返回响应。但我不确定这是否是一种可以解决servlet调用阻塞性质的可接受方式。我已经研究过NIO,但似乎并不能保证在任何servlet容器中工作,因为servlet容器也是基于NIO的。
答案 0 :(得分:4)
您需要的是作业调度程序,因为它们可以确保即使服务器重新启动也可以完成作业。
查看java OSS job schedulers,最值得注意的是Quartz。
答案 1 :(得分:2)
您的解决方案是正确的,但在企业应用程序中创建线程被认为是一种不好的做法。最好使用thread pool或JMS队列。
你必须考虑到服务器在处理期间会发生什么情况,如何在多个请求(想想:数百甚至数千)同时发生时做出反应,等等。所以你选择了正确的方向,但它有点复杂。
答案 2 :(得分:2)
一个线程并不错,但我建议把它作为一个任务放到执行程序池中。更好的是长期工作的经理。像你计划的那样快速返回并不是一种坏习惯。我建议提供某种用户反馈,指示用户可以在哪里找到有关长时间运行作业的信息。所以:
包含结果的页面必须与此后台作业管理器协调。在计算时,您可以让此页面描述进度。完成后,页面可以显示长时间运行的作业的结果。