我正在重构一段代码atm,其中在servlet中执行长时间的操作。现在有时我在操作完成后没有得到回复。 (它已经完成,因为它被打印到日志中)
我希望实现的是servlet的一些“发射并忘记”行为。我会将我的参数传递给动作,servlet会立即返回一个状态(类似于:操作已经开始,检查日志以获取更多信息)
这是否可以使用servlet 2.5规范?我想我可以用JMS
或其他任何解决方案来获得这样的行为吗?
答案 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的实例传递。如果你谷歌它应该有足够的样本。