您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關(guān)如何正確的使用Cron4j表達(dá)式,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
cron4j是一個輕量級的Java任務(wù)調(diào)度工具。
引入Jar包:
<dependency> <groupId>it.sauronsoftware.cron4j</groupId> <artifactId>cron4j</artifactId> <version>2.2.5</version> </dependency>
cron4j的cron表達(dá)式最多只允許5個部分,每個部分用空格分隔開,從左至右分別表示“分”、“時”、“天”、“月”、“周”,具體規(guī)則如下:
分:取值從 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個部分的分、時、天、月、周又分別支持如下字符:
數(shù)字 n :表示一個具體的時間點,例如 5 * * * * 表示 5 分這個時間點時執(zhí)行 逗號 , :表示指定多個數(shù)值,例如 3,5 * * * * 表示 3 和 5 分這兩個時間點執(zhí)行 減號 - :表示范圍,例如 1-3 * * * * 表示 1 分、2 分再到 3 分這三個時間點執(zhí)行 星號 * :表示每一個時間點,例如 * * * * * 表示每分鐘執(zhí)行 除號 / :表示指定一個值的增加幅度。例如 */5表示每隔5分鐘執(zhí)行一次(序列:0:00, 0:05, 0:10, 0:15 等等)
常見錯誤: cron4j在表達(dá)式中使用除號指定增加幅度時與linux稍有不同。例如在linux中表達(dá)式 10/3 * * * * 的含義是從第10分鐘開始,每隔三分鐘調(diào)度一次,而在cron4j中需要使用 10-59/3 * * * * 來表達(dá)。
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();
兩大疑問: 第一個疑問是當(dāng)某個任務(wù)調(diào)度拋出了異常,那么這個任務(wù)在下次被調(diào)度的時間點上還會不會被調(diào)度,答案是肯定的,不管什么時候出現(xiàn)異常,時間一到調(diào)度仍然會被執(zhí)行。
Scheduler scheduler = new Scheduler(); scheduler.schedule("*/1 * * * *", () -> { System.out.println("Every Minute Run At: " + new Date()); throw new RuntimeException("任務(wù)調(diào)度拋出異常"); }); scheduler.start(); try { Thread.sleep(1000L * 60L * 10L); } catch (InterruptedException e) { e.printStackTrace(); } scheduler.stop();
打印結(jié)果如下:
Every Minute Run At: Wed Feb 13 10:09:00 CST 2019 java.lang.RuntimeException: 任務(wù)調(diào)度拋出異常 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: 任務(wù)調(diào)度拋出異常 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)
由此可見,即使上一次調(diào)度任務(wù)發(fā)生異常,下次任務(wù)到了時間仍然會被調(diào)度。
第二個疑問是假如某個任務(wù)執(zhí)行時間很長,如果這個任務(wù)上次調(diào)度后直到本次調(diào)度到來的時候還沒執(zhí)行完,那么本次調(diào)度是否還會進(jìn)行,答案也是肯定的。
Scheduler scheduler = new Scheduler(); scheduler.schedule("*/1 * * * *", () -> { System.out.println("開始調(diào)度任務(wù)...... 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();
打印結(jié)果如下:
開始調(diào)度任務(wù)...... At: Wed Feb 13 10:22:00 CST 2019 開始調(diào)度任務(wù)...... At: Wed Feb 13 10:23:00 CST 2019 開始調(diào)度任務(wù)...... At: Wed Feb 13 10:24:00 CST 2019 Every Minute Run At: Wed Feb 13 10:24:00 CST 2019 開始調(diào)度任務(wù)...... At: Wed Feb 13 10:25:00 CST 2019 Every Minute Run At: Wed Feb 13 10:25:00 CST 2019
由此可見,即使上一次調(diào)度任務(wù)沒有執(zhí)行完成,下次任務(wù)到了時間仍然會被調(diào)度。
總結(jié):每次調(diào)度都是獨立的,上次調(diào)度是否拋出異常、是否執(zhí)行完,都與本次調(diào)度無關(guān)。
線程調(diào)度:
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(); } }
系統(tǒng)進(jìn)程調(diào)度:
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(); } }
看完上述內(nèi)容,你們對如何正確的使用Cron4j表達(dá)式有進(jìn)一步的了解嗎?如果還想了解更多知識或者相關(guān)內(nèi)容,請關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。