当前位置: 首页 > news >正文

Cron表达式

前言:

最近的做的功能和定时任务打交道比较多,所以这一期分享一下关于定时任务和Cron表达式的一些代码。

1、Cron表达式

cron 表达式是一个字符串,该字符串由7 部分组成,其中每部分代表不同的时间单位,例如:

 [秒] [分] [时] [日] [月] [周] [年]

1、1 组成部分 

通常年的部分可以省略,常用的是前6部分:

字段范围值可包含特殊字符
秒(Seconds)0-59正整数* / - 
分(Minutes)0-59正整数* / -
时(Hours)0-59正整数* / -
日(DayOfMonth)1-31正整数* / - ?
月(Month)1-12正整数* / -
周(DayOfWeek)1-7正整数(每周几)* / - ?
年(Year)1970-2099正整数* / -

1、2 Cron通配符

(1)* :表示匹配该域的任意值,可解读为 “每”。

(2)?:标识不指定和值,只能在[日]和[周]使用,即不关心每周二是几号或者每8号是周几。

(3)- :表示该域的连续范围。例如在[分]部分使用时,5-20则表示从5分到20分钟每分钟触发一次 。

(4)/ :该符号代表步长,用于指定时间间隔或频率。例如:在分*/5和2/5表示每5分钟执行一次和从第2分钟开始,每5分钟执行一次。

(5), :表示匹配该域的指定值。例如在[分]使用8,12,35则表示分别在第 8 分、第 12 分、 第 35 分执行该定时任务。

1、3 Cron表达式下次执行时间

import org.redisson.executor.CronExpression;
// 或者
import org.quartz.CronExpression;

            String cron = "xxxxx";
			try {
				CronExpression cronExpression = new CronExpression(cron);//导包import org.quartz.CronExpression;
				Date date = cronExpression.getTimeAfter(new Date());
			} catch (Exception e) {
				log.error("cron获取下次执行时间异常!", e);
			}

1、4 定时任务(xxlJobAdminApi)

/**
 *xxl-job-admin Feign接口类

 *  https://github.com/xuxueli/xxl-job
 * 配置备份时需要动态添加定时任务
 * 封装对外接口文档,便于动态管理定时任务
 */
