我想在星期一和星期二上午10:00(例如)在Quartz 2.2.1中每两周触发一份工作。
我想使用CronTrigger,但不幸的是,“每2周”无法设置一个cron作业(参见explanation here)。使用CalendarIntervalTrigger似乎也不合适,因为我找不到工作日的支持。
这个Quartz有解决方案吗?
答案 0 :(得分:1)
关键的想法是在“星期一和星期二上午10点”使用cron触发器。由于cron触发器每周都会触发,因此您必须自己实施“每两周”一次。因此,为了计算某个日期之后的下一个开火时间,你让cron触发器给你下一个开火时间,并检查你是否在正确的一周。如果不是,则添加偏移量以获得正确的一周。
这一切都可以通过覆盖AbstractTrigger来完成。作为一个例子,我将展示一个关键方法getFireTimeAfter:
public class MyTrigger extends AbstractTrigger<MyTrigger> {
//your cron trigger for Monday and Tuesday at 10:00am
private OperableTrigger trigger;
//initialize this with the first fire time in method computeFirstFireTime
private Date firstFireTime;
//fire every N weeks
private int nboWeeks;
//...
@Override
public Date getFireTimeAfter(Date afterTime) {
//Get the fire time of the cron trigger after afterTime
Date cronFireTime = trigger.getFireTimeAfter(afterTime);
//we have to determine whether we're in the correct week
int weeksSinceFirstFire = ...; //calculate the nbo weeks since firing for the first time
int weekOffset = weeksSinceFirstFire % nboWeeks;
//we won't fire any more or are in the correct week
if (cronFireTime == null || weekOffset == 0) {
return cronFireTime;
}
int weeksToAdd = weeksSinceFirstFire - weekOffset;
Date fireTime = ...; // add weeksToAdd to cronFireTime
return fireTime;
}
//...
}
答案 1 :(得分:0)
平日工作时间每n周执行一次,并且在石英的x o时刻执行工作
在星期一和星期二上午10点开始工作,我们需要确定星期一和星期二的最新日期。然后在CalendarIntervalTrigger中将这些日期用作startdate。
确定从今天起的最新/下一个星期一和星期二的日期。代码可以找到here。然后在Quartz calendarIntervalSchedule上应用日期。
//dd.M.yyyy hh:mm:ss a
//Monday
String getMondayDate = "23 JUNE 2014 10:0:0 am"
String MONDAY = getMondayDate;
Date startDate = new SimpleDateFormat("dd.M.yyyy hh:mm:ss a").parse(MONDAY);
Trigger trigger = newTrigger()
.withIdentity("mondayTrigger", "group1")
.startAt(startDate) //put retrieved monday date here
.withSchedule(calendarIntervalSchedule()
.withIntervalInWeeks(2)) // interval is set in calendar weeks
.build();
//Tuesday
String getTuedayDate = "24 JUNE 2014 10:0:0 am"
String TUESDAY = getTuesdayDate;
Date startDate = new SimpleDateFormat("dd.M.yyyy hh:mm:ss a").parse(TUESDAY);
Trigger trigger = newTrigger()
.withIdentity("mondayTrigger", "group1")
.startAt(startDate) //put retrieved monday date here
.withSchedule(calendarIntervalSchedule()
.withIntervalInWeeks(2)) // interval is set in calendar weeks
.build();
答案 2 :(得分:0)
这应该实现克隆接口。否则触发器将获得错误的开火时间。