问题
如何以编程方式确定Tomcat何时完成启动?我的意思是说,它是通过在Tomcat上运行的WAR文件中以编程方式实现的,很可能是通过Servlet来实现的,如果可能的话,它可以利用容器信息?
背景
在WAR完全部署后,您通常看到的Catalina日志条目将与我正在寻找的条目相同。我有一个约束,使得不希望解析日志。但是去Catalina.out的数据正是我要寻找的。我正在尝试寻找一种方法,以使其在Servlet之上甚至更高一些,以获取有关启动时间的容器状态,但我对可能的其他方法持开放态度。
我尝试过的事情
我尝试检测servlet初始化,但这仅针对WAR内部的组件,而不是servlet容器本身。我还尝试了Spring Events,但是它们提供的最高级别是“应用程序上下文”,它仅指示一组Spring Bean已完成加载,甚至不一定指示所有Spring Bean ...如果有更接近Servlet Spec或Tomcat的解决方案特定的库,将不胜感激。
答案 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应用程序的某些方法。