@FeignClient( name = "xxl-job",  url="${xxl.job.admin.addresses}"
public interface IXxlJobInfoClient {

    String API_PREFIX = "/job/feign";

    /**
     * page list
     *
     * @param start           开始页
     * @param length          每页长度
     * @param jobGroup        分组
     * @param jobDesc         job描述
     * @param executorHandler 执行器
     * @param author          创建人
     * @param triggerStatus   triggerStatus
     * @return 执行结果
     */
    @GetMapping(API_PREFIX + "/pageList")
    Map<String, Object> pageList(@RequestParam("start") int start, @RequestParam("length") int length,
            @RequestParam("jobGroup") int jobGroup, @RequestParam("triggerStatus") int triggerStatus,
            @RequestParam("jobDesc") String jobDesc, @RequestParam("executorHandler") String executorHandler,
            @RequestParam("author") String author);

    /**
     * get a job
     *
     * @param id id
     * @return 执行结果
     */
    @GetMapping(API_PREFIX + "/user-info-by-id")
    ReturnT<XxlJobInfo> loadById(@RequestParam("id") Integer id);

    /**
     * get info by group id
     *
     * @param groupId groupId
     * @return 结果
     */
    @GetMapping(API_PREFIX + "/user-info-by-group-id")
    ReturnT<List<XxlJobInfo>> loadByGroupId(@RequestParam("groupId") Integer groupId);

    /**
     * add job
     *
     * @param jobInfo 定时任务与信息
     * @return 执行结果
     */
    @PostMapping(API_PREFIX + "/add")
    ReturnT<String> add(@RequestBody XxlJobInfo jobInfo);

    /**
     * update job
     *
     * @param jobInfo 定时任务信息
     * @return 执行结果
     */
    @PutMapping(API_PREFIX + "/update")
    ReturnT<String> update(@RequestBody XxlJobInfo jobInfo);

    /**
     * remove job
     * *
     *
     * @param id ID
     * @return 执行结果
     */
    @DeleteMapping(API_PREFIX + "/remove")
    ReturnT<String> remove(@RequestParam("id") int id);

    /**
     * start job
     *
     * @param id ID
     * @return 执行结果
     */
    @PostMapping(API_PREFIX + "/start")
    ReturnT<String> start(@RequestParam("id") int id);

    /**
     * stop job
     *
     * @param id ID
     * @return 执行结果
     */
    @PostMapping(API_PREFIX + "/stop")
    ReturnT<String> stop(@RequestParam("id") int id);

    /**
     * 根据id触发任务
     *
     * @param id ID
     * @return 执行结果
     */
    @PostMapping(API_PREFIX + "/manual/trigger")
    ReturnT<String> manualTrigger(@RequestParam("id") int id);

}

1、5 对应实体:

import lombok.Data;

/**
 * 定时任务实体
 *
 */
@Data
public class XxlJobInfo {

	private int id;				// 主键ID

	private int jobGroup;		// 执行器主键ID
	private String jobDesc;

	private Date addTime;
	private Date updateTime;

	private String author;		// 负责人
	private String alarmEmail;	// 报警邮件

	private String scheduleType;			// 调度类型
	private String scheduleConf;			// 调度配置,值含义取决于调度类型
	private String misfireStrategy;			// 调度过期策略

	private String executorRouteStrategy;	// 执行器路由策略
	private String executorHandler;		    // 执行器,任务Handler名称
	private String executorParam;		    // 执行器,任务参数
	private String executorBlockStrategy;	// 阻塞处理策略
	private int executorTimeout;     		// 任务执行超时时间,单位秒
	private int executorFailRetryCount;		// 失败重试次数

	private String glueType;		// GLUE类型	#com.xxl.job.core.glue.GlueTypeEnum
	private String glueSource;		// GLUE源代码
	private String glueRemark;		// GLUE备注
	private Date glueUpdatetime;	// GLUE更新时间

	private String childJobId;		// 子任务ID,多个逗号分隔

	private int triggerStatus;		// 调度状态:0-停止,1-运行
	private long triggerLastTime;	// 上次调度时间
	private long triggerNextTime;	// 下次调度时间
}

1、6工具类:

public class XxlJobUtil {

    private XxlJobUtil() {
        // do nothing
    }

    /**
     * cron默认参数设置
     *
     * @param jobAuthor       任务归属人
     * @param jobDesc         任务描述
     * @param scheduleConf    cron表达式格式:"0 0/15 * * * ? *"
     * @param executorHandler 任务之执行器名字,和@XxlJob注解参数一致
     * @param executorParam   任务执行器执行需要的参数,在执行器中通过XxlJobHelper.getJobParam();获取
     * @return XxlJobInfo
     */
    public static XxlJobInfo defaultCronJobInfo(String jobAuthor, String jobDesc, String scheduleConf,
												String executorHandler,
												String executorParam) {
        XxlJobInfo xxlJobInfo = new XxlJobInfo();
        xxlJobInfo.setAuthor(jobAuthor);
        xxlJobInfo.setJobDesc(jobDesc);
        // 调度策略设置
        xxlJobInfo.setScheduleType(JobConst.SCHEDULE_TYPE_CRON);
        // 格式"0 0/15 * * * ? *"
        xxlJobInfo.setScheduleConf(scheduleConf);
        // EXECUTE参数
        xxlJobInfo.setExecutorRouteStrategy(JobConst.EXECUTOR_ROUTE_STRATEGY);
        xxlJobInfo.setExecutorBlockStrategy(JobConst.EXECUTOR_BLOCK_STRATEGY);
        xxlJobInfo.setExecutorFailRetryCount(JobConst.EXECUTOR_FAIL_RETRY_COUNT);
        xxlJobInfo.setExecutorTimeout(JobConst.EXECUTOR_TIMEOUT);
        // 任务调度@XxlJob注解的参数一致
        xxlJobInfo.setExecutorHandler(executorHandler);
        // @XxlJob注解方法需要用到的参数通过:XxlJobHelper.getJobParam(); 获取
        xxlJobInfo.setExecutorParam(executorParam);

        // 调度过期策略
        xxlJobInfo.setMisfireStrategy(JobConst.MISFIRE_STRATEGY_DO_NOTHING);

        // GLUE 策略
        xxlJobInfo.setGlueRemark(JobConst.GLUE_REMARK);
        xxlJobInfo.setGlueType(JobConst.GLUE_TYPE);
        xxlJobInfo.setGlueSource(JobConst.GLUE_SOURCE);

		// jobGroup执行器 需要核对具体的执行器
        xxlJobInfo.setJobGroup(1);
        return xxlJobInfo;
    }

}

http://www.dtcms.com/a/109202.html

相关文章:

  • 什么是混杂模式?为什么 macvlan 依赖它
  • B2B2C商城系统开发:从规划到上线的全流程指南
  • 函数柯里化(Currying)介绍(一种将接受多个参数的函数转换为一系列接受单一参数的函数的技术)
  • 数字孪生在智慧城市中的前端呈现与 UI 设计思路
  • CentOS 7 镜像源失效解决方案(2025年)
  • 【Mysql】之索引详解
  • 游戏无法启动?XINPUT1_3.dll 丢失的终极解决方案
  • 国产替代新选择:CCLink IE与EtherCAT网关在制药行业的应用,配置详解
  • python之 “__init__.py” 文件
  • DeepSeek-R1 面试题汇总
  • SAP-ABAP:SAP ABAP UPDATE 语句用法详解
  • 如何像母语一样学习英语
  • VMware ESXi:企业级虚拟化平台详解
  • MySQL-- 函数(单行函数): 日期和时间函数
  • Linux内核TCP/IP协议栈中的设计模式:从面向对象到系统级软件的跨界实践
  • 数据结构——顺序表
  • 思维链(Chain-of-Thought, CoT)与强化学习区别
  • Java基础之反射的基本使用
  • linux命令-find指令
  • 卫星升空织密天网,卫星电话架起天地一体通信桥梁
  • 数据结构与算法——单链表的实现及增、插、删、查、印、毁
  • 【c++深入系列】:类与对象详解(中)
  • Golang定时任务管理(中文日志+防重复执行)
  • React 项目使用 pdf.js 及 Elasticpdf 教程
  • lvgl避坑记录
  • lodash库介绍(一个现代JavaScript实用工具库,提供模块化、性能优化和额外功能)JavaScript库(防抖、节流、函数柯里化)JS库
  • 每日一题洛谷P8664 [蓝桥杯 2018 省 A] 付账问题c++
  • 【C++】nlohmann::json 配置加载技术实践:从基础到高级应用
  • OpenLayers:如何控制Overlay的层级?
  • 如何为Linux/Android Kernel 5.4和5.15添加 fuse passthrough透传功能 ?