从java代码停止嵌入Tomcat

时间:2017-08-31 01:36:06

标签: java tomcat embedded-tomcat-8

这可能是一个新手问题,但我仍然需要帮助!!

我有一个java类成功启动嵌入式Tomcat,如下所示:

    public class Main {

    private static Tomcat tomcat;

    public static void main(String[] args) throws Exception {

        String webappDirLocation = "webapps/";
        tomcat = new Tomcat();

        String webPort = System.getenv("PORT");
        if(webPort == null || webPort.isEmpty()) {
            webPort = "8080";
        }

        tomcat.setPort(Integer.valueOf(webPort));
        StandardContext ctx = (StandardContext) tomcat.addWebapp("/", new File(webappDirLocation).getAbsolutePath());

        tomcat.start();
        tomcat.getServer().await();
    }
}

我的问题是,¿我怎么能阻止它?

我尝试为此目的添加另一个功能,如下所示:

    public static void stopTomcat() throws Exception {

    if (tomcat.getServer() != null) {
        tomcat.stop();
        tomcat.destroy();
    }
}

从主方法调用它:

        if (args.length > 0 && args[0].equals("stopTomcat")) {
             stopTomcat();
             return;
        }

然而,它不起作用。我遇到一个线程异常:

Exception in thread "main" java.lang.NullPointerException

如何获取正在运行的当前Tomcat服务器变量以停止tomcat?

我只需要能够从命令行运行一个java类来停止Tomcat,我相信它是可行的。使用catalina.bat或Tomcat.exe是不可能的,因为这是tomcat的可嵌入版本。

任何帮助都会非常感激!!

此致!!

1 个答案:

答案 0 :(得分:1)

您可能正在运行两次脚本。一旦启动服务器,另一次停止它。

如果只运行一次,你仍然可以引用Tomcat对象,因此可以在其上调用stop。 如果没有,它将为null,或者将是一个完全不同的实例。

下面的代码简要介绍了如何从同一个脚本中停止Tomcat。

    String webappDirLocation = "webapps/";
    Tomcat tomcat = new Tomcat();

    Runnable task2 = () -> {  try {
        Thread.sleep(5000);
        System.out.println("Stopping Tomcat");
        tomcat.stop();
    } catch (Exception e) {
        // TODO Auto-generated catch block
    } };

    // start the thread
    new Thread(task2).start();

    String webPort = System.getenv("PORT");
    if (webPort == null || webPort.isEmpty()) {
        webPort = "8080";
    }

    tomcat.setPort(Integer.valueOf(webPort));
    tomcat.addWebapp("/", new File(webappDirLocation).getAbsolutePath());

    tomcat.start();
    tomcat.getServer().await();

除了计时器,您还可以在按键时停止服务器:

    ... 
    tomcat.start();
    //      tomcat.getServer().await();

    System.out.print("Press key to stop ");     
    if(System.in.read()!=-1) {
        System.out.print("Stopping");
        tomcat.stop();
    }