如何正常关闭嵌入式jetty服务器应用程序?

时间:2015-07-13 07:13:02

标签: java spring servlets jetty spring-boot

我在war文件中使用jetty嵌入式服务器设置了我的springboot项目。基本上,我的war文件是一个可执行文件。

我设置了实现ServletContextInitializer的主类:

@Configuration
@EnableAutoConfiguration
@ComponentScan
public class CrawlerApplication implements ServletContextInitializer {


  public static void main(final String[] args) {
    SpringApplication.run(CrawlerApplication.class, args);
  }

  @Override
  public void onStartup(ServletContext servletContext) throws ServletException {
    servletContext.setInitParameter("mainComponentClass", "com.datalyst.crawler.component.CrawlerServiceTopComponent");
  }
}

然后我也有配置java文件

@Configuration
public class CrawlerConfig {

  @Bean
  public EmbeddedServletContainerFactory embeddedServletContainerFactory(){
    return new JettyEmbeddedServletContainerFactory(8080);
  }

}

这是build.gradle

apply plugin: 'war'

war {
     baseName = 'crawler-service'
     version = '0.0.1-SNAPSHOT'
}
configurations {
  providedRuntime
}

bootRepackage{
  enabled = true
}

dependencies {
    compile spec.external.springBootStarterWeb
    compile 'org.springframework:spring-web:4.1.6.RELEASE'

    providedRuntime("org.springframework.boot:spring-boot-starter-jetty")
}

现在,我设法构建它并通过执行以下命令启动服务器: nohup java -jar crawler-service-0.0.1-SNAPSHOT.war > crawler-service.log &

我正在使用nohup将其作为后台服务运行。

现在,当我想停止该程序时,我必须手动调查ps aux | grep java的对应PID并通过执行sudo kill PID优雅地关闭。但我希望它更好。

有没有办法优雅地关闭服务?例如,在启动时为该服务分配STOP_PORT,然后使用该STOP_PORT停止它?

1 个答案:

答案 0 :(得分:1)

这是我用来关闭Jetty 9的方法。它是通过我的Jsf应用程序上的按钮调用的:

public void shutdown() {
    log.info("Stopping server ...");
    new Thread() {
        @Override
        public void run() {
            try {
                // workaround (maybe you can remove next line):
                Thread.sleep(3000);

                for (Handler handler : server.getHandlers()) {
                    handler.stop();
                }
                server.stop();
                server.getThreadPool().join();
            } catch (Exception ex) {
                System.out.println("Failed to stop Jetty");
            }
        }
    }.start();
}