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