Servlets,长期运营

时间:2010-05-17 08:36:31

标签: java servlets

我正在重构一段代码atm,其中在servlet中执行长时间的操作。现在有时我在操作完成后没有得到回复。 (它已经完成,因为它被打印到日志中)

我希望实现的是servlet的一些“发射并忘记”行为。我会将我的参数传递给动作,servlet会立即返回一个状态(类似于:操作已经开始,检查日志以获取更多信息)

这是否可以使用servlet 2.5规范?我想我可以用JMS或其他任何解决方案来获得这样的行为吗?

4 个答案:

答案 0 :(得分:3)

异步Servlet可以满足您的需求,但它仅作为Servlet 3.0规范的一部分提供。您可以阅读有关Async Servlets here

的更多信息

答案 1 :(得分:2)

有几种方法可以做到这一点。异步servlet是Servlet api 3.0的一部分。我认识很多人会触发一个单独的线程,通常是一个守护线程。产生自己的线程的缺点是你可能失去任何“容器”优势,因为线程在JVM中或多或少地独立运行。我最经常使用的是由JMS提供的消息驱动bean,它在EJB容器中运行,具有所有这些优点和缺点。 YMMV。

答案 2 :(得分:1)

如果升级到Servlet 3.0(Java EE 6的一部分,目前只有Glassfish v3作为唯一的实现; Tomcat 7仍在继续,预计下个月)不是一种选择,那么另一种选择是{{3 }}。几乎所有Java servletcontainer都具有此功能。目前还不清楚你正在使用哪一个,所以这是一个Tomcat 6目标文档:Comet

或者,您可以在servlet中单独发出Thread,以便servlet方法可以直接返回。您最终可以将Thread存储在会话中,以便可以在后续请求中保留状态。如果有必要,让它实现What is the Apache Tomcat Comet API,以便您可以在会话到期时中断它。

答案 3 :(得分:1)

您应该考虑使用Java的ExecutorService抽象(Executor / Future框架),而不是启动(和管理)自己的步骤。如果你正在使用Spring,你可以将Executor定义为Spring上下文中的另一个bean,你的servlet可以调用它将你的任务作为Runnable的实例传递。如果你谷歌它应该有足够的样本。