使用非公历日历cron表达式调度作业

时间:2018-10-16 08:41:15

标签: java cron schedule quartz islamic-calendar

是否可以使用“伊斯兰日历”来安排cron作业?理想情况下:

CronExpression cronExpression = new CronExpression("0 0 0 1 * ? *", CalendarEnum.ISLAMIC);

我正在努力寻找Java Quartz文档的最小线索(“质量检查”部分提到1),并且检查了源代码,发现默认日历(在 CronExpression.java中找到了)是公历。有没有一种方法可以通过使用包含/排除org.quartz.Calendar来实现?我认为不是吗?

是否有人知道如何扩展/实现cron表达式的不同变体以覆盖例如伊斯兰日历?还是其他开放源代码库(托管在mvn Central repo上)?或根本没有任何方法可以实现抽象的重复表达方式(例如,每个伊斯兰月份的每个第一天重复一次)?

暂时,我正在考虑手动将多个org.quartz.Trigger日期绑定到工作(从回教转换为格里高利安)。但是,这并不是最佳选择,因为单个cron表达式可能会导致十二或数百个日期。

很抱歉,对于不是那么技术性的问题,但该主题似乎尚未发现且信息稀疏。

1 个答案:

答案 0 :(得分:1)

由于伊斯兰历和公历未对齐,并且伊斯兰月份的长度与公历的长度不同,因此这非常棘手。我建议执行以下样式(Linux Cron样式)的cron实现:

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7)
# |  |  |  |  |
# *  *  *  *  *   command to be executed
  x  y  *  *  *   IslamicMonthTestCmd && command

该想法是每天x小时y分钟进行一次测试,以检查您是否在伊斯兰月份的第一个月。这是通过IslamicMonthTestCmd完成的,您仍然需要自己编写。如果此测试通过,则您执行command

写这个IslamicMonthTestCmd并不容易,因为与公历相反,伊斯兰日历受人的影响很大。月份取决于宗教权威人士对新月的能见度,因此,可能会在一两天内发生变化,这显然受到人,天气和其他各种干扰的影响。当前的伊斯兰教年是1440年。在公历中,1440年AH是从大约到2018年9月11日至2019年8月30日。 [来源:Wikipedia]