如何配置Quarkus接收SIGTERM时以0状态码优雅退出
配置Quarkus根据信号返回不同退出码
核心实现思路
Quarkus默认处理SIGTERM时会返回非0退出码,要实现需求,只需通过自定义信号监听器+Quarkus官方退出API,单独处理SIGTERM信号并指定退出码,其他信号保持默认逻辑即可。
具体步骤
编写SIGTERM信号监听器
创建一个CDI bean,在应用启动时注册SIGTERM的处理逻辑,调用官方API指定退出码为0:import io.quarkus.runtime.Quarkus; import jakarta.annotation.PostConstruct; import jakarta.enterprise.context.ApplicationScoped; import sun.misc.Signal; import sun.misc.SignalHandler; @ApplicationScoped public class SigtermExitHandler { @PostConstruct void registerHandler() { Signal.handle(new Signal("TERM"), signal -> { // 触发优雅退出并指定状态码0 Quarkus.asyncExit(0); }); } }注:
sun.misc.Signal是JDK内部API,Quarkus社区在类似场景中普遍使用;若需兼容性更强的方案,可替换为第三方信号处理库,但该实现已能覆盖绝大多数部署场景。确认优雅退出配置
确保Quarkus优雅退出功能处于启用状态(默认开启),可在application.properties中调整超时时间:# 允许请求处理完成的最大超时时间,按需调整 quarkus.shutdown.timeout=10s
官方方案依据
Quarkus的Quarkus.asyncExit(int)是官方提供的自定义退出状态码API,结合信号监听器是社区推荐的自定义信号退出逻辑的标准方式。虽然官方文档未单独给出SIGTERM返回0的示例,但该API的设计初衷就是支持这类自定义退出场景。
适配Render托管场景
通过上述配置,Render闲置触发的SIGTERM会让应用以状态码0优雅退出,避免被平台判定为错误;而应用崩溃、未捕获异常等场景会保持默认的非0退出码,完美区分正常与错误退出场景。
内容的提问来源于stack exchange,提问作者Olivier Cailloux
相关产品推荐
相关产品推荐

