很多人做spring boot service release的时候,以为用kill -15就可以优雅shutdown了,其实不然,这只是操作系统级别的优雅shutdown(相对kill -9 force shutdown而言)。但是spring boot 默认的退出方式并不是优雅退出,app没有等待存量线程完成就退出了。下面我来验证它并给出解决方案。
1 验证默认退出并非线程安全
1.先添加如下api代码
/**
* @Author 公众号: IT三明治
* @Date 2024/6/13
* @Description:
*/
@RestController
@RequestMapping("/api")
@Slf4j
public class DemoController {
@GetMapping("/{userId}")
public ResultVo<Object> getUserInfo(@PathVariable String userId) throws InterruptedException {
log.info("userId:{}", userId);
for (int i = 0; i < 100; i++) {
log.info("querying user info for {}, waiting times: {}", userId, i);
Thread.sleep(1000);
}
return ResultVo.ok();
}
}
2.发送一个api请求
3.执行shutdown Ctrl+F2 (类似linux kill -15/ kill -2, system level是优雅的).
看看我们的shutdown日