【过往系列文章】
使用的spring,maven
pom.xml
版本号
<spring.version>5.2.3.RELEASE</spring.version>
对应的依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-websocket</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
在Spring中提供了CronSequenceGenerator,以方便我们使用,
(ps:但在实际过程中,目前版本还是有点不太兼容,有些不能检验)
1.检验Cron表达式是否正确
CronSequenceGenerator提供了静态方法,我们直接调用就有,不需要new对象
//正确的
String cron1="0 0 10 * * ?";
System.out.println("cron1="+CronSequenceGenerator.isValidExpression(cron1));
//错误的
String cron2="0 0 10 * 123 ?";
System.out.println("cron2="+CronSequenceGenerator.isValidExpression(cron2));
运行结果
cron1=true
cron2=false
2.通过Cron计算下次运行时间点
CronSequenceGenerator计算,需要new一个新对象,构造函数用cron构建
String cron3="0 0 10 * * ?";//每天10点运行
CronSequenceGenerator csg = new CronSequenceGenerator(cron3);
System.out.println(DateUtils.formatDate(csg.next(now),"yyyy-MM-dd HH:mm:ss"));
运行结果
2020-10-24 10:00:00
3.修改一下整理成工具类
/**
* 获取下次时间点列表
* @param cron 表达式
* @param count 需要计算的数量
* @return 返回日期集合
*/
public static List<Date> calNextPoint(String cron,int count) {
return calNextPoint(cron,new Date(),count);
}
/**
* 获取下次时间点列表
* @param cron 表达式
* @param date 当前日期
* @param count 需要计算的数量
* @return 返回日期集合
*/
public static List<Date> calNextPoint(String cron,Date date,int count) {
List<Date> points=new ArrayList<>();
if(CronSequenceGenerator.isValidExpression(cron)) {
CronSequenceGenerator csg = new CronSequenceGenerator(cron);
Date nextDate=date;
for(int i=0;i<count;i++) {
nextDate=nextPoint(csg,nextDate);
points.add(nextDate);
}
}
return points;
}
/**
* 计算下次时间点
* @param csg
* @param date
* @return
*/
public static Date nextPoint(CronSequenceGenerator csg,Date date) {
return csg.next(date);
}
调用方法
Date now=new Date();
List<Date> points=calNextPoint("0 0 10 * * ?",now,5);
for(int i=0;i<points.size();i++) {
System.out.println(DateUtils.formatDate(points.get(i),"yyyy-MM-dd HH:mm:ss"));
}
System.out.println("-----");
List<Date> points2=calNextPoint("0 0 0/2 * * ?",now,6);
for(int i=0;i<points2.size();i++) {
System.out.println(DateUtils.formatDate(points2.get(i),"yyyy-MM-dd HH:mm:ss"));
}
运行结果如下:
2020-10-24 10:00:00
2020-10-25 10:00:00
2020-10-26 10:00:00
2020-10-27 10:00:00
2020-10-28 10:00:00
-----
2020-10-24 00:00:00
2020-10-24 02:00:00
2020-10-24 04:00:00
2020-10-24 06:00:00
2020-10-24 08:00:00
2020-10-24 10:00:00
4.一般整合到项目
我们一般会在获取的页表数据进行处理,当然也可以存到数据库里,但是考虑到需要经常维护,我们使用了获取数据的时候计算
public Page<Schedule> findByPage(Schedule schedule, Page<Schedule> page) {
List<String> idList=dao.findIdsByPage(schedule, page);
if(ObjectUtil.isNotEmpty(idList)) {
List<Schedule> results=dao.getList(idList);
Date now = new Date();
for(Schedule dbSchedule:results) {
List<Date> nextTimePoints=ScheduleKit.calNextPoint(dbSchedule.getCron(),now,3);
dbSchedule.setNextTimePoints(nextTimePoints);
}
page.setResults(results);
}
return page;
}
表现到页面的效果,仅做参考
然后这里结束,下篇会整理一下如何整合在线生成Cron表达式,敬请留意!