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

定时执行代码块遇故障失效求助:需每分钟拉取站点数据

解决ScheduledExecutorService故障后停止调度的问题

问题根源

ScheduledExecutorService.scheduleAtFixedRate()的任务如果抛出未捕获的RuntimeException或Error,调度器会直接终止该任务的后续调度——线程池会判定这个任务无法正常执行,不会再继续安排下一次运行。这就是你遇到故障后任务停摆的核心原因。

代码修复:强制捕获所有异常

修改任务逻辑,在任务内部捕获所有可能的异常(包括Error),确保任务始终能正常结束,这样调度器才会按周期持续执行。示例代码:

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class SiteDataFetcher {
    private static final ScheduledExecutorService scheduler = 
        Executors.newSingleThreadScheduledExecutor(r -> new Thread(r, "DataFetcher-Worker"));

    public static void main(String[] args) {
        // 初始延迟0秒,每1分钟执行一次
        scheduler.scheduleAtFixedRate(() -> {
            try {
                // 执行你的站点数据拉取逻辑
                pullSiteData();
            } catch (Exception e) {
                System.err.printf("[%s] 数据拉取失败,1分钟后重试: %s%n", 
                    java.time.LocalDateTime.now(), e.getMessage());
                e.printStackTrace();
            } catch (Error e) {
                // 捕获严重错误(如OOM、栈溢出),避免终止调度
                System.err.printf("[%s] 发生严重错误,1分钟后重试: %s%n", 
                    java.time.LocalDateTime.now(), e.getMessage());
                e.printStackTrace();
            }
        }, 0, 1, TimeUnit.MINUTES);
    }

    private static void pullSiteData() {
        // 这里写实际的拉取逻辑:HTTP请求、数据解析等
        // 模拟故障场景:throw new RuntimeException("站点连接超时");
    }
}

机器崩溃后的恢复方案

如果机器本身崩溃,Java程序会直接终止,此时需要外部守护机制来重启程序并恢复调度:

  • Linux:用systemd将程序注册为服务,配置Restart=always,系统会自动重启崩溃的进程;或者用cron定时检查进程状态,若不存在则启动程序。
  • Windows:创建任务计划,定期检测程序进程,未运行则启动;或者将程序注册为Windows服务,开启失败自动重启。
  • 容器化:如果用Docker部署,设置restart: always参数,容器崩溃后Docker会自动重启实例。

额外优化点

  • 给线程池命名:方便日志排查问题,避免默认的"pool-1-thread-1"这种模糊名称
  • 任务内重试:单次拉取失败时,在任务内部重试2-3次再放弃,减少无效的调度等待
  • 完善日志:记录拉取成功/失败的时间、数据量等细节,便于后续问题排查

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 13:00:46