应用重启正在执行的任务会如何处理?

本文探讨了在系统重启时,http请求、消息消费和异步任务的处理情况。通过模拟场景,发现请求执行过程中关闭应用会导致请求无法完成,但通过优雅关机配置,可以确保已接收请求执行完毕。消息消费中,未确认的消息会在应用关闭后重新进入队列。对于异步任务,线程池配置的调整能保证任务在应用重启时得以完成。
摘要由CSDN通过智能技术生成

1.前言

近日就系统重启引发了一些思考,在系统重启过程中,正在进行的请求会如何被处理?正在消费的消息会不会丢失?异步执行的任务会不会被中断?既然存在这些问题,那我们的应用程序是不是就不能重启?但是,我们的应用程序随着版本迭代也在不断重启为什么这些问题没有出现呢?还是应用做了额外处理?带着这些疑问,结合场景模拟,看看实际情况怎么处理。

2. 场景

2.1 http请求

2.1.1 创建请求

@RestController
public class ShutDownController {

    @RequestMapping("shut/down")
    public String shutDown() throws InterruptedException {
        TimeUnit.SECONDS.sleep(20);
        return "hello";
    }
}
复制代码

2.1.2 调用请求

http://localhost:8080/shut/down

2.1.3 模拟重启

kill -2 应用pid
复制代码

2.1.4 现象

2.1.5 结论

请求执行过程中,关闭应用程序出现无法访问提示

2.1.6 开启优雅关机

如上出现的现象对用户来说很不友好,会造成用户一脸懵逼,那么有没有什么措施可以避免这种现象的出现呢?是否可以在应用关闭前执行完已经接受的请求,拒绝新的请求呢?答案可以的,只需要在配置文件中新增优雅关机配置

server:
  shutdown: graceful # 设置优雅关闭,该功能在Spring Boot2.3版本中才有。注意:需要使用Kill -2 触发来关闭应用,该命令会触发shutdownHook

spring:
  lifecycle:
    timeout-per-shutdown-phase: 30s # 设置缓冲时间,注意需要带上时间单位(该时间用于等待任务执行完成)
复制代码

添加完配置后,再次执行2.1.22.1.3流程,就会看到如下效果

  • 6
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值