😎

ローカル環境での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