Skip to content

feat: add graceful shutdown hook for task executor#570

Open
muverystrong wants to merge 1 commit intoLianjiaTech:developfrom
muverystrong:feat/gracefule_shutdown_worker
Open

feat: add graceful shutdown hook for task executor#570
muverystrong wants to merge 1 commit intoLianjiaTech:developfrom
muverystrong:feat/gracefule_shutdown_worker

Conversation

@muverystrong
Copy link
Copy Markdown
Contributor

背景:
在关机的时候,很多已经拉取的任务还没执行完。

@muverystrong muverystrong requested a review from fengyizhu March 27, 2026 06:23
@szl97
Copy link
Copy Markdown
Collaborator

szl97 commented Mar 27, 2026

@claude 检查提交的代码,使用中文回复

@szl97
Copy link
Copy Markdown
Collaborator

szl97 commented Mar 27, 2026

Claude finished @szl97's task —— View job


代码审查结果

任务清单:

  • 读取修改的 TaskExecutor.java 文件
  • 分析优雅关闭实现的正确性和最佳实践
  • 提供详细的代码审查反馈

代码审查反馈

我已仔细审查了 TaskExecutor.java 中新增的优雅关闭功能。总体实现思路正确,但有几个需要注意的问题:

✅ 优点

  1. 正确的关闭流程:先调用 shutdown() 停止接受新任务,再用 awaitTermination() 等待现有任务完成
  2. 超时处理:设置了60秒的等待时间,避免无限等待
  3. 强制终止机制:超时后调用 shutdownNow() 强制中断正在执行的任务
  4. 中断处理:正确处理了 InterruptedException,并恢复中断状态

⚠️ 需要改进的地方

1. 日志记录问题 (api/server/src/main/java/com/ke/bella/openapi/TaskExecutor.java:17)

System.out.println("开始关闭线程池");
  • 问题:使用 System.out.println 在生产环境中不合适
  • 建议:使用日志框架(如SLF4J)记录关闭过程,便于监控和故障排查

2. 缺少详细的关闭状态日志

  • 建议:添加更多日志记录关闭过程的各个阶段,如等待完成、强制终止等状态

3. 硬编码的等待时间 (api/server/src/main/java/com/ke/bella/openapi/TaskExecutor.java:20)

if(!executor.awaitTermination(60, TimeUnit.SECONDS))
  • 建议:将60秒等待时间配置化,可通过配置文件或环境变量调整

4. 线程池大小 (api/server/src/main/java/com/ke/bella/openapi/TaskExecutor.java:13)

static ScheduledExecutorService executor = Executors.newScheduledThreadPool(1000, tf);
  • 注意:1000个线程的线程池可能过大,建议根据实际业务需求和服务器资源调整

📝 改进建议

// 建议的改进版本(示例)
static {
    Runtime.getRuntime().addShutdownHook(new Thread(() -> {
        logger.info("开始关闭任务执行器线程池...");
        executor.shutdown();
        try {
            int shutdownTimeout = getShutdownTimeout(); // 从配置读取
            if(!executor.awaitTermination(shutdownTimeout, TimeUnit.SECONDS)) {
                logger.warn("等待任务完成超时,强制关闭线程池");
                executor.shutdownNow();
                if(!executor.awaitTermination(5, TimeUnit.SECONDS)) {
                    logger.error("无法正常关闭线程池");
                }
            } else {
                logger.info("任务执行器线程池已成功关闭");
            }
        } catch (InterruptedException e) {
            logger.error("关闭线程池过程中被中断", e);
            executor.shutdownNow();
            Thread.currentThread().interrupt();
        }
    }, "bella-worker-shutdown"));
}

🎯 总结

这个实现基本满足了优雅关闭的需求,能够在应用关闭时等待现有任务完成。建议主要集中在日志记录的改进和配置的灵活性上,这样可以更好地适应生产环境的需要。


查看任务执行详情

@muverystrong muverystrong force-pushed the feat/gracefule_shutdown_worker branch from 865fe4a to ff6576d Compare March 27, 2026 06:23
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants