如何从 Servlet 中以编程方式检测 Tomcat 启动?

How to detect Tomcat Startup Programmatically from within a Servlet?

问题

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

背景

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

我试过的

我尝试检测 servlet 初始化,但那是特定于 WAR 内的组件,而不是 servlet 容器本身。我还尝试了 Spring 事件,但它们提供的最高级别是 "Application Contexts",这仅表示一组 Spring Beans 已完成加载,甚至不一定是所有 Spring beans...如果有更接近 Servlet 规范或 Tomcat 特定库的解决方案,我们将不胜感激。

Servlet 仅在 Tomcat 已完全完成启动 并且 运行 正在处理请求时才执行。所以,抱歉,这个问题没有意义。 (就好像你不能用"no"如实回答"Are you awake?"这个问题。)

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

的 contextInitialized() 方法

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

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