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;
}
}