【问题标题】:RequestDispatcher instantiates servlet which has already been instantiated via load-on-startupRequestDispatcher 实例化已经通过 load-on-startup 实例化的 servlet
【发布时间】: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


【解决方案1】:

(在init()方法中,启动了一个Thread来执行一些db 每小时运行一次的维护)

哦,天哪,太棒了,你甚至相信内存泄漏吗?在 servlet 中运行线程?!你需要通过 context-listener(javax.servlet.ServletContextListener) 来做,而不是直接做,不安全。

public class run_thread implements ServletContextListener{
    @Override
        public void contextInitialized(ServletContextEvent sce) {System.out.println("Init: daemon stuffs");/*run teh trhead*/}
        @Override public void contextDestroyed(ServletContextEvent sce) {
            System.out.println("Hult: daemon stuffs");/*hult teh trhead*/
        }
    }

不要伪造注册bi web.xml

<listener>
    <listener-class>pack.run_thread</listener-class>
</listener>

更好的解决方案是让另一个外部应用程序进行数据库维护,或者至少每隔一段时间调用 servlet 路径。

现在,在某些最终用户操作上,我使用 Servlet 访问

什么是用户操作?如何?使用另一个servlet? requets.getRequestDispatcher() 而不是 getServletContext()

您可以分享 servlet 代码,将不胜感激。

【讨论】:

    猜你喜欢
    • 2023-03-11
    • 2013-04-21
    • 2021-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-01
    • 2015-09-06
    相关资源
    最近更新 更多