如何正确的使用Cron4j表达式
发表于:2024-11-28 作者:千家信息网编辑
千家信息网最后更新 2024年11月28日,今天就跟大家聊聊有关如何正确的使用Cron4j表达式,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。cron4j是一个轻量级的Java任务调度工
千家信息网最后更新 2024年11月28日如何正确的使用Cron4j表达式
今天就跟大家聊聊有关如何正确的使用Cron4j表达式,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。
cron4j是一个轻量级的Java任务调度工具。
引入Jar包:
it.sauronsoftware.cron4j cron4j 2.2.5
cron4j的cron表达式最多只允许5个部分,每个部分用空格分隔开,从左至右分别表示"分"、"时"、"天"、"月"、"周",具体规则如下:
分:取值从 0 到 59时:取值从 0 到 23天:取值从 1 到 31,字母 L 可用于表示月的最后一天月:取值从 1 到 12,可以用别名表示:jan、feb、mar、apr、may、jun、jul、aug、sep、oct、nov、dec周:取值从 0 到 6,0表示周日,6表示周六,可以用别名表示:sun、mon、tue、wed、thu、fri、sat
以上5个部分的分、时、天、月、周又分别支持如下字符:
数字 n :表示一个具体的时间点,例如 5 * * * * 表示 5 分这个时间点时执行逗号 , :表示指定多个数值,例如 3,5 * * * * 表示 3 和 5 分这两个时间点执行减号 - :表示范围,例如 1-3 * * * * 表示 1 分、2 分再到 3 分这三个时间点执行星号 * :表示每一个时间点,例如 * * * * * 表示每分钟执行除号 / :表示指定一个值的增加幅度。例如 */5表示每隔5分钟执行一次(序列:0:00, 0:05, 0:10, 0:15 等等)
常见错误: cron4j在表达式中使用除号指定增加幅度时与linux稍有不同。例如在linux中表达式 10/3 * * * * 的含义是从第10分钟开始,每隔三分钟调度一次,而在cron4j中需要使用 10-59/3 * * * * 来表达。
Scheduler scheduler = new Scheduler();//写法一:此种方式,控制台每分钟打印scheduler.schedule("10-59/1 * * * *", () -> System.out.println("Every Minute Run."));//写法二:此种方式,控制台不会有任何打印//scheduler.schedule("10/1 * * * *", () -> System.out.println("Every Minute Run."));scheduler.start();try { Thread.sleep(1000L * 60L * 10L);} catch (InterruptedException e) { e.printStackTrace();}scheduler.stop();
两大疑问: 第一个疑问是当某个任务调度抛出了异常,那么这个任务在下次被调度的时间点上还会不会被调度,答案是肯定的,不管什么时候出现异常,时间一到调度仍然会被执行。
Scheduler scheduler = new Scheduler();scheduler.schedule("*/1 * * * *", () -> { System.out.println("Every Minute Run At: " + new Date()); throw new RuntimeException("任务调度抛出异常");});scheduler.start();try { Thread.sleep(1000L * 60L * 10L);} catch (InterruptedException e) { e.printStackTrace();}scheduler.stop();
打印结果如下:
Every Minute Run At: Wed Feb 13 10:09:00 CST 2019 java.lang.RuntimeException: 任务调度抛出异常 at com.tinytime.demo.cron4j.Demo2.lambda$main$0(Demo2.java:17) at it.sauronsoftware.cron4j.RunnableTask.execute(Unknown Source) at it.sauronsoftware.cron4j.TaskExecutor$Runner.run(Unknown Source) at java.lang.Thread.run(Thread.java:748)Every Minute Run At: Wed Feb 13 10:10:00 CST 2019 java.lang.RuntimeException: 任务调度抛出异常 at com.tinytime.demo.cron4j.Demo2.lambda$main$0(Demo2.java:17) at it.sauronsoftware.cron4j.RunnableTask.execute(Unknown Source) at it.sauronsoftware.cron4j.TaskExecutor$Runner.run(Unknown Source) at java.lang.Thread.run(Thread.java:748)
由此可见,即使上一次调度任务发生异常,下次任务到了时间仍然会被调度。
第二个疑问是假如某个任务执行时间很长,如果这个任务上次调度后直到本次调度到来的时候还没执行完,那么本次调度是否还会进行,答案也是肯定的。
Scheduler scheduler = new Scheduler();scheduler.schedule("*/1 * * * *", () -> { System.out.println("开始调度任务...... At: " + new Date()); try { //等待两分钟 Thread.sleep(1000L * 60L * 2L); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("Every Minute Run At: " + new Date());});scheduler.start();try { Thread.sleep(1000L * 60L * 10L);} catch (InterruptedException e) { e.printStackTrace();}scheduler.stop();
打印结果如下:
开始调度任务...... At: Wed Feb 13 10:22:00 CST 2019开始调度任务...... At: Wed Feb 13 10:23:00 CST 2019开始调度任务...... At: Wed Feb 13 10:24:00 CST 2019Every Minute Run At: Wed Feb 13 10:24:00 CST 2019开始调度任务...... At: Wed Feb 13 10:25:00 CST 2019Every Minute Run At: Wed Feb 13 10:25:00 CST 2019
由此可见,即使上一次调度任务没有执行完成,下次任务到了时间仍然会被调度。
总结:每次调度都是独立的,上次调度是否抛出异常、是否执行完,都与本次调度无关。
线程调度:
public class Quickstart { public static void main(String[] args) { Scheduler scheduler = new Scheduler(); scheduler.schedule("* * * * *", new Runnable() { @Override public void run() { System.out.println("Every Minute Run."); } }); scheduler.start(); try { Thread.sleep(1000L * 60L * 10L); } catch (InterruptedException e) { e.printStackTrace(); } scheduler.stop(); }}
系统进程调度:
public class ProcessJob { public static void main(String[] args) { ProcessTask task = new ProcessTask("C:\\Windows\\System32\\notepad.exe"); Scheduler scheduler = new Scheduler(); scheduler.schedule("* * * * *", task); scheduler.start(); }}
看完上述内容,你们对如何正确的使用Cron4j表达式有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注行业资讯频道,感谢大家的支持。
调度
任务
时间
表达式
内容
疑问
个部
写法
别名
幅度
控制台
方式
时候
由此
由此可见
答案
结果
除号
上一
控制
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
计算机的网络技术
软件开发属于固定资产吗
论坛网站 数据库
关于网络安全的校园剧本
网络技术的财报
数据库检查建立表间联系
达梦数据库查看大小写敏感
网络安全手抄报儿
哈工大数据库试题库及答案
分层保障网络安全指南
sci数据库不能导出
湖北有趣软件开发
方舟服务器语言文件重置
中山万联科技互联网有限公司
河源会计软件开发多少钱
为什么极限竞速7连不上服务器
物理机 服务器
linux服务器怎么远程管理
丰南区品牌软件开发常见问题
湖南长沙计算机网络技术学校
lena图像数据库
管家婆数据库安装打不开
网络安全具体问题
互联网科技创新的优势
html与sql数据库
全球网络安全产业现状
光与夜之恋怎么转服务器吗
浙江省第二届网络安全竞赛
热更新一定要服务器吗
海南系统软件开发排名