使用Java关闭Tomcat实例

使用Java关闭Tomcat实例,java,tomcat,Java,Tomcat,我正在运行一个使用tomcat作为容器的应用程序——在启动时,需要找到并加载几个文件。但是,如果其中一个文件不存在或无法读取,我希望记录异常并退出应用程序,我目前正在使用System.exit(1)。。。然而,有没有更好的方法 非常感谢您的帮助 < P>你应该考虑嵌入Tomcat < /St>,即让你的代码> AppS启启动器Cype执行这些检查,然后启动Tomcat: public class AppStarter { public static void main(String[]

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


非常感谢您的帮助

< P>你应该考虑<强>嵌入Tomcat < /St>,即让你的代码> AppS启启动器Cype执行这些检查,然后启动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教程。

你应该考虑<强>嵌入Tomcat < /St>,即让你的代码> AppS启启动器类执行这些检查,然后启动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教程。

我不知道这是否适合您的需要,但它确实适用于我的应用程序。听众是 在应用程序启动时调用(如果在web.xml中声明):

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

your.package.TestServletListener
在那里,您可以进行测试,如果一个关闭线程失败,您可以调用它。它将连接到Tomcats shutdown端口,并以字符串形式发送shutdown命令:

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();
        }
    }
}
}
公共类TestServletListener实现ServletContextListener{
@凌驾
公共void contextInitialized(ServletContextEvent arg0){
System.out.println(“启动应用程序,运行5个测试…”);
//做测试。。。
对于(int i=0;i<5;i++){
系统输出打印项次(“测试…”+i);
等待(1000);
}
//如果测试失败,则调用:
System.out.println(“测试失败!”);
新建关机任务().start();
}
@凌驾
公共无效上下文已销毁(ServletContextEvent arg0){
系统输出打印(“停止应用程序,清理(需要3秒)…”;
等待(3000);
系统输出打印项次(“完成”);
}
私人空位等待(int i){
试一试{
睡眠(i);
}捕捉(中断异常e){
e、 printStackTrace();
}
}
类shutdowntTask扩展线程{
@凌驾
公开募捐{
试一试{
插座s=新插座(“127.0.0.1”,8015);
PrintStream os=新的PrintStream(s.getOutputStream());
os.println(“关闭”);
s、 close();
System.out.println(“关闭服务器…”);
}捕获(IOE异常){
e、 printStackTrace();
}
}
}
}
您需要确保shutdown端口和shutdown命令与Tomcats server.xml同步:

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

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

我不知道这是否符合您的需要,但它确实适用于我的应用程序。听众是 在应用程序启动时调用(如果在web.xml中声明):

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

your.package.TestServletListener
在那里,您可以进行测试,如果一个关闭线程失败,您可以调用它。它将连接到Tomcats shutdown端口,并以字符串形式发送shutdown命令:

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();
        }
    }
}
}
公共类TestServletListener实现ServletContextListener{
@凌驾
公共void contextInitialized(ServletContextEvent arg0){
System.out.println(“启动应用程序,运行5个测试…”);
//做测试。。。
对于(int i=0;i<5;i++){
系统输出打印项次(“测试…”+i);
等待(1000);
}
//如果测试失败,则调用:
System.out.println(“测试失败!”);
新建关机任务().start();
}
@凌驾
公共无效上下文已销毁(ServletContextEvent arg0){
系统输出打印(“停止应用程序,清理(需要3秒)…”;
等待(3000);
系统输出打印项次(“完成”);
}
私人空位等待(int i){
试一试{
睡眠(i);
}捕捉(中断异常e){
e、 printStackTrace();
}
}
类shutdowntTask扩展线程{
@凌驾
公开募捐{
试一试{
插座s=新插座(“127.0.0.1”,8015);
PrintStream os=新的PrintStream(s.getOutputStream());
os.println(“关闭”);
s、 close();
System.out.println(“关闭服务器…”);
}捕获(IOE异常){
e、 printStackTrace();
}
}
}
}
您需要确保shutdown端口和shutdown命令与Tomcats server.xml同步:

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

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

不幸的是,我无法将Tomcat嵌入到应用程序中。。我猜System.exit()可能是唯一的方法(除了通过系统调用调用应用程序上的kill-15之外),您可以在servlet的构造函数中抛出异常,从而阻止应用程序启动,但Tomcat仍将运行。除了
System.exit()
之外,我看不到任何其他方法。我使用命令行上的
catalinastop
停止tomcat。如果路径设置正确会不会有帮助?@Piro我不理解这个问题。我可以从命令行编写
catalina start
catalina stop
来启动/停止Tomcat。但path必须设置为tomcat二进制文件,其中catalina脚本/程序为。很遗憾,我无法将tomcat嵌入到应用程序中。。我猜System.exit()可能是唯一的方法(除了通过系统调用调用应用程序上的kill-15之外),您可以在servlet的构造函数中抛出异常,从而阻止应用程序启动,但Tomcat仍将运行。除了
System.exit()
之外,我看不到任何其他方法。我使用命令行上的
catalinastop
停止tomcat。如果路径设置正确会不会有帮助?@Piro我不理解这个问题。我可以从命令行编写
catalina start
catalina stop
来启动/停止Tomcat。但路径必须设置为tomcat二进制文件