首页 > 其他分享 >使用Hutool实现动态定时任务

使用Hutool实现动态定时任务

时间:2024-07-09 15:30:27浏览次数:12  
标签:Cron taskCron Hutool cron taskId 定时 动态 cronTaskMap

项目依赖

首先,您需要在项目中添加Hutool库的依赖。可以在pom.xml中添加以下内容:

<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.8.25</version>
</dependency>

在实现动态定时任务之前,假设我们有一个名为Cron的实体类,包含以下字段:

  • id:ID
  • cronExpression:Cron表达式
@Data
public class Cron {
    private Long id;
    private String cronExpression;

    // 其他字段
}

接下来,假定一个Mapper接口,用于从数据库中获取定时任务配置:

public interface CronMapper {
    List<Cron> list();
}

服务层

在服务层中,实现动态定时任务的创建、更新和管理。首先,创建一个CronService类:

package com.test.cron;

import cn.hutool.cron.CronUtil;
import cn.hutool.cron.task.Task;
import org.springframework.stereotype.Service;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


/**
 * 定时任务服务类
 */
@Service
public class CronService {

    @Resource
    private CronMapper cronMapper;

    private final Map<String, Cron> cronTaskMap = new HashMap<>();
    
    @PostConstruct
    public void initCronTasks() {
        List<Cron> cronList = cronMapper.list();

        for (Cron cron : cronList) {
            String taskId = String.valueOf(cron.getId());
            String cronExpression = cron.getCronExpression();
            cronTaskMap.put(taskId, cron);

            // 创建并注册定时任务
            CronUtil.schedule(taskId, cronExpression, new Task() {
                @Override
                public void execute() {
                    // 从cronTaskMap中获取对应的Cron实体类
                    Cron taskCron = cronTaskMap.get(taskId);
                    if (taskCron != null) {
                        executeTask(taskCron);
                    }
                }
            });
        }
		// 秒级别定时任务
        CronUtil.setMatchSecond(true);
        // 启动定时任务调度器
        CronUtil.start();
    }

    public void updateCronTask(Cron updatedCron) {
        String taskId = String.valueOf(cron.getId());
        String newCronExpression = updatedCron.getCronExpression();
        cronTaskMap.put(taskId, updatedCron);

        // 取消旧的定时任务
        CronUtil.remove(taskId);

        // 重新创建并注册新的定时任务
        CronUtil.schedule(taskId, newCronExpression, new Task() {
            @Override
            public void execute() {
                // 从cronTaskMap中获取对应的Cron实体类
                Cron taskCron = cronTaskMap.get(taskId);
                if (taskCron != null) {
                    executeTask(taskCron);
                }
            }
        });
    }

    private void executeTask(Cron cron) {
        // 这里是你需要执行的任务逻辑
        System.out.println("执行任务: " + cron.getId());
        // 在这里可以使用传入的cron实体类进行进一步的操作
    }
}

初始化定时任务

initCronTasks方法中,我们从数据库中读取所有定时任务配置,然后为每个任务创建并注册定时任务:

@PostConstruct
public void initCronTasks() {
    List<Cron> cronList = cronMapper.list();

    for (Cron cron : cronList) {
        String taskId = cron.getId();
        String cronExpression = cron.getCronExpression();
        cronTaskMap.put(taskId, cron);

        // 创建并注册定时任务
        CronUtil.schedule(taskId, cronExpression, new Task() {
            @Override
            public void execute() {
                // 从cronTaskMap中获取对应的Cron实体类
                Cron taskCron = cronTaskMap.get(taskId);
                if (taskCron != null) {
                    executeTask(taskCron);
                }
            }
        });
    }

    // 启动定时任务调度器
    CronUtil.start();
}

更新定时任务

当需要更新定时任务时,可以调用updateCronTask方法:

