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

时间:2018-12-06 16:46:12

标签: tomcat servlets java-ee tomcat7 tomcat8

问题

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

背景

在WAR完全部署后,您通常看到的Catalina日志条目将与我正在寻找的条目相同。我有一个约束,使得不希望解析日志。但是去Catalina.out的数据正是我要寻找的。我正在尝试寻找一种方法,以使其在Servlet之上甚至更高一些,以获取有关启动时间的容器状态,但我对可能的其他方法持开放态度。

我尝试过的事情

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

1 个答案:

答案 0 :(得分:1)

只有Tomcat完全完成启动后,Servlet才会执行,并且正在运行和处理请求。因此,抱歉,这个问题没有道理。 (这就像您不能如实回答“您醒了吗?”的问题一样。)

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

如果要在Tomcat生命周期内执行某些代码,则可以使用Tomcat的org.apache.catalina.LifecycleListener接口。在自己的类中实现此方法,然后在服务,引擎或主机的server.xml中注册该类。这样的类不会驻留在您的Web应用程序中,而是部署在Tomcat的lib目录中(类似这样;检查您的Tomcat版本)。

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