如何正确的使用Cron4j表达式
发表于:2025-01-27 作者:千家信息网编辑
千家信息网最后更新 2025年01月27日,今天就跟大家聊聊有关如何正确的使用Cron4j表达式,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。cron4j是一个轻量级的Java任务调度工
千家信息网最后更新 2025年01月27日如何正确的使用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安全错误
数据库的锁怎样保障安全
魔兽世界 服务器不兼容
瑞天图书管理服务器
苹果手机app怎么连接服务器
点情网络技术有限公司地址
语文数据库
浪潮服务器产品型号
浪潮服务器默认管理员网密码
文明网络安全知识
坚决打好网络安全工作
医药数据库销售如何做
软件开发外包厂家哪家好
服务器断电后启动出现蓝屏
数据库移动到其它电脑无法连接
网络安全的专业有哪些
温州销售服务管理软件开发
服务器运行内存和cpu占用不多
eba 数据库
数据库应用技术好就业吗
edb数据库中过滤条件
如何查看数据库中的信息
流程仿真软件开发
5g网络技术测试规范下载
奇安信网络安全股份
语文数据库
数据库全外连接实例
初中生的网络安全小报内容七年级
东光县委网络安全委员会
模拟器在线数据库
唐山直销软件开发公司电话
脚本软件开发搭建