/**
* Cron表达式工具类:目前支持三种常用的cron表达式
* 1.每天的某个时间点执行 例:12 12 12 * * ?表示每天12时12分12秒执行
* 2.每周的哪几天执行 例:12 12 12 ? * 1,2,3表示每周的周1周2周3 ,12时12分12秒执行
* 3.每月的哪几天执行 例:12 12 12 1,21,13 * ?表示每月的1号21号13号 12时12分12秒执行
*
* @Author 法哈席基
*/
public class CronUtil {
/**
* 方法摘要:构建Cron表达式
*
* @param jobScheduleModel
* @return String
*/
public static String createCronExpression(JobScheduleModel jobScheduleModel) {
StringBuffer cronExp = new StringBuffer("");
if (null == jobScheduleModel.getJobType()) {
System.out.println("执行周期未配置");
}
if (null != jobScheduleModel.getSecond()
&& null != jobScheduleModel.getMinute()
&& null != jobScheduleModel.getHour()) {
// 秒
cronExp.append(jobScheduleModel.getSecond()).append(" ");
// 分
cronExp.append(jobScheduleModel.getMinute()).append(" ");
// 小时
cronExp.append(jobScheduleModel.getHour()).append(" ");
// 每天
if (jobScheduleModel.getJobType().intValue() == JobConstants.JOB_TYPE_DAY) {
// 日
cronExp.append("* ")
// 月
.append("* ")
// 周
.append("?");
}
// 按每周
else if (jobScheduleModel.getJobType().intValue() == JobConstants.JOB_TYPE_WEEK) {
// 一个月中第几天
cronExp.append("? ")
// 月份
.append("* ");
// 周
Integer[] weeks = jobScheduleModel.getDayOfWeeks();
for (int i = 0; i < weeks.length; i++) {
if (i == 0) {
cronExp.append(weeks[i]);
} else {
cronExp.append(",").append(weeks[i]);
}
}
}
// 按每月
else if (jobScheduleModel.getJobType().intValue() == JobConstants.JOB_TYPE_MONTH) {
// 一个月中的哪几天
Integer[] days = jobScheduleModel.getDayOfMonths();
for (int i = 0; i < days.length; i++) {
if (i == 0) {
cronExp.append(days[i]);
} else {
cronExp.append(",").append(days[i]);
}
}
// 月份
cronExp.append(" * ")
// 周
.append("?");
}
} else {
// 时或分或秒参数未配置
System.out.println("时或分或秒参数未配置");
}
return cronExp.toString();
}
/**
* 方法摘要:生成计划的详细描述
*
* @param jobScheduleModel
* @return String
*/
public static String createDescription(JobScheduleModel jobScheduleModel) {
StringBuffer description = new StringBuffer("");
// 计划执行开始时间
// Date startTime = taskScheduleModel.getScheduleStartTime();
if (null != jobScheduleModel.getSecond()
&& null != jobScheduleModel.getMinute()
&& null != jobScheduleModel.getHour()) {
// 按每天
if (jobScheduleModel.getJobType().intValue() == 1) {
description.append("每天");
description.append(jobScheduleModel.getHour()).append("时");
description.append(jobScheduleModel.getMinute()).append("分");
description.append(jobScheduleModel.getSecond()).append("秒");
description.append("执行");
}
// 按每周
else if (jobScheduleModel.getJobType().intValue() == 2) {
if (jobScheduleModel.getDayOfWeeks() != null && jobScheduleModel.getDayOfWeeks().length > 0) {
String days = "";
for (int i : jobScheduleModel.getDayOfWeeks()) {
days += "周" + i;
}
description.append("每周的").append(days).append(" ");
}
if (null != jobScheduleModel.getSecond()
&& null != jobScheduleModel.getMinute()
&& null != jobScheduleModel.getHour()) {
description.append(",");
description.append(jobScheduleModel.getHour()).append("时");
description.append(jobScheduleModel.getMinute()).append("分");
description.append(jobScheduleModel.getSecond()).append("秒");
}
description.append("执行");
}
// 按每月
else if (jobScheduleModel.getJobType().intValue() == 3) {
// 选择月份
if (jobScheduleModel.getDayOfMonths() != null && jobScheduleModel.getDayOfMonths().length > 0) {
String days = "";
for (int i : jobScheduleModel.getDayOfMonths()) {
days += i + "号";
}
description.append("每月的").append(days).append(" ");
}
description.append(jobScheduleModel.getHour()).append("时");
description.append(jobScheduleModel.getMinute()).append("分");
description.append(jobScheduleModel.getSecond()).append("秒");
description.append("执行");
}
}
return description.toString();
}
// demo
public static void main(String[] args) {
// 执行时间:每天的12时12分12秒 start
JobScheduleModel jobScheduleModel = new JobScheduleModel();
jobScheduleModel.setJobType(1);// 按每天
Integer hour = 12; // 时
Integer minute = 12; // 分
Integer second = 12; // 秒
jobScheduleModel.setHour(hour);
jobScheduleModel.setMinute(minute);
jobScheduleModel.setSecond(second);
String cropExp = createCronExpression(jobScheduleModel);
System.out.println(cropExp + ":" + createDescription(jobScheduleModel));
// 执行时间:每天的12时12分12秒 end
jobScheduleModel.setJobType(2);// 每周的哪几天执行
Integer[] dayOfWeeks = new Integer[3];
dayOfWeeks[0] = 1;
dayOfWeeks[1] = 2;
dayOfWeeks[2] = 3;
jobScheduleModel.setDayOfWeeks(dayOfWeeks);
cropExp = createCronExpression(jobScheduleModel);
System.out.println(cropExp + ":" + createDescription(jobScheduleModel));
jobScheduleModel.setJobType(3);// 每月的哪几天执行
Integer[] dayOfMonths = new Integer[3];
dayOfMonths[0] = 1;
dayOfMonths[1] = 21;
dayOfMonths[2] = 13;
jobScheduleModel.setDayOfMonths(dayOfMonths);
cropExp = createCronExpression(jobScheduleModel);
System.out.println(cropExp + ":" + createDescription(jobScheduleModel));
}
}
import lombok.Data;
/**
* 任务调度实体
*
* @Author 法哈席基
*/
@Data
public class JobScheduleModel {
/**
* 执行周期类型:
* 1 -> 每天
* 2 -> 每周
* 3 -> 每月
* 4 ->间隔(每隔2个小时,每隔30分钟)
*/
private Integer jobType;
/**
* 一周的哪几天
*/
private Integer[] dayOfWeeks;
/**
* 一个月的哪几天
*/
private Integer[] dayOfMonths;
/**
* 秒
*/
private Integer second;
/**
* 分
*/
private Integer minute;
/**
* 时
*/
private Integer hour;
}
/**
* 任务常量
*
* @Author 法哈席基
*/
public interface JobConstants {
/**
* 【执行周期】1:每日、2:每周、3:每月
*/
int JOB_TYPE_DAY = 1;
int JOB_TYPE_WEEK = 2;
int JOB_TYPE_MONTH = 3;
}