亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何正確的使用Cron4j表達式

發布時間:2021-06-21 14:56:29 來源:億速云 閱讀:162 作者:Leah 欄目:大數據

今天就跟大家聊聊有關如何正確的使用Cron4j表達式,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。

cron4j是一個輕量級的Java任務調度工具。

引入Jar包:

<dependency>
	<groupId>it.sauronsoftware.cron4j</groupId>
	<artifactId>cron4j</artifactId>
	<version>2.2.5</version>
</dependency>

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 2019
Every Minute Run At: Wed Feb 13 10:24:00 CST 2019
開始調度任務...... At: Wed Feb 13 10:25:00 CST 2019
Every 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表達式有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

上蔡县| 盈江县| 东乡县| 镇远县| 洛隆县| 信宜市| 潍坊市| 连南| 横山县| 双牌县| 安国市| 遂宁市| 获嘉县| 临西县| 汤阴县| 唐海县| 济源市| 若尔盖县| 大港区| 咸丰县| 宜章县| 革吉县| 岳普湖县| 海门市| 万载县| 临武县| 南澳县| 蒙阴县| 石城县| 太谷县| 马公市| 日喀则市| 稻城县| 洛阳市| 涟水县| 普陀区| 商南县| 新余市| 桃园县| 齐河县| 沙湾县|