【问题标题】:LifecycleListener is not listening after server start when the server type = periodic当服务器类型 = 定期时,LifecycleListener 在服务器启动后未侦听
【发布时间】:2019-10-01 11:28:06
【问题描述】:

我创建了一个EventHookListener,它正在实现LifecycleListener。我已经覆盖了lifecycleEvent() 方法并通过打印服务器类型和服务器状态来继续监听服务器。

代码sn-p:

@Override
public void lifecycleEvent(LifecycleEvent arg0) {
    Lifecycle lifecycle = arg0.getLifecycle();
    System.out.println("Lifecycle:"+lifecycle);
    if (lifecycle == null) {
      return;
    }
    String type = arg0.getType();
    System.out.println("Type:"+type);
    if (type == null) {
      return;
    }
    String stateName = lifecycle.getStateName();
    System.out.println("StateName:"+stateName);
    if (stateName == null) {
       return;
    }
}

对于 tomcat 9.0.26 版,如果服务器启动,则 tomcat 服务器会继续侦听。并且下面的日志来自Catalina.out: 但是在 9.0.26 版本中,如果服务器启动,tomcat 服务器会一直监听。

2019 年 9 月 23 日 16:36:08.381 信息 [main] org.apache.coyote.AbstractProtocol.start 启动 ProtocolHandler ["ajp-nio-8009"] 生命周期:标准服务器[8005] 类型:after_start 州名:已开始

当前目录:/tmp 退出代码:0

2019 年 9 月 23 日 16:36:08.407 信息 [主要] org.apache.catalina.startup.Catalina.start 服务器在 [8,239] 中启动 毫秒生命周期:StandardServer[8005] 类型:周期性 州名:已开始

但是对于任何其他版本的 tomcat(例如 9.0.6 版本或 8.5.45),一旦 tomcat 服务器达到“after_start”状态,生命周期侦听器就不会侦听。

例如

生命周期:标准服务器[8005] 类型:after_start 州名:已开始

当前目录:/tmp 退出代码:0 2019 年 9 月 23 日 16:48:10.422 INFO [main] org.apache.catalina.startup.Catalina.start 服务器在 681 毫秒内启动

谁能帮助我在这里遗漏的任何线索? Lifecycle listener 的此功能仅适用于9.0.26 版本,但不适用于旧版本。虽然 LifecycleListener 类的内容对于旧的 tomcat 和最新的 tomcat 版本是相同的。

【问题讨论】:

    标签: tomcat8 tomcat9


    【解决方案1】:

    在 9.0.14 中,触发周期性事件的调度程序已从服务移至服务器,因此在 9.0.14 之前的 Tomcat 版本中,您不会看到连接到服务器的 LifecycleListener 的周期性事件。

    如果您希望跨 Tomcat 版本的行为保持一致,您可以将侦听器移至服务,然后执行 ((Service) arg0).getServer() 以访问服务器对象。

    【讨论】:

    • 感谢您的更新。是否有任何虚拟代码实现来访问服务器对象?请为此实现提供一些代码sn-p。
    • 如果我实现Service接口我需要实现Service和LifeCycle接口的所有方法。如何摆脱在自定义侦听器类中实现不必要的方法?
    • 这里是另一个监听类访问服务器对象的实现。公共类 HookService 实现 LifecycleListener { @Override public void lifecycleEvent(LifecycleEvent arg0) { 服务生命周期 = (Service)arg0.getLifecycle();服务器服务器 = 生命周期.getServer();字符串类型 = arg0.getType(); System.out.println("类型:"+type);字符串 stateName = server.getStateName(); System.out.println("状态名称:"+状态名称); } }
    • 在 server.xml 中添加到服务标签下的条目下方。
    • 但是 LifecycleListeners(附加到服务器)的周期性事件仍然没有出现在 catalina.out 文件中。 2019 年 10 月 11 日 23:20:25.506 INFO [main] org.apache.coyote.AbstractProtocol.start 启动 ProtocolHandler ["ajp-nio-8009"] Lifecycle:StandardService[Catalina] Server:StandardServer[8005] STARTING Type:after_start StateName:STARTING 11-Oct-2019 23:20:25.509 INFO [main] org.apache.catalina.startup.Catalina.start 服务器在 [660] 毫秒内启动 如何在 9.0 之前的任何 tomcat 版本中获取周期性事件。 14?任何帮助将不胜感激。
    猜你喜欢
    • 2015-10-06
    • 2016-01-19
    • 2018-04-05
    • 2010-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-09
    相关资源
    最近更新 更多