【问题标题】:How to detect Tomcat Startup Programmatically from within a Servlet?如何从 Servlet 中以编程方式检测 Tomcat 启动?
【发布时间】:2018-12-06 16:46:12
【问题描述】:

问题

如何以编程方式确定 Tomcat 何时完成启动?我的意思是从运行在 Tomcat 上的 WAR 文件中以编程方式进行,很可能是通过一个 Servlet,如果可能的话可以利用容器信息?

背景

您通常在 WAR 完全部署后看到的 Catalina 日志条目与我正在寻找的内容相同。我有一个约束,使解析日志不受欢迎。但是进入 Catalina.out 的数据正是我正在寻找的。我正在尝试找到一种方法在 servlet 之上(甚至可能更高)获得关于启动时间的容器状态,但如果可能的话,我愿意接受替代方法。

我的尝试

我尝试检测 servlet 初始化,但那是特定于 WAR 内部的组件,而不是 servlet 容器本身。我也尝试过 Spring Events,但它们提供的最高级别是“应用程序上下文”,它只表示一组 Spring Bean 已完成加载,甚至不一定是所有 Spring bean ...如果有更接近 Servlet 规范或 Tomcat 的解决方案将不胜感激的特定库。

【问题讨论】:

  • 具体来说,您想做什么?你想要什么“容器信息”?
  • @ChristopherSchultz “如何检测 Tomcat 启动”...如我的第一行所述。在所有初始化逻辑的最后发送到 Catalina.out 的相同启动事件。
  • 如果你的应用是在Tomcat启动后部署的呢?然后没有要检测的启动事件。您想知道套接字何时绑定吗?您想知道何时可以将请求路由到您的应用程序吗?您想知道在 JVM 启动后 Tomcat 准备好接受请求所用的时间吗?真的不清楚你在问什么。
  • @ChristopherSchultz 您是否熟悉在启动结束时发送到 Catalina.out 的启动时间事件?
  • 我很熟悉。那么具体来说,您要找出Tomcat的启动时间吗? Tomcat 完全有可能在应用程序部署之前就完成了启动。在那种情况下应该怎么办?

标签: tomcat servlets jakarta-ee tomcat7 tomcat8


【解决方案1】:

只有当 Tomcat 完全完成启动并正在运行和处理请求时,Servlet 才会执行。所以,对不起,这个问题没有意义。 (就好像你不能用“不”如实回答“你醒了吗?”这个问题。)

在 Tomcat 启动完成之前运行的所有 Web 应用程序都是您实现和注册的任何 ServletContextListener(在 server.xml 中)。当应用程序被 Tomcat 启动后,它会调用任何已注册的ServletContextListener 的 contextInitialized() 方法。

如果你想在 Tomcat 生命周期内执行一些代码,你可以使用 Tomcat 的org.apache.catalina.LifecycleListener 接口。在自己的类中实现这一点,并在服务、引擎或主机的server.xml 中注册该类。这样的类不会驻留在您的 webapp 中,而是部署在 Tomcat 的 lib 目录中(类似的东西;检查您的 Tomcat 版本)。

从概念上讲,一个 Web 应用程序永远不会知道同一个 Servlet 容器(即 Tomcat)中的任何其他 Web 应用程序;这是规范严格禁止的。没有任何方法可以以任何方式连接两个应用程序。在 Tomcat 中,有一个“特权”应用程序例外,例如 Tomcat 管理器。如果您将应用程序定义为特权应用程序,它确实有一定的方式来处理其他 webapps。

【讨论】:

  • 我将查看 LifeCycleListener 注册。你的第一条评论并不完全正确。 servlet 不会在启动完成之前处理请求,但您可以将初始化逻辑放在它的 init 方法中,该方法将在完成之前运行。我有一个包含数千个 Java bean 的应用程序,在启动完成前将近 20 秒触发了数千个函数调用。您提到的 LifeCycleListener 可能是我正在寻找的。如果可行,我会跟进。
  • 啊,对。我没有想到 init() 方法。我从不使用它。
  • 干得好。这就像一个魅力。我将简单的 jar 文件放入 Tomcat lib 并在 Server.xml 中注册,并准确告诉我事情何时完成并与日志条目匹配。
猜你喜欢
  • 1970-01-01
  • 2018-12-26
  • 1970-01-01
  • 2013-08-05
  • 1970-01-01
  • 1970-01-01
  • 2012-08-03
  • 2017-06-02
  • 1970-01-01
相关资源
最近更新 更多