如何调试Jenkins的ExecutorServiceUtils$FatalRejectedExecutionException异常
调试Jenkins中每秒大量出现的ExecutorService关闭异常
从你提供的堆栈信息来看,异常核心是ExecutorServiceUtils$FatalRejectedExecutionException,提示执行器服务正在关闭时无法提交任务,调用链最终指向WaitForConditionStep$Execution.retry——说明是某个等待条件的步骤在重试时,对应的CPS VM线程池已被关闭,但重试逻辑仍在尝试提交任务。以下是具体调试步骤:
1. 定位关联的流水线任务
- 先排查Jenkins中正在运行、最近失败或异常终止的流水线,重点找使用了
waitForCondition或自定义等待逻辑(比如轮询资源、等待外部事件)的任务。 - 打开Jenkins脚本控制台(Manage Jenkins > Script Console),执行以下脚本列出所有活跃的流水线执行实例,关联到具体任务:
import org.jenkinsci.plugins.workflow.flow.FlowExecutionList FlowExecutionList.all().each { exec -> println "任务名称: ${exec.owner.name}, 执行ID: ${exec.id}, 是否活跃: ${exec.isActive()}" } - 重点关注
isActive()返回false但仍有回调执行的任务,这类任务最可能出现执行器关闭后仍提交任务的情况。
2. 检查核心插件版本
- 堆栈涉及的核心插件:
workflow-cps、workflow-support、workflow-step-api,确认这些插件是否为最新稳定版——旧版本可能存在重试逻辑未正确处理执行器关闭的bug。 - 同时检查自定义插件或共享库中是否有手动使用
WaitForConditionStep、或直接向CPS线程池提交任务的代码,这类自定义逻辑可能未处理执行器关闭的异常场景。
3. 启用精细化日志
- 进入Jenkins日志配置页面(Manage Jenkins > System Log > Log Levels),将以下包的日志级别调整为
FINER或FINEST:org.jenkinsci.plugins.workflow.cpsorg.jenkinsci.plugins.workflow.stepshudson.remoting.SingleLaneExecutorService
- 精细化日志会捕获任务提交时的上下文信息,比如具体是哪个流水线步骤触发了重试,以及执行器关闭的触发原因。
4. 分析线程转储
- 当异常大量出现时,生成Jenkins线程转储(Manage Jenkins > System Information > Thread Dump),重点查找:
- 处于
WAITING或TIMED_WAITING状态的CpsThread - 正在执行
WaitForConditionStep相关逻辑的线程 - 标记为
SHUTTING_DOWN或TERMINATED的ExecutorService实例,关联对应的任务ID
- 处于
- 线程转储能帮你定位到哪些线程还在持有已关闭执行器的引用,进而锁定异常来源。
5. 临时缓解与验证
- 先尝试终止所有疑似有问题的流水线任务,观察异常是否停止,以此确认问题是否来自特定任务。
- 如果是插件bug,临时降级或升级到已知稳定版本验证;如果是自定义代码问题,在重试逻辑中添加执行器状态检查:
// 示例:提交任务前检查执行器是否未关闭 if (!executorService.isShutdown()) { executorService.submit(task) }
内容的提问来源于stack exchange,提问作者Xavier Raynaud
相关产品推荐
相关产品推荐

