按时间间隔生成cron表达式
cron表达式是使用任务调度经常使用的表达式了。对于通常的简单任务,我们只需要一条cron表达式就能满足。但是有的时候任务也可以很复杂。
最近我遇到了一个问题,一条任务在开始的时候要触发A方法,在结束的时候需要触发B方法。所以每次我添加触发器的时候都需要两个cron表达式,两个表达式需要间隔一定的时间。听起来特别复杂,但是实际上我只需要实现每天、每周、每月的时间就可以了。
选择每天时,持续时间不超过一天。
选择每周时,持续时间不超过一周。
选择每月时,持续时间不超过30天。
public class cronExpressionAddDuration {
public static void main(String[] args) {
/* {"cron":"0 0 0 31 * ?","duration":2678400}*/
/* {"cron":"0 20 0 ? * 7","duration":604740}*/
/* {"cron":"0 20 0 * * ?","duration":86340}*/
/* {"cron":"0 59 23 L * ?","duration":2678340} */
String cron="cron\":\"0 59 23 L * ?";
int duration=2678340;
String newCron=cronExpressionPlusDuration(cron,duration);
System.out.println(newCron);
}
/**
* <p>对cron表达式进行修改,根据传入的时间生成一个新的cron表达式</>
* 两个表达式之间的间隔为duration
*
* @param cron
* @param duration 单位为秒
* @return
*/
private static String cronExpressionPlusDuration(String cron, int duration) {
String[] cronArray = cron.split(" ");
int days = duration / 86400;
int hours = (duration % (86400)) / 3600;
int minutes = ((duration % (86400)) % 3600) / 60;
cronArray[2] = String.valueOf(Integer.valueOf(cronArray[2]) + hours);
cronArray[1] = String.valueOf(Integer.valueOf(cronArray[1]) + minutes);
/* 对小时和分钟进行合法性校验*/
if (Integer.valueOf(cronArray[1]) >= 60 || Integer.valueOf(cronArray[2]) >= 24) {
int extraMinutes = Integer.valueOf(cronArray[1]) % 60;
int extraHours = (Integer.valueOf(cronArray[2])+ Integer.valueOf(cronArray[1]) / 60)%24;
cronArray[2] = String.valueOf(extraHours);
cronArray[1] = String.valueOf(extraMinutes);
}
/* 持续时间一天以内*/
if (duration < 86400 && "*".equals(cronArray[3]) && "*".equals(cronArray[4]) && "?".equals(cronArray[5])) {
} else if (duration > 86400 && duration < 86400 * 7) {
cronArray[5] = String.valueOf((Integer.valueOf(cronArray[5]) + days) % 7 + 1);
} else if (duration > 86400 * 7 && duration < 86400 * 32) {
if("L".equals(cronArray[3])){
cronArray[3]=String.valueOf(days);
}else {
cronArray[3] = String.valueOf(((Integer.valueOf(cronArray[3]) + days) % 31) + 1);
}
}
String result = "";
for (String s : cronArray) {
result += s + " ";
}
return result;
}
}
代码写完了,但是这个方法有个缺陷。
- 如果期望添加一个暂停方式是每月且持续时间超过28天的表达式,那么在二月份该表达式不会生效。
- 如果期望添加一个暂停方式是每月的表达式,例如每月最后一天00:00持续时间5天。
假如我在3号添加了这条规则,如果此时该任务还有一个规则是5号不应该恢复,理论上我们不希望再次触发。但实际上此时这条规则会在5号触发。
按时间间隔生成cron表达式的更多相关文章
- java生成cron表达式
bean类: package com.cst.klocwork.service.cron; public class TaskScheduleModel { /** * 所选作业类型: * 1 -&g ...
- 指定时间生成cron表达式
public class CronUtils { private static final SimpleDateFormat sdf = new SimpleDateFormat("ss m ...
- quartz cron表达式在线生成
近期使用了quartz定时器,有感于起cron表达式有点复杂.且无法实时推断定时时间是否正确,因此写了个在线表达式及依据表达式获得前10次运行时间. 訪问地址例如以下:http://cron.g2ro ...
- quartz.net 时间表达式----- Cron表达式详解
序言 Cron表达式:就是用简单的xxoo符号按照一定的规则,就能把各种时间维度表达的淋漓尽致,无所不在其中,然后在用来做任务调度(定时服务)的quart.net中所认知执行,可想而知这是多么的天衣无 ...
- 通过Quartz 配置定时调度任务:使用cron表达式配置时间点
Cron官网入口 在后台经常需要一些定时处理的任务,比如微信相关应用所需的access_token,就要定时刷新,官方返回的有效性是7200s,也就是2小时,但是为了保险起见,除了在发现access_ ...
- Quartz Cron表达式的二三事
最近在解决产品上的一个需求,就是定期生成报告(Report),我们叫做Scheduled Report. 原理:UI获取用户输入的时间信息,后台使用Spring框架设置定时任务,这里定时任务用的就是 ...
- 详解定时任务中的 cron 表达式
1.前言 我们经常使用 cron 表达式来定义定时任务的执行策略,今天我们就总结一下 cron 表达式的一些相关知识. 2. cron 表达式的定义 cron 表达式是一个字符串,该字符串由 6 个空 ...
- 使用Cron表达式创建定时任务
CronTriggerCronTrigger功能非常强大,是基于日历的作业调度,而SimpleTrigger是精准指定间隔,所以相比SimpleTrigger,CroTrigger更加常用.CroTr ...
- quartz Cron表达式生成详解
简介 Cron作为一个Unix工具,已经存在很长一段时间了,用于实现任务调度的功能.CronTrigger类基于Cron而来. CronTrigger CronTriggers往往比SimpleTri ...
随机推荐
- The third column indicates whether subclasses of the class declared outside this package have access to the member.;
总结1.modifier 改性剂 修饰符 修饰语 调节器access modifier 访问修饰符 存取权限 存取修饰词 存取修饰字官网“can”Access level modifiers dete ...
- the internal array pointer
The foreach construct provides an easy way to iterate over arrays. foreach works only on arrays and ...
- C++创建窗口程序初步
写在前面:本博客为本人原创,严禁任何形式的转载!本博客只允许放在博客园(.cnblogs.com),如果您在其他网站看到这篇博文,请通过下面这个唯一的合法链接转到原文! 本博客全网唯一合法URL:ht ...
- 利用apt-get 进行jdk安装
搜索相关安装包: apt-get update apt-cache search jdk 安装: apt-get install openjdk-8-jdk
- Android(一) 动态菜单
1.android的一个activity可以再选中某项之后按menu键弹出特定的菜单,也就是动态菜单.动态菜单的实现是靠menu类中的addIntentOptions函数实现的,具体的声明如下: in ...
- 高并发秒杀系统方案(分布式session)
编程要有一个习惯:做参数校验 所谓的分布式session:就是用redis统一管理session. 我们这里的思路是:把token写入cookie中,客户端在随后的访问中携带cookie,服务端就能根 ...
- 2017php经典面试题
1.PHP语言的一大优势是跨平台,什么是跨平台?一.PHP基础: PHP的运行环境最优搭配为Apache+MySQL+PHP,此运行环境可以在不同操作系统(例如windows.Linux等)上配置,不 ...
- bootstrap modal插件弹出窗口如何限制最大高度,并且在内容过多时可以滚动显示
.modal-body{ max-height:400px; overflow-y:auto; } 只有在modal-body类上限制高度才能起作用,其他地方的限制均不起作用
- Andrew Ng-ML-第十章-应用机器学习的建议
1.如何改进性能不好的学习算法 图1.运用到测试集上效果不佳 当进行一个正则化线性回归时,最小化了代价函数得到参数,但是运用到新的测试集上,发现效果不好,那么如何改进? 1).增加训练集.但是实际上花 ...
- 20180531-Postman 常用测试结果验证及使用技巧