😎

ローカル環境でのQuartz設定、止まれQuartz

2024/09/17に公開

概要

Quartzをローカル環境で使用する際、無駄なリソース消費や不要なログ出力を避けるための設定方法について解説します。

簡単な状況説明

Quartzを利用して環境設定からCronExpression情報を取得し、タスクを実行しております。Quartzの設定資料を検索しましたが、On/Offのような設定はない認識です。

そのためにQuartzを止めるためには実装上でQuartzを起動できないようコード及びQuartzと関係ある設定ファイルを修正しないといけない状況です。

求めていること

ソースコードの変更を加えず、環境変数の設定だけでQuartzを制御する方法を模索しました。

対応の方向性

グーグル先生に「quartz cron expression how to do never execute」(英語ができない人間😅なので)を聞いてみました。

先生の答え

色々な結果が出ていますが、これだというものはありませんでした。

その中で一番簡単に実現出来る方法がありまして、あり得ないくらい🤨の未来の年度をCronExpression情報に設定することです。

今回はたまたまQuartzのCronExpression情報がアノテーションではなく、まとめているので一括で修正するか別のものを切り替えればOK。

CronExpressionに9999年入れたい

「9999年」が設定できればいいな。MysqlのDATEは出来るが、Javaはどうだ?

少し調べましたが「ユリウス暦」とか「グレゴリオ暦」話や使うクラス(Date、LocalDate等)によっても色々あるようで頭が痛くなりました。

でも大事なQuartzはそこまで多い未来は出来ないようです。

JavaDocを見ると
https://www.quartz-scheduler.org/api/2.3.0/index.html

Field Name        Allowed Values      Allowed Special Characters
Seconds           0-59                , - * /
...
Year (Optional)   empty, 1970-2199    , - * /

Oh No、私の孫👶までは使えないな。。。バージョンが上がれば2300年も使えるようになるのでしょうか?

Decompileで実装内容を見ると「2999年」まで行けるのではと一瞬思いました。

// loop until we've computed the next time, or we've past the endTime
while (!gotOne) {

    //if (endTime != null && cl.getTime().after(endTime)) return null;
    if(cl.get(Calendar.YEAR) > 2999) { // prevent endless loop...
        return null;
    }

だが、もう少し後の処理でこんなコードがありました。YEAR_TO_GIVEUP_SCHEDULING_ATが「2299」!!!孫までは使いそうなので良いとしよう😆。

    // test for expressions that never generate a valid fire date,
    // but keep looping...
    if (year > CronTrigger.YEAR_TO_GIVEUP_SCHEDULING_AT) {
        return null;
    }

最終確認

でも、JavaDocと差がので実際どこまでの年度が可能か、ネットにあるコードを利用して簡単(適当)なコードを作ってみました。

public static void main(String[] args) {
    String exp = "0 01 01 * * ? 2299";
    boolean valid = CronExpression.isValidExpression(exp);
    if (valid) {
        CronExpression cronExpression = null;
        try {
            cronExpression = new CronExpression(exp);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        valid = cronExpression.getNextValidTimeAfter(new Date()) != null;
    }
    System.out.println("Cron式の「" + exp + "」は " + (valid ? "使えます!" : "使えない!!!"));
}

年度以外な部分も影響はするようですが、一応上記のようなパターンだと私の環境で使っているQuartzは2299までは使えるようです。

結論

結論として、QuartzのCronExpressionで実現可能な最大年度は2299年までであり、これを利用すれば無駄なタスクの実行を防げることでした。

Inventit Tech

Discussion