如何以正确的方式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应用程序的正确方法是什么?
如果使用执行器模块,则可以通过JMX
或HTTP
closures应用程序(如果启用了端点)(将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:
- https://github.com/jihor/hiatus-spring-boot
- https://github.com/gesellix/graceful-shutdown-spring-boot
- 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服务。
- @PostConstruct方法上的@Transactional
- 在Spring MVC中redirect到dynamicURL
- 我怎样才能有所有用户login(通过弹簧安全)我的Web应用程序的列表
- 应该在哪里保存@Service注释? 接口还是实现?
- 在@Test之后回滚事务
- Spring启动@ResponseBody不会序列化实体ID
- 匹配的通配符是严格的,但是对元素“tx:annotation-driven”没有声明。
- 获取错误org.springframework.beans.factory.NoSuchBeanDefinitionException:没有定义名为“springSecurityFilterChain”的bean
- JPA @OneToMany – >父 – 子参考(外键)