按时间间隔生成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 ...
随机推荐
- MyISAM存储引擎
每个MyISAM在磁盘上存储成三个文件.第一个文件的名字以表的名字开始,扩展名指出文件类型..frm文件存储表定义.数据文件的扩展名为.MYD (MYData).索引文件的扩展名是.MYI (MYIn ...
- Oracle卸载之Linux下卸载oracle11g的方法
1.使用SQL*PLUS停止数据库 如果不能通过sysdba登陆可以用nolog用户登陆后切换至sysdba [oracle@OracleTest oracle]$ sqlplus /nolog S ...
- Spring Data 介绍 (一)
简介 Spring Data是什么 Spring Data是一个用于简化数据库访问,并支持云服务的开源框架.其主要目标是使得对数据的访问变得方便快捷 Spring Data JPA能干什么 可以极大的 ...
- Python开发【笔记】:关闭线程的方法
1.通过API进行线程关闭 import threading import time import inspect import ctypes def _async_raise(tid, exctyp ...
- servlet输出请求头
1.参考 Enumeration headerNames = req.getHeaderNames(); while(headerNames.hasMoreElements()) { String h ...
- JAVA队列的使用
JAVA队列的使用 今天跟大家来看看如何在项目中使用队列.首先我们要知道使用队列的目的是什么?一般情况下,如果是一些及时消息的处理,并且处理时间很短的情况下是不需要使用队列的,直接阻塞式的方法调用就可 ...
- 应用笔画宽度变换(SWT)来检测自然场景中的文本
Introduction: 应用背景:是盲人辅助系统,城市环境中的机器导航等计算机视觉系统应用的重要一步.获取文本能够为许多视觉任务提供上下文的线索,并且,图像检索算法的性能很大部分都依赖于对应的文本 ...
- crontab定时任务-干货案例
自定义需求:实现消息队列. 1.创建一张mysql表结构 2.编写php脚本,便于sh文件执行 3.编写sh脚本,便于crontab定时执行 4.crontab -e 注册定时任务,如果此步不清楚请参 ...
- 开源的挖矿软件,sha256
http://cryptomining-blog.com/tag/sha-256d-miner/ https://github.com/cbuchner1/CudaMiner/blob/master/ ...
- R实现的最小二乘lsfit函数学习
1.源码 function (x, y, wt = NULL, intercept = TRUE, tolerance = 1e-, yname = NULL) { x <- as.matrix ...