Cron表示式 「 」與步增

2021-08-10 19:52:31 字數 1379 閱讀 9394

問題陳述

在使用quartz工具包來獲取cron表示式的下次執行時間時,發現增量的功能和預期不一致,並不是「每隔多少秒」。而是「從x秒開始每隔多少秒執行一次,當達到最大值後再次從x秒開始」,並不能基於乙個begintime和cron做持續步增。

獲取的方法如下

crontriggerimpl crontriggerimpl = new crontriggerimpl();

try catch (parseexception e)

cron表示式是:

*/7 * * * * ?

獲取的結果是:

16:12:00,16:12:07,16:12:14,16:12:21,16:12:28,16:12:35,16:12:42,16:12:49,

16:12:56,

16:13:00,

16:13:07,

16:13:14,16:13:21,16:13:28,16:13:35,16:13:42,16:13:49,16:13:56,16:14:00,16:14:07

具體的原因如下

其實cron表示式」*/7 * * * * ?」等價於」0/7 * * * * ?」

分析crontriggerimpl和cronexpression的buildexpression、storeexpressionvals、addtoset等方法可知:

步增量a/b處理過程如下:

1,步增量為

b,步增的起始值為

a(預設值為0,

*也是0)。

2,依據起始值,步增值,該位置的最大值生成乙個

treeset

,儲存該位置的可取值。

在生成可執行時間時,由這些時間組合形成。所以cron在該位置的取值是固定的幾個值。

解決方案:1,s

pring scheduled

@scheduled(fixedrate = 9000)
從啟動起,每9000ms

執行一次

2,基於

calendar

計算

calendar cal = calendar.getinstance();

cal.settimeinmillis(time);

cal.add(calendar.millisecond,90000);

CRON表示式詳解與案例

1.cron表示式格式 2.cron表示式各佔位符解釋 允許值範圍 0 59 不允許為空值,若值不合法,排程器將丟擲schedulerexception異常 代表每隔1秒鐘觸發 代表在指定的秒數觸發,比如 0,15,45 代表0秒 15秒和45秒時觸發任務 代表在指定的範圍內觸發,比如 25 45 ...

Cron表示式詳解 job表示式

cron表示式的詳細用法 字段 允許值 允許的特殊字元 秒 0 59 分 0 59 小時 0 23 日期 1 31 l w c 月份 1 12 或者 jan dec 星期 1 7 或者 sun sat l c 年 可選 留空,1970 2099 例子 0 5 每5秒執行一次 字元被用來指定所有的值。...

Cron表示式示例 表示式 說明

0 0 12 每天12點執行 0 15 10 每天10 15執行 0 15 10 2011 2011年的每天10 15執行 0 14 每天14點到15點之間每分鐘執行一次,開始於14 00,結束於14 59。0 0 5 14 每天14點到15點每5分鐘執行一次,開始於14 00,結束於14 55。0...