如何以正确的方式closuresSpring Boot应用程序?

在Spring Boot文档中,他们说'每个SpringApplication都会向JVM注册一个closures钩子,以确保ApplicationContext在退出时正常closures。

当我在shell命令上单击ctrl+c时,应用程序可以正常closures。 如果我在生产机器上运行应用程序,则必须使用命令java -jar ProApplicaton.jar 。 但是我不能closuresshellterminal,否则会closures这个进程。

如果我像nohup java -jar ProApplicaton.jar &那样运行命令,我不能使用ctrl+c来正常closures它。

在生产环境中启动和停止Spring Boot应用程序的正确方法是什么?

如果使用执行器模块,则可以通过JMXHTTPclosures应用程序(如果启用了端点)(将endpoints.shutdown.enabled=true添加到application.properties文件中)。

/shutdown – 允许应用程序正常关机(默认情况下不启用)。

根据端点的暴露方式,敏感参数可以用作安全提示。 例如,敏感端点在通过HTTP访问时将需要用户名/密码(或者如果未启用Web安全性,则只需将其禁用)。

从Spring启动文档

至于@让·菲利普·邦德的回答,

这里是maven用户使用spring-boot-starter-actuatorconfigurationHTTP端点closuresspring boot web应用程序的maven快速示例,以便您可以复制和粘贴:

1.Maven pom.xml:

 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> 

2.application.properties:

 #No auth protected endpoints.shutdown.sensitive=false #Enable shutdown endpoint endpoints.shutdown.enabled=true 

所有端点都列在这里 :

发送一个post方法closures应用程序:

 curl -X POST localhost:port/shutdown 

安全注意:

如果您需要auth保护的closures方法,您可能还需要

 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> 

configuration细节 :

您可以让springboot应用程序将PID写入文件,您可以使用pid文件停止或重新启动或使用bash脚本获取状态。 要将PID写入文件,请使用ApplicationPidFileWriter将侦听器注册到SpringApplication,如下所示:

 SpringApplication application = new SpringApplication(Application.class); application.addListeners(new ApplicationPidFileWriter("./bin/app.pid")); application.run(); 

然后编写一个bash脚本来运行spring启动应用程序。 参考 。

现在您可以使用该脚本来启动,停止或重新启动。

这是另一个不需要您更改代码或暴露closures端点的选项。 创build以下脚本并使用它们来启动和停止您的应用程序。

start.sh

 #!/bin/bash java -jar myapp.jar & echo $! > ./pid.file & 

启动您的应用程序并将进程ID保存在文件中

stop.sh

 #!/bin/bash kill $(cat ./pid.file) 

停止使用已保存的进程ID的应用程序

start_silent.sh

 #!/bin/bash nohup ./start.sh > foo.out 2> foo.err < /dev/null & 

如果您需要使用ssh从远程机器或CIpipe道启动应用程序,请使用此脚本来启动您的应用程序。 直接使用start.sh可以让shell挂起。

在例如之后。 重新/部署你的应用程序,你可以重新启动它使用:

 sshpass -p password ssh -oStrictHostKeyChecking=no userName@www.domain.com 'cd /home/user/pathToApp; ./stop.sh; ./silent_start.sh' 

从Spring Boot 1.5开始,就没有开箱即用的正常关机机制。 一些弹簧启动器提供这种function:

  1. https://github.com/jihor/hiatus-spring-boot
  2. https://github.com/gesellix/graceful-shutdown-spring-boot
  3. https://github.com/corentin59/spring-boot-graceful-shutdown

我是nr。的作者。 1.起动器被命名为“Spring Boot的Hiatus”。 它在负载均衡器级别上工作,即简单地将服务标记为OUT_OF_SERVICE,而不以任何方式干扰应用程序上下文。 这允许进行正常关机,并且意味着如果需要的话,该服务可以停止服务一段时间,然后恢复原状。 缺点是不能停止JVM,你必须用kill命令来完成。 当我用集装箱运行所有东西的时候,这对我来说没什么大不了的,因为无论如何,我将不得不停下来取出集装箱。

第2号和第3号或多或less是由安迪·威尔金森(Andy Wilkinson)撰写的。 他们单向工作 – 一旦触发,他们最终closures的上下文。

Spring Boot提供了几个应用程序监听器,同时尝试创build应用程序上下文,其中一个是ApplicationFailedEvent。 我们可以使用知道天气的应用上下文初始化或不。

  import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.context.event.ApplicationFailedEvent; import org.springframework.context.ApplicationListener; public class ApplicationErrorListener implements ApplicationListener<ApplicationFailedEvent> { private static final Logger LOGGER = LoggerFactory.getLogger(ApplicationErrorListener.class); @Override public void onApplicationEvent(ApplicationFailedEvent event) { if (event.getException() != null) { LOGGER.info("!!!!!!Looks like something not working as expected so stoping application.!!!!!!"); event.getApplicationContext().close(); System.exit(-1); } } } 

添加到SpringApplication的上面的监听器类。

  new SpringApplicationBuilder(Application.class) .listeners(new ApplicationErrorListener()) .run(args); 

如果你正在使用maven,你可以使用Maven App的汇编器插件 。

守护程序mojo (embeddedJSW )将输出一个带有start / stop参数的shell脚本。 stop将closures/优雅地杀死你的Spring应用程序。

可以使用相同的脚本将您的Maven应用程序用作Linux服务。