首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 程式設計入門

JDring:Java 版 Cron 定時調度輕量級方案

     編輯:Java 程式設計入門

JDK java.util.Timer 僅支持固定間隔調度,無法表達「每天 02:00」、「每周一 09:00」等 Cron 風格時間表達式。JDring(Olivier Dedieu 開源)填補此空白,提供類 Unix Cron 的聲明式定時調度 API,輕量零依賴,適合中小型項目快速接入。

核心組件

  • AlarmListener:單方法接口 void handleAlarm(AlarmEntry entry)
  • AlarmEntry:封裝觸發時間詳情(分、時、日、月、周、年)
  • AlarmManager:中央調度器,addAlarm(...) 註冊任務

快速上手

1. 實現監聽器

import com.jalios.jdring.*;

public class Buzzing implements AlarmListener {
    private final String message;
    public Buzzing(String message) { this.message = message; }
    @Override
    public void handleAlarm(AlarmEntry entry) {
        System.err.println("⏰ " + message);
        System.err.println("觸發時間: " + entry.getDate());
    }
}

2. 註冊定時任務

import com.jalios.jdring.*;
import java.util.Calendar;

public class ScheduleDemo {
    public static void main(String[] args) throws PastDateException {
        AlarmManager mgr = new AlarmManager();

        // 每小時第 20 分鐘觸發
        mgr.addAlarm(20, -1, -1, -1, -1, -1, new Buzzing("每小時第 20 分報時"));

        // 每周五 17:00 觸發
        mgr.addAlarm(0, 17, -1, -1, Calendar.FRIDAY, -1, new Buzzing("周五下班提醒"));

        // 固定日期:3月20日 12:00(周年紀念)
        mgr.addAlarm(0, 12, 20, Calendar.MARCH, -1, -1, 
            new Buzzing("記住:明天是周年紀念日!"));

        // 單次觸發:2025-12-25 09:00
        mgr.addAlarm(0, 9, 25, Calendar.DECEMBER, -1, 2025, 
            new Buzzing("聖誕節快樂!"));
    }
}

參數詳解:addAlarm(min, hour, dom, month, dow, year, listener)

參數含義特殊值示例
min分鐘 (0-59)-1 = 每分鐘0 = 整點
hour小時 (0-23)-1 = 每小時17 = 下午5點
dom月中的日 (1-31)-1 = 每天1 = 每月1號
month月 (Calendar.JANUARY...)-1 = 每月Calendar.MARCH
dow周中的日 (Calendar.SUNDAY...)-1 = 不按周限制Calendar.FRIDAY
year年 (如 2025)-1 = 每年2025 = 僅2025年

規則:-1 表示「不限制該維度」,組合形成 Cron 表達式語義。至少一個維度非 -1,否則每分鐘觸發。

架構優勢與局限

維度評價
依賴零第三方依賴,單 JAR ~50KB
線程模型單獨調度線程輪詢,精度 ~秒級
持久化無內建,需自行序列化 AlarmEntry 重啟恢復
集群/高可用不支持,單機模式
動態增刪支持運行時 addAlarm,無移除 API(可用標識位在 Listener 內控制)
Spring 整合需自行封裝為 Bean,或改用 @Scheduled(cron="...") / Quartz

適用場景建議

  • ✅ 單體應用、微服務實例內輕量定時任務
  • ✅ 原型驗證、工具類項目、無需引入 Quartz/Spring Batch 的場景
  • ✅ 需要 Cron 表達式語義但不想依賴重框架
  • ❌ 分布式集群、任務持久化、監控管理、動態配置中心場景 → 選 Quartz 或 Spring Scheduling
  • ❌ 高精度(毫秒級)、複雜依賴圖、任務鏈編排 → 選 Quartz / xxl-job

Maven 坐標(非官方中央倉庫,需手動安裝或 JitPack)

<dependency>
    <groupId>com.jalios</groupId>
    <artifactId>jdring</artifactId>
    <version>1.0</version>
</dependency>

JDring 以極簡 API 實現了 Java 世界缺失的「Cron 風格聲明式調度」,是工具箱裡值得收藏的輕量級利器。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved