工作日每隔n周执行一次工作,并在Quartz的x时刻执行b

时间:2013-10-14 17:37:30

标签: java triggers scheduled-tasks quartz-scheduler scheduling

我想在星期一和星期二上午10:00(例如)在Quartz 2.2.1中每两周触发一份工作。

我想使用CronTrigger,但不幸的是,“每2周”无法设置一个cron作业(参见explanation here)。使用CalendarIntervalTrigger似乎也不合适,因为我找不到工作日的支持。

这个Quartz有解决方案吗?

3 个答案:

答案 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)

这应该实现克隆接口。否则触发器将获得错误的开火时间。