You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置Quarkus接收SIGTERM时以0状态码优雅退出

配置Quarkus根据信号返回不同退出码

核心实现思路

Quarkus默认处理SIGTERM时会返回非0退出码,要实现需求,只需通过自定义信号监听器+Quarkus官方退出API,单独处理SIGTERM信号并指定退出码,其他信号保持默认逻辑即可。

具体步骤

  1. 编写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社区在类似场景中普遍使用;若需兼容性更强的方案,可替换为第三方信号处理库,但该实现已能覆盖绝大多数部署场景。

  2. 确认优雅退出配置
    确保Quarkus优雅退出功能处于启用状态(默认开启),可在application.properties中调整超时时间:

    # 允许请求处理完成的最大超时时间,按需调整
    quarkus.shutdown.timeout=10s
    

官方方案依据

Quarkus的Quarkus.asyncExit(int)是官方提供的自定义退出状态码API,结合信号监听器是社区推荐的自定义信号退出逻辑的标准方式。虽然官方文档未单独给出SIGTERM返回0的示例,但该API的设计初衷就是支持这类自定义退出场景。

适配Render托管场景

通过上述配置,Render闲置触发的SIGTERM会让应用以状态码0优雅退出,避免被平台判定为错误;而应用崩溃、未捕获异常等场景会保持默认的非0退出码,完美区分正常与错误退出场景。

内容的提问来源于stack exchange,提问作者Olivier Cailloux

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 04:15:41