springboot 优雅关闭

男娘i 2023-07-17 06:40 90阅读 0赞

springboot 优雅关闭

应用:停机升级服务时, 若仍有线程运行,可等待一段时间后关闭应用;若线程未执行完成关闭应用,输出相应提示

#

**************************

示例

*********************

config 层

GracefulShutDown

  1. @Component
  2. public class GracefulShutDown implements TomcatConnectorCustomizer,
  3. ApplicationListener<ContextClosedEvent> {
  4. private Logger logger= LoggerFactory.getLogger(GracefulShutDown.class);
  5. private Connector connector;
  6. @Override
  7. public void customize(Connector connector) {
  8. this.connector=connector;
  9. }
  10. @Override
  11. public void onApplicationEvent(ContextClosedEvent contextClosedEvent) { //容器关闭之前调用
  12. this.connector.pause();
  13. Executor executor=this.connector.getProtocolHandler().getExecutor();
  14. if (executor instanceof ThreadPoolExecutor){
  15. ThreadPoolExecutor threadPoolExecutor=(ThreadPoolExecutor) executor;
  16. threadPoolExecutor.shutdown(); //若无线程运行,立即关闭线程池;若有线程运行则等待
  17. try {
  18. if (!threadPoolExecutor.awaitTermination(10, TimeUnit.SECONDS)){
  19. //等待10s,为false表示线程池没有关闭,随后强制关闭,此时正在执行的任务中断,只执行了一部分,控制台输出warn日志
  20. logger.warn("10秒后线程未关闭,将强制关闭");
  21. }else {
  22. System.out.println("线程池已关闭:"+ LocalDateTime.now());
  23. } //为true,线程池已经关闭,任务执行完成
  24. }catch (Exception e){
  25. e.printStackTrace();
  26. }
  27. }
  28. }
  29. }

*********************

controller 层

HelloController

  1. @RestController
  2. public class HelloController {
  3. @RequestMapping("/hello")
  4. public String hello(){
  5. try{
  6. Thread.sleep(2000);
  7. }catch (Exception e){
  8. System.out.println(e.getMessage());
  9. }
  10. return "hello world";
  11. }
  12. @RequestMapping("/hello2")
  13. public String hello2(){
  14. try{
  15. Thread.sleep(20000);
  16. }catch (Exception e){
  17. System.out.println(e.getMessage());
  18. }
  19. return "hello world";
  20. }
  21. }

**************************

使用测试

/hello

  1. ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkzMTYyNQ_size_16_color_FFFFFF_t_70][]

说明:ctrl+c时任务执行结束,线程池立即关闭

/hello2

  1. ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkzMTYyNQ_size_16_color_FFFFFF_t_70 1][]

说明:ctrl+c时任务没有执行结束,线程池没有立即关闭;等待10s后线程池强制关闭,任务没有执行完成,无返回结果

发表评论

表情:
评论列表 (有 0 条评论,90人围观)

还没有评论,来说两句吧...

相关阅读

    相关 springboot 优雅关闭

    -------------------- springboot 优雅关闭   应用:停机升级服务时, 若仍有线程运行,可等待一段时间后关闭应用;若线程未执行完成关闭应

    相关 优雅关闭线程

    在Java中,有stop()、destory()等方法,但这些方法官方明确不建议使用。原因很简单,如果强制杀死线程,则线程中所使用的资源,例如文件描述符、网络连接等无法正常关闭

    相关 Linux下优雅关闭Java程序

    最近用maven工程的形式打jar包写一个小型服务器,于是希望提供脚本的形式启动和关闭服务器。 网上浏览到一些文章,基本思路是: 1.在start.sh中启动Java程序,

    相关 优雅关闭vertx

    00 前言 什么叫优雅停机?简单说就是,在对应用进程发送停止指令之后,能保证正在执行的业务操作不受影响。应用接收到停止指令之后的步骤应该是,停止接收访问请求,等待已经接收到的