問題陳述:
在使用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...