我在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停止它?
答案 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();
}