废话不多说系列,直接开整 ~ 下面是次工具类的常用的核心接口:
- 提供 【按每分钟】执行接口;
- 提供 【按每天某时某分某秒】 执行接口;
- 提供【每周周几某时某分某秒】执行接口;
- 提供【每月某几号某时某分某秒】执行接口;
(1)引入 maven 依赖
<!--Lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
(2)cron 表达式封装VO
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;
/**
* cron 表达体
*
* @author zero
* @create 2021-03-24 11:38
*/
@Getter
@Setter
@Accessors(chain = true)
public class TaskScheduleModel {
/**
* 所选作业类型:
* 1 -> 每天
* 2 -> 每月
* 3 -> 每周
*/
Integer jobType;
/**
* 一周的哪几天
*/
Integer[] dayOfWeeks;
/**
* 一个月的哪几天
*/
Integer[] dayOfMonths;
/**
* 秒
*/
Integer second;
/**
* 分
*/
Integer minute;
/**
* 时
*/
Integer hour;
}
(3)CronUtils.java
/**
* @author zero
* @create 2021-03-24 11:37
*/
public class CronUtils {
/**
* 方法摘要:构建Cron表达式
*
* @param taskScheduleModel
* @return String
*/
public static String createCronExpression(TaskScheduleModel taskScheduleModel) {
StringBuffer cronExp = new StringBuffer("");
if (null == taskScheduleModel.getJobType()) {
//执行周期未配置
System.out.println("执行周期未配置");
}
if (null != taskScheduleModel.getSecond() && null == taskScheduleModel.getMinute() && null == taskScheduleModel.getHour()) {
//每隔几秒
if (taskScheduleModel.getJobType().intValue() == 0) {
cronExp.append("0/").append(taskScheduleModel.getSecond());
cronExp.append(" ");
cronExp.append("* ");
cronExp.append("* ");
cronExp.append("* ");
cronExp.append("* ");
cronExp.append("?");
}
}
if (null != taskScheduleModel.getSecond() && null != taskScheduleModel.getMinute() && null == taskScheduleModel.getHour()) {
//每隔几分钟
if (taskScheduleModel.getJobType().intValue() == 4) {
cronExp.append("* ");
cronExp.append("0/").append(taskScheduleModel.getMinute());
cronExp.append(" ");
cronExp.append("* ");
cronExp.append("* ");
cronExp.append("* ");
cronExp.append("?");
}
}
if (null != taskScheduleModel.getSecond() && null != taskScheduleModel.getMinute() && null != taskScheduleModel.getHour()) {
//秒
cronExp.append(taskScheduleModel.getSecond()).append(" ");
//分
cronExp.append(taskScheduleModel.getMinute()).append(" ");
//小时
cronExp.append(taskScheduleModel.getHour()).append(" ");
//每天
if (taskScheduleModel.getJobType().intValue() == 1) {
//日
cronExp.append("* ");
//月
cronExp.append("* ");
//周
cronExp.append("?");
}
//按每周
else if (taskScheduleModel.getJobType().intValue() == 3) {
//一个月中第几天
cronExp.append("? ");
//月份
cronExp.append("* ");
//周
Integer[] weeks = taskScheduleModel.getDayOfWeeks();
for (int i = 0; i < weeks.length; i++) {
if (i == 0) {
cronExp.append(weeks[i]);
} else {
cronExp.append(",").append(weeks[i]);
}
}
}
//按每月
else if (taskScheduleModel.getJobType().intValue() == 2) {
//一个月中的哪几天
Integer[] days = taskScheduleModel.getDayOfMonths();
for (int i = 0; i < days.length; i++) {
if (i == 0) {
cronExp.append(days[i]);
} else {
cronExp.append(",").append(days[i]);
}
}
//月份
cronExp.append(" * ");
//周
cronExp.append("?");
}
} else {
//时或分或秒参数未配置
System.out.println("时或分或秒参数未配置");
}
return cronExp.toString();
}
/**
* 方法摘要:生成计划的详细描述
*
* @param taskScheduleModel 任务模型数据
* @return String
*/
public static String createDescription(TaskScheduleModel taskScheduleModel) {
StringBuffer description = new StringBuffer("");
//计划执行开始时间
// Date startTime = taskScheduleModel.getScheduleStartTime();
if (null != taskScheduleModel.getSecond()
&& null != taskScheduleModel.getMinute()
&& null != taskScheduleModel.getHour()) {
//按每天
if (taskScheduleModel.getJobType().intValue() == 1) {
description.append("每天");
description.append(taskScheduleModel.getHour()).append("时");
description.append(taskScheduleModel.getMinute()).append("分");
description.append(taskScheduleModel.getSecond()).append("秒");
description.append("执行");
}
//按每周
else if (taskScheduleModel.getJobType().intValue() == 3) {
if (taskScheduleModel.getDayOfWeeks() != null && taskScheduleModel.getDayOfWeeks().length > 0) {
String days = "";
for (int i : taskScheduleModel.getDayOfWeeks()) {
days += "周" + i;
}
description.append("每周的").append(days).append(" ");
}
if (null != taskScheduleModel.getSecond() && null != taskScheduleModel.getMinute() && null != taskScheduleModel.getHour()) {
description.append(",");
description.append(taskScheduleModel.getHour()).append("时");
description.append(taskScheduleModel.getMinute()).append("分");
description.append(taskScheduleModel.getSecond()).append("秒");
}
description.append("执行");
}
//按每月
else if (taskScheduleModel.getJobType().intValue() == 2) {
//选择月份
if (taskScheduleModel.getDayOfMonths() != null && taskScheduleModel.getDayOfMonths().length > 0) {
String days = "";
for (int i : taskScheduleModel.getDayOfMonths()) {
days += i + "号";
}
description.append("每月的").append(days).append(" ");
}
description.append(taskScheduleModel.getHour()).append("时");
description.append(taskScheduleModel.getMinute()).append("分");
description.append(taskScheduleModel.getSecond()).append("秒");
description.append("执行");
}
}
return description.toString();
}
/**
* 参考例子
*
* @param args
*/
public static void main(String[] args) {
//执行时间:每天的12时12分12秒 start
TaskScheduleModel taskScheduleModel = new TaskScheduleModel();
//按每秒
taskScheduleModel.setJobType(0);
taskScheduleModel.setSecond(30);
String cronExp = createCronExpression(taskScheduleModel);
System.out.println("按每秒:" + cronExp);
//按每分钟
taskScheduleModel.setJobType(4);
taskScheduleModel.setMinute(8);
String cronExpression = createCronExpression(taskScheduleModel);
System.out.println("按每分钟:" + cronExpression);
//按每天
taskScheduleModel.setJobType(1);
Integer hour = 12, minute = 12, second = 12;
taskScheduleModel.setHour(hour);
taskScheduleModel.setMinute(minute);
taskScheduleModel.setSecond(second);
String cropExp = createCronExpression(taskScheduleModel);
//执行时间:每天的12时12分12秒 end
System.out.println(cropExp + "\t--->>>\t" + createDescription(taskScheduleModel));
//每周的哪几天执行
taskScheduleModel.setJobType(3);
Integer[] dayOfWeeks = new Integer[3];
dayOfWeeks[0] = 1;
dayOfWeeks[1] = 2;
dayOfWeeks[2] = 3;
taskScheduleModel.setDayOfWeeks(dayOfWeeks);
cropExp = createCronExpression(taskScheduleModel);
System.out.println(cropExp + "\t--->>>\t" + createDescription(taskScheduleModel));
//每月的哪几天执行
taskScheduleModel.setJobType(2);
Integer[] dayOfMonths = new Integer[3];
dayOfMonths[0] = 1;
dayOfMonths[1] = 21;
dayOfMonths[2] = 13;
taskScheduleModel.setDayOfMonths(dayOfMonths);
cropExp = createCronExpression(taskScheduleModel);
System.out.println(cropExp + "\t--->>>\t" + createDescription(taskScheduleModel));
}
}
(4)测试示例
至此,感谢阅读🙏!