【问题标题】:Prevent (tomcat) web application from starting if configuration incomplete如果配置不完整,防止 (tomcat) Web 应用程序启动
【发布时间】:2018-11-14 18:52:26
【问题描述】:

如何在 Web 应用程序启动(Tomcat 或其他)上设置“配置检查”,如果不满足条件,应用程序不应启动。

假设应用程序需要文件 /tmp/dummy 存在于 fs 上才能启动。所以我有类似的东西

public class TestConfig {

    public static void TestServerConfiguration()  {
        if (! new File("/tmp/dummy").exists()) {
            // don't start this web application ... 
        }
    }

}

我应该在哪里加入这个测试?

谢谢!

【问题讨论】:

    标签: tomcat web-applications startup


    【解决方案1】:

    我会选择ServletContextListner。与 servlet 答案一样,它不会停止 Tomcat,但会阻止加载 Web 应用程序。与 servlet 答案相比的一个优势来自 Javadoc:

    在 Web 应用程序中的任何过滤器或 servlet 初始化之前,所有 ServletContextListener 都会收到上下文初始化通知。

    举个例子:

    import javax.servlet.ServletContextEvent;
    import javax.servlet.ServletContextListener;
    import javax.servlet.annotation.WebListener; 
    
    @WebListener
    public class FileVerifierContextListener implements ServletContextListener {
    
        @Override
        public void contextInitialized(ServletContextEvent sce) {
            // verify that the file exists.  if not, throw a RuntimeException
        }
    
        @Override
        public void contextDestroyed(ServletContextEvent sce) {
        }
    }
    

    以上假设您的web.xml 指定了Servlet 3.0 或更高版本的环境(或者您根本没有web.xml):

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
             version="3.1">
    </web-app>
    

    如果您使用的是较低的 servlet 规范,那么您需要删除 @WebListener 注释并在 web.xml 中声明侦听器:

    <web-app ...>
       <listener>
        <listener-class>
                 com.example.package.name.FileVerifierContextListener 
            </listener-class>
       </listener>
    </web-app>
    

    【讨论】:

    • Eclipse 不喜欢监听器中的@Override 注解。否则,这是我将采用的解决方案!
    • 为什么Eclipse不喜欢监听器中的@Override注解?此行的多个标记 - FileVerifierContextListener 类型的方法 contextInitialized(ServletContextEvent) 必须覆盖超类方法 - 实现 javax.servlet.ServletContextListener.contextInitialized 正如预期的那样,代码是好的(Maven 构建它没有任何问题)。我错过了什么?这是我将采用的解决方案!我明天再确认。
    • @StefanG - @Override 完全不需要。我不确定为什么 Eclipse 不喜欢它——也许是因为它是用于接口,而不是类。我会删除它,因为它不需要。
    • 找到了。这是“编译器合规级别”……设置为 1.5。我把它改成了 1.8,Eclipse 现在很开心。
    【解决方案2】:

    一个想法(但可能还有其他想法)是实现一个 servlet,它会在条件为假时执行此检查并退出。您需要在上下文部署开始时使用足够的 load-on-startup 标签运行它。 web.xml 将如下所示:

    <servlet>
      <display-name>startup condition servlet</display-name>
      <servlet-name>startup condition</servlet-name>
      <servlet-class>com.xxx.yyy.ConditionChecker</servlet-class>
      <load-on-startup>1</load-on-startup>
      <init-param>
        <param-name>FILE_TO_CHECK</param-name>
        <param-value>/tmp/dummy</param-value>
      </init-param>
    </servlet>
    

    当条件不满足(/tmp/dummy 不存在)时,此 servlet 可以执行 System.exit(1)。 请不要这会杀死Tomcat。不完全停止部署过程。如果有人想对此进行微调,您可以编辑我的帖子。

    【讨论】:

    • 服务器必须保持运行。我无法解决您的想法,但无法正常工作。 stdunbar 提供的解决方案就是我的问题的解决方案。
    猜你喜欢
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-21
    • 2013-04-08
    • 1970-01-01
    • 2012-05-01
    相关资源
    最近更新 更多