使用 Cron4j 表示式 在 Solon 裡開發定時任務

劉之西東發表於2021-07-13

cron4j 是一個輕量級的Java任務排程工具。cron4j-solon-plugin 是 solon 對 cron4j 的適配外掛

新增 maven 引用

<dependency>
    <groupId>org.noear</groupId>
    <artifactId>cron4j-solon-plugin</artifactId>
    <version>1.5.11</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 * * * * 來表達。

cron4j-solon-plugin 外掛的 @Cron5x 註解

Cron5x 表示,支援5段的 Cron 表示式;同時支援快速配置:s m h d,例:10s (每隔10秒跑一次)

新建程式碼檔案,試一試

  • java/jobapp/JobApp
  • java/jobapp/controller/Cron4jRun1
  • java/jobapp/controller/Cron4jRun2
  • java/jobapp/controller/Cron4jTask
  • reources/application.properties

程式碼

  • JobApp 程式碼

JobApp.java

//
// 啟用 Cron4j 主解的任務
//
@EnableCron4j
public class JobApp {
    public static void main(String[] args) {
        Solon.start(JobApp.class, args);
    }
}

  • 使用快捷配置模式:n + ms,s,m,h,d ;使用Runnable介面開發

Cron4jRun1.java

@Cron4j(cron5x = "2s", name = "job1")
public class Cron4jRun1 implements Runnable {
    @Override
    public void run() {
        System.out.println("我是 Cron4jRun1 (2s)");
    }
}
  • 使用cron5x配置模式:* * * * * ;使用Runnable介面開發

Cron4jRun2.java

@Cron4j(cron5x = "*/1 * * * *")
public class Cron4jRun2 implements Runnable {
    @Override
    public void run() {
        System.out.println("我是 Cron4jRun2 (*/1 * * * *)");
    }
}

  • 使用cron5x配置模式:* * * * * ;使用Task介面開發

Cron4jTask.java

@Cron4j(cron5x = "*/1 * * * *")
public class Cron4jTask extends Task {
    @Override
    public void execute(TaskExecutionContext context) throws RuntimeException 
        System.out.println("我是 Cron4jTask (*/1 * * * *)");
    }
}

通過配置,控制有name的任務

application.properties

# solon.cron4j.{job name}
#
solon.cron4j.job1.cron5x=10s  #重新定義時間表示式
solon.cron4j.job1.enable=true #用任務進行啟停控制

執行輸出

solon.plugin:: Start loading
file:/Users/xieyuejia/WORK/work_github/solon_demo/demo10.solon_schedule/target/classes/application.properties
jar:file:/Users/xieyuejia/.m2/repository/org/noear/cron4j-solon-plugin/1.2.20/cron4j-solon-plugin-1.2.20.jar!/solonplugin/solon.extend.cron4j.properties
我是定時任務: Cron4jRun1(200ms))
solon.plugin:: End loading @129ms
我是定時任務: Cron4jRun1(200ms)

DEMO原始碼

原始碼:demo10.solon_schedule

相關文章