【发布时间】:2015-08-05 10:33:32
【问题描述】:
我有一个这样注释的 Servlet:
@WebServlet(value="/MyServiceServlet", loadOnStartup=1)
这会导致 Servlet 在应用程序启动时被实例化,并调用其 init() 方法。完美的! (在init() 方法中,启动一个线程来执行一些每小时运行的数据库维护)
现在,在某些最终用户操作上,我通过使用到达 Servlet
getServletContext().getRequestDispatcher("/MyServiceServlet").include(request, response) 触发其他一些数据库的东西,但我第一次尝试这个时,我的 Servlet 被再次实例化一次,并且(当然)调用了 init() 方法,这导致两个类似的线程运行。不完美!
似乎loadOnStartup=1 没有将 Servlet 放入 Servlet 上下文中,因此当我尝试通过 Request Dispatcher 访问它时,它需要被实例化。
这怎么可能?如何解决,所以我只得到我的 Servlet 的一个实例?我需要它在应用程序中启动,因为在 init() 中启动的服务应该立即运行。
应用程序部署在 Tomcat 7.0.57 上。
【问题讨论】:
-
听起来像是 Tomcat 中的一个错误。如果您以通常的方式通过 HttpServletRequest 本身获取 RequestDispatcher 怎么办?仅当它位于不同的 ServletContext 中时才需要通过 ServletContext 获取它(即部署在同一服务器上的另一个 webapp;然后您通常会通过 ServletContext#getContext() 获取感兴趣的 ServletContext)。
-
@BalusC 我尝试使用请求对象来获取 RequestDispatcher 并使用 pre 3.x 方法通过 web.xml 映射 Servlet 无济于事。经过更多调试后,似乎是对 .include(request, response) 的调用创建了我的 Servlet 的另一个实例。
标签: tomcat servlets requestdispatcher