0

毎週月曜日に実行する必要のあるJavaで作成されたレポート作成プログラムがあり、スケジューリング部分にQuartzを使用しました。秘訣は、生成する必要のあるレポートの量が異なることです。月曜日が月曜日であるか、それ以降の月曜日であるかによって異なります。

これを実現するために、私が行ったのは、月曜日の各月曜日にトリガーを作成し、最初の月曜日が特定のジョブクラスを指し、残りの月曜日(トリガー)が別のジョブクラスを指すようにすることです。

        .withIdentity("trigger1", "group1")
        .withSchedule(cronSchedule("0 1 0 ? 1/1 MON#1 *"))
        .build();

        .withIdentity("trigger2", "group1")
        .withSchedule(cronSchedule("0 1 0 ? 1/1 MON#2 *"))
        .build();

など、私が到達するまで

        .withIdentity("trigger5", "group1")
        .withSchedule(cronSchedule("0 1 0 ? 1/1 MON#5 *"))
        .build();

月曜日が5回ある可能性があるため、MON#5に達しました。この10月のように。これは問題ありません、動作します(私は思います)が、私の質問はこれです。cronスケジュールを組み合わせて、次の月曜日に1つのトリガーのみが必要になるようにする方法はありますか?何かのようなもの;

        .withSchedule(cronSchedule("0 1 0 ? 1/1 MON#2,MON#3,MON#4,MON#5 *"))

もしあれば、教えてください。プログラミングで何かが足りない場合、または迷路の中に真実につながるWebである未知のページが存在する場合は、正しい方向に向けてください。

親切な言葉をいただければ幸いです。ありがとう

ps:UNIXコンピュータ用だと書いてありますが、cronタグを含めました。QuartzcronとUnixcronの間にほとんどまたはまったく違いはないと思います。ある場合は、教えてください。

4

4 に答える 4

1

月の最初のX日にcronに何かを実行させるための通常のUNIXの回避策は、cronにフォーム上のスクリプトをトリガーさせることです。

#! /usr/bin/bash
day=$( date +%d )
if ( ( day <= 7 ) ) ; then
    exec firstdayofthemonthshellscript.sh
fi

フォームにcrontabエントリがあります

0 0 * * 1 wrapperscript.sh

(たとえば、月曜日)。

要約すると、Quartz cronを使用しても目標を簡単に達成できるとは思いませんが、実装で上記のトリックを使用して作業できる可能性があります。

乾杯、

于 2012-10-18T09:15:59.183 に答える
1

問題に対する正式な解決策はないようです。

Quartz2.0のドキュメントからの引用は次のとおりです。

曜日フィールドには「#」文字を使用できます。この文字は、その月の「n番目」のXXX日を指定するために使用されます。たとえば、曜日フィールドの「6#3」の値は、その月の第3金曜日を意味します(6日目=金曜日、「#3」=月の第3金曜日)。その他の例:「2#1」=その月の第1月曜日、「4#5」=その月の第5水曜日。「#5」を指定し、その月に特定の曜日が5つない場合、その月には発火が発生しないことに注意してください。'#'文字を使用する場合、曜日フィールドには1つの式しか使用できません(2つの式があるため、 "3#1,6#3"は無効です)。

これには未解決のバグもあります

于 2012-10-18T09:16:45.927 に答える
1

個人的には、この種のロジックをQuartz構成内ではなくJavaに配置します。Quartzが常にJavaジョブディスパッチャーを実行するようにします。Javaジョブディスパッチャーは、日付に応じて実行するレポートを決定します。

于 2012-10-18T13:11:30.983 に答える
0

Tomerが述べたように、Quartzはこのユースケースをサポートしていません。ただし、Quartzが制約でない場合は、cron-utilsで有効な式を作成できます。例の下:

String multicron = "0 1 0 ? 1/1 MON#2|MON#3|MON#4|MON#5 *";
CronDefinition definition = CronDefinitionBuilder.instanceDefinitionFor(CronType.QUARTZ);
CronParser parser = new CronParser(definition);
Cron cron = parser.parse(multicron);

cron-utilsは現在、ジョブを実行する手段を提供していませんが、任意の日付の次/前の実行時間を提供します。

于 2018-03-24T12:51:08.180 に答える