【问题标题】:Run method from war application automatically after tomcat server startupTomcat服务器启动后自动从war应用程序运行方法
【发布时间】:2019-04-08 20:16:41
【问题描述】:

项目是一场使用本地 tomcat 的战争

我想知道如何在服务器启动后自动运行方法?我知道在服务器启动期间运行它的方法,例如 @Bean 方法或在上下文初始化期间,但是在服务器成功启动后我该怎么做?

【问题讨论】:

    标签: java tomcat war


    【解决方案1】:

    在 Tomcat 上,您可以使用 Tomcat 自己的LifecycleListener。如果你在宿主组件上为 AFTER_START_EVENT 注册一个监听器,你应该得到你想要的。

    LifecycleListener 的代码示例:

    package my.sourcecode;
    
    import org.apache.catalina.Lifecycle;
    import org.apache.catalina.LifecycleEvent;
    import org.apache.catalina.LifecycleListener;
    
    public class TomcatHostLifecycleListener implements LifecycleListener {
    
    @Override
    public void lifecycleEvent(LifecycleEvent lifeCE) {
    
        if (Lifecycle.AFTER_START_EVENT.equals(lifeCE.getType())) {
            System.out.println("************ TomcatHostLifecycleListener: After Start Event");
        }
    
    }
    
    }
    

    代码必须作为 JAR-File 放在 Tomcat 的全局 lib 文件夹中!

    必须在 Tomcats server.xml 中注册 LifecycleListener,在您的情况下,在主机元素中,因为我们想监听主机启动:

    ....
    <Host ... >
        <Listener className="my.sourcecode.TomcatHostLifecycleListener"/>
        ....
    

    有关更多文档,请参阅Lifecycle-Doc

    (使用 Tomcat 8.5.30 和 Java 11 测试)

    【讨论】:

      【解决方案2】:

      据我了解,您使用的是 Spring。因此,您可以查看 Spring 应用程序上下文事件。 例如,您可以像这样定义事件侦听器方法

      @EventListener
      public void handleContextRefreshEvent(ContextStartedEvent ctxStartEvt) {
          System.out.println("Context Start Event received.");
      }
      

      【讨论】:

      • Spring无法知道Tomcat监听端口何时打开,ContextStartedEvent可能在端口打开之前发生。
      【解决方案3】:

      使用 Spring Boot,将 @PostConstruct 注解添加到方法中,使其在 Spring Boot 应用程序启动后运行。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-10-03
        • 1970-01-01
        • 2019-11-24
        • 1970-01-01
        • 2020-09-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多