【问题标题】:Tomcat after Startup Event with spring启动事件后的Tomcat与春天
【发布时间】:2011-06-12 11:06:25
【问题描述】:

我有一个函数,我想在 tomcat 启动并成功加载其所有属性后立即执行。我不想使用 ServletContextListener ,因为这需要函数在 tomcat 启动之前启动。有人可以建议如何解决这个问题吗?

【问题讨论】:

  • 如何在 tomcat 启动之前调用ServletContextListener,这没有任何意义。它在 servlet 上下文启动时调用。
  • 我想我的意思是该功能将在启动完成之前启动。 ServletContextListener 不会等到 tomcat 完成引导,并且我的函数将在引导的原因上执行。
  • @Bitmap:我不同意,事实并非如此。你的证据在哪里?
  • 所以你想让hibernate在一些定义binidngs的webApp之前启动?你用什么做容器?

标签: java spring tomcat


【解决方案1】:

我认为 JMX Tomcat 支持可以满足你的要求,即使容器中没有部署ServletContextListener

【讨论】:

    【解决方案2】:

    您可以创建一个启动 servlet,然后将其添加到 web.xml 的末尾:

    <servlet>
            <servlet-name>StartupServlet</servlet-name>
            <servlet-class>com.your.package.MyStartupServlet</servlet-class>
            <load-on-startup>1</load-on-startup>
    </servlet>
    
    
    public class MyStartupServlet extends HttpServlet {
    
        public void init(ServletConfig config) throws ServletException {
            try {
                 //  Startup code here
            } catch (Exception e){
                // Log exception
            }
        }
    
        public java.lang.String getServletInfo() {
            return "StartupServlet";
        }
    }
    

    【讨论】:

      【解决方案3】:

      ServletContextListener.contextInitialized(..) 是在所有 servlet 和过滤器为给定应用程序初始化后调用的方法。

      • 如果有多个 ServletContextListeners,其中一些会在其他人之前被调用(逻辑上)
      • 如果有多个应用程序(因此有多个上下文),其中一些应用程序会先于其他应用程序启动。

      更新我现在假设你的设置,虽然你没有分享它:

      • 您通过侦听器(而不是 servlet)启动 spring
      • 你在 spring 中配置休眠

      在这种情况下,您有两种选择:

      • web.xml 中定义你的ServletContextListener spring 的那个,从而保证它会在它之后被调用
      • 使用spring's lifecycle processor

      【讨论】:

      • 你是对的:在 web.xml 中的 spring 之后定义你的 ServletContextListener
      猜你喜欢
      • 2013-10-19
      • 2014-06-26
      • 2023-03-05
      • 2021-07-05
      • 2021-07-14
      • 2014-04-28
      • 1970-01-01
      • 2021-10-15
      相关资源
      最近更新 更多