1、业务背景
用户在页面选择的任务计划的当天某个时间,然后输入时间间隔小时,显示当天任务执行次数。
2、解决思路
根据用户选择的任务计划的当天某个时间和时间间隔小时,生成cron任务表达式,使用Spring提
供了CronSequenceGenerator类以便计算cron表达式的具体时间点的next方法(Spring3.2版
本)进行计数和cron是否合法的isValidExpression方法(Spring4.3版本)。
统计当天的执行次数,返回显示页面。
3、实现代码
package com.exam.util;
import org.springframework.scheduling.support.CronSequenceGenerator;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;
/**
* 定时任务执行次数统计
* @author XZM
* @date 2023-10-25 22:50:00
*/
public class CronCountUtils {
/**
* 计算一天内定时任务执行次数
* @param expression 表达式
* @return 执行次数
*/
public static final int count(String expression) {
return count(null, expression);
}
/**
* 计算一天内定时任务执行次数
* @param date 时间
* @param expression 表达式
* @return 执行次数
*/
public static final int count(Date date, String expression) {
CronSequenceGenerator generator = new CronSequenceGenerator(expression, TimeZone.getDefault());
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
if(date == null){
date = calendar.getTime();
}
int today = calendar.get(Calendar.DATE);
int now;
int count = 0;
while(true) {
date = generator.next(date);
calendar.setTime(date);
now = calendar.get(Calendar.DATE);
if(now == today) {
count++;
} else {
break;
}
}
return count;
}
}
4、测试结果
public static void main(String[] args) throws ParseException {
// 模拟需要当天时间和时间间隔小时,比如:当天下午14点30分执行,间隔1个小时执行一次(cron = 0 0 */1 * * ?),执行次数是9
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = simpleDateFormat.parse("2023-10-25 14:30:00");
// 任务执行次数:9
System.out.println("任务执行次数:"+count(date,"0 0 */1 * * ?"));
}