2

我正在运行一个使用 tomcat 作为容器的应用程序 - 在启动时,需要找到并加载几个文件。但是,如果其中一个文件不存在或无法读取,我想记录异常并退出应用程序,我目前正在使用 System.exit(1) ...但是,有没有更好的这样做的方式?

任何帮助深表感谢!

4

2 回答 2

3

我不知道这是否符合您的需求,但它实际上适用于我的应用程序。如果在 web.xml 中声明了侦听器,则会在应用程序启动时调用它:

<listener>
    <listener-class>your.package.TestServletListener</listener-class>
</listener>

如果失败,您可以在那里进行测试并调用 ShutdownThread。它将连接到 Tomcat 的关闭端口并将关闭命令作为字符串发送:

public class TestServletListener implements ServletContextListener {

@Override
public void contextInitialized(ServletContextEvent arg0) {
    System.out.println("Starting app, running 5 tests ...");

    // do tests ...
    for (int i = 0; i < 5; i++) {
        System.out.println("testing ... " + i);
        waitFor(1000);
    }
    // If a test failed call:
    System.out.println("test failed!");
    new ShutdownTask().start();
}

@Override
public void contextDestroyed(ServletContextEvent arg0) {
    System.out.print("Stopping app, cleaning up (takes 3 sec) ... ");
    waitFor(3000);
    System.out.println("done");
}

private void waitFor(int i) {
    try {
        Thread.sleep(i);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

class ShutdownTask extends Thread {

    @Override
    public void run() {
        try {
            Socket s = new Socket("127.0.0.1", 8015);
            PrintStream os = new PrintStream(s.getOutputStream());
            os.println("shutdown");
            s.close();
            System.out.println("Shutting down server ...");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
}

您需要确保关闭端口和关闭命令与您的 Tomcats server.xml 同步:

...
<Server port="8015" shutdown="shutdown">
...

例如,您可以在 web.xml 中将它们作为上下文参数传递。与 System.exit(...) 一样,如果 Tomcat 使用 SecurityManager 运行,这将不起作用(无需进一步配置)。

于 2013-10-10T17:48:15.963 回答
1

您应该考虑嵌入 Tomcat,即让您的AppStarter班级执行这些检查,然后启动 Tomcat:

public class AppStarter {
    public static void main(String[] args) {
        // Check if everything is ready...
        if (file1.exists() && file2.exists() && condition3) {
            // Start Tomcat here.
        }
        else {
            System.out.println("Invalid configuration.");
        }
    }
}

您可以在 Internet 上找到如何嵌入 Tomcat 教程。

于 2013-10-10T11:02:55.030 回答