public void updateCronTask(Cron updatedCron) {
    String taskId = updatedCron.getId();
    String newCronExpression = updatedCron.getCronExpression();
    cronTaskMap.put(taskId, updatedCron);

    // 取消旧的定时任务
    CronUtil.remove(taskId);

    // 重新创建并注册新的定时任务
    CronUtil.schedule(taskId, newCronExpression, new Task() {
        @Override
        public void execute() {
            // 从cronTaskMap中获取对应的Cron实体类
            Cron taskCron = cronTaskMap.get(taskId);
            if (taskCron != null) {
                executeTask(taskCron);
            }
        }
    });
}

执行任务

executeTask方法中,我们定义了需要执行的任务逻辑:

private void executeTask(Cron cron) {
    // 这里是你需要执行的任务逻辑
    System.out.println("执行任务: " + cron.getId());
}

标签:Cron,taskCron,Hutool,cron,taskId,定时,动态,cronTaskMap
From: https://blog.csdn.net/Nicov_/article/details/140294872

相关文章

  • 动态SQL
    mybatis中动态sql标签1:if标签  1)数值类型的判断不等于的判断://注意Interge类型的条件判断是否为空的时候一定不要加非空字符串判断,因为当你传的值为0的时候,mybatis会把它判断为空字符串<iftest="equipTypeId!=null">ANDt1.equip_type_id=#{equipTypeId......
  • Studying-代码随想录训练营day33| 动态规划理论基础、509.斐波那契函数、70.爬楼梯、7
    第33天,动态规划开始,新的算法......
  • 动态的线面位置关系
    前言本博文适合有一定立体几何基础的学生自学使用。典例剖析【2024高一数学必修二训练题】如图,已知正方体\(ABCD-A_1B_1C_1D_1\),点\(P\)在面对角线\(BC_1\)上运动,则下列四个结论:①三棱锥\(A-D_1PC\)的体积不变;②\(A_1P//\)平面\(ACD_1\);③\(DP\perpBC_1\);④平面......
  • 线性表——顺序表(动态分配)
    #include<bits/stdc++.h>usingnamespacestd;#defineInitSize5typedefstructSeqList{ int*data; //动态分配的数组指针 intlength; //数组当前个数 intMaxSize; //数组的最大容量}List;//动态分配的初始化voidInitList(List*L){ L->data=newint[InitSiz......
  • Quartz动态添加scheduler
    引入依赖<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-quartz</artifactId><version>2.2.9.RELEASE</version></dependency>代码实现packagenet.evecom.iaplatfor......
  • PE文件(八)静态与动态链接库
    本章内容为导入表和导出表的前置内容章节引入当我们需要重复使用一段代码时,我们可以将其定义成一个函数,每当使用这段代码时,直接调用函数即可但当我们进行多人大型项目时,一个人电脑上有一段代码需要另外很多人的电脑使用时,每次复制粘贴相应的代码到另外很多台电脑是很复杂的,......
  • LeetCode42(接雨水)[三种解法:理解动态规划,双指针,单调栈]
    接雨水给定n个非负整数表示每个宽度为1的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。这是一道困难题,难度确实有点层次.我们先来朴素思想走一波.要求能接多少雨水,我们可以具化到每个硅谷,每个硅谷能存多少雨水,那么答案就是每个硅谷的雨水所加之和.对......
  • 晚上定时编译android系统
    1、问题可能偶然想晚上定时编译android系统2、解决at.sh#!/bin/sh#at-fat.shnow+1min#at-lset-eset-xecho$SHELLecho'atbuildbegin'/bin/date>>at_build.log/bin/bash-c'sourcebuild/envsetup.sh>>at_build.log2>&1;lu......
  • vue table+form 表格+表单动态增加一行 数据 并进行数据校验
    本功能主要实现表格加表单并且在表格中添加一行新数据,进行数据表单校验1.使用el-form将el-table包裹起来实际代码不方便展现,大概是这个意思也可以参考element中的表单的动态增加案例地址:Element-Theworld'smostpopularVueUIframework<el-form:model="Form"ref=......
  • 深入理解Java中的反射与动态代理
    深入理解Java中的反射与动态代理大家好,我是微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!1.反射介绍在Java编程中,反射(Reflection)是指在运行时动态获取类的信息并操作类或对象的能力。Java的反射机制允许程序在运行时获取类的信息(例如类的方法、字段、注解等),并且......