定时任务线程池的使用

1、配置定时任务启动

java 复制代码
@SpringBootApplication
@EnableScheduling
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

}

2、具体使用

java 复制代码
import org.springframework.scheduling.TaskScheduler;

@Component
public class TaskServiceImpl extends TaskService {

    // 预设的定时任务名称
    private final Map<String, ScheduledFuture<?>> scheduledJobs = new HashMap<>();

    @Resource
    private TaskScheduler taskScheduler;

    @Override
    public boolean startJob(String key, String croon) {
        log.info("================ ⏹️ 正在启动定时任务{} ================", key);
        try {
            // 校验cron表达式是否有效
            if(!CronExpression.isValidExpression(cron)){
                // todo cron表达式无效处理    
            }
                    
            // 取消已存在的任务
            this.cancelJob(key);

            // 创建新的定时任务
            CronTrigger cronTrigger = new CronTrigger(cron);
            Runnable jobTask = () -> {
                // todo 任务内容
            };
            ScheduledFuture<?> future = taskScheduler.schedule(jobTask, cronTrigger);
            scheduledJobs.put(node.getCode(), future);

            Date nextExecutionTime = cronTrigger.nextExecutionTime(new SimpleTriggerContext());
            log.info("✅ 定时任务 '{}' 已启动,cron表达式: {},下一次执行时间:{}", key, cron, DateUtils.parseDateToStr("yyyy-MM-dd HH:mm:ss", nextExecutionTime));
        } catch (Exception e) {
            log.error("❌ 启动定时任务 '{}' 失败", key);
            return false;
        }
        return true;
    }

    @Override
    public void cancelJob(String key) {
        ScheduledFuture<?> future = scheduledJobs.remove(key);
        if (future != null && !future.isCancelled()) {
            future.cancel(false);
            log.info("⏹️  定时任务 '{}' 已取消", nodeCode);
        }
    }

}

核心执行为

java 复制代码
ScheduledFuture<?> future = taskScheduler.schedule(jobTask, cronTrigger);

TaskScheduler是spring自带的定时任务线程池,可以在指定时间(cron)将预设任务投入线程池中并行执行,该线程池默认线程数为4,应用于需要动态更改时间或者启用关闭的定时任务

相关推荐
码兄科技4 小时前
实战:基于Spring Boot + UniApp的地理信息小程序开发
spring boot·后端·uni-app
腾讯云云开发6 小时前
腾讯云 CloudBase 登上 WAIC:我们为 Agent 重新设计了云的生产线
后端
星栈6 小时前
从装一堆工具到看懂 Node 工程化思维:我的项目复盘记录
后端·node.js
65岁退休Coder6 小时前
LangChain v1.3.4 笔记 - 05 Agent 上下文记忆
后端
颜酱6 小时前
04 | 召回前置准备:搭好召回所需的四个数据库
前端·人工智能·后端
JaneConan7 小时前
鸿蒙 韶非 UI 系列:能力调用 startAbilityForResult,跳能力拿回参,鸿蒙能力路由入门
后端·harmonyos
晴空了无痕7 小时前
从 Go 基础到 K8s:一条可落地的 Go 服务端成长路线
开发语言·后端·golang·kubernetes
用户8356290780517 小时前
如何使用 Python 在 Excel 中添加、编辑和删除超链接
后端·python
花椒技术7 小时前
原本要 2 天的服务端冒烟前置审查,为什么 3 分半就能出报告?|QA 质量交付实践(三)
后端·ai编程·测试
达达尼昂7 小时前
AI 编程的工程化实践:Flutter AI Harness 的设计与落地
人工智能·后端·全栈