Java 在下一个工作日提交石英晶体表达式
我需要创建一个Quartz-cron表达式,如果它是工作日,则每10天激发一次,否则会激发到第二天或第二天之后Java 在下一个工作日提交石英晶体表达式,java,scheduled-tasks,quartz-scheduler,Java,Scheduled Tasks,Quartz Scheduler,我需要创建一个Quartz-cron表达式,如果它是工作日,则每10天激发一次,否则会激发到第二天或第二天之后 例如,2014年8月10日为周日,火灾周一为11日 例如,2014年9月10日是星期三,火灾星期三是10日 例如,2015年1月10日是星期六,火灾星期一是12日 我强调了第三个案例:我尝试了0 10W*?作为表达式,但它于2015年1月8日星期五启动。我需要它以后被解雇 我该怎么告诉Quartz?我想用三个表达式,例如“第10个如果是工作日”、“第11个如果是星期一”和“第12个
- 例如,2014年8月10日为周日,火灾周一为11日
- 例如,2014年9月10日是星期三,火灾星期三是10日
- 例如,2015年1月10日是星期六,火灾星期一是12日
0 10W*?
作为表达式,但它于2015年1月8日星期五启动。我需要它以后被解雇
我该怎么告诉Quartz?我想用三个表达式,例如“第10个如果是工作日”、“第11个如果是星期一”和“第12个如果是星期一”,但我不能将“月日”和“周日”字段组合在一起(我总是得到一个无效的cron表达式错误)我认为用一个简单的cron表达式无法做到这一点,但可以使用以下解决方案 首先使用经典的Cron触发器安排您的作业
CronScheduleBuilder sh = cronSchedule("0 0 0 10 * ?");
TriggerBuilder<Trigger> tb = newTrigger()
.withSchedule(sh)
.withIdentity("MyTrigger");
我认为查看Quartz Calendars:+1以获取资源可能会有所帮助,但在当前情况下,我必须尝试通过配置而不是代码来解决问题。我认为您无法使用单个cron表达式来解决问题。我很确定你至少需要组合两个表达式…@davioooh我可以组合,也就是说我可以用不同的表达式安排同一工作的两个实例。是的,没错。然而,我想你也必须在工作代码上工作才能得到你想要的。
public class MyTriggerListener implements TriggerListener {
[...]
@Override
public void vetoJobExecution(Trigger trigger, JobExecutionContext context) {
// You check if it is your Cron Trigger
if ("MyTrigger".equals(trigger.getKey.getName()) {
Calendar cal = Calendar.getInstance();
// If current date is sunday, then another one-time trigger
// is created to delay the job firing
if (Calendar.SUNDAY.equals(cal.get(Calendar.DAY_OF_WEEK))) {
cal.add(Calendar.DATE, 1); // One day later
TriggerBuilder<Trigger> tb = newTrigger()
.startAt(cal.getTime());
.withIdentity("MyTrigger_delayed");
.forJob(context.getJobDetail());
// TODO schedule it in Quartz the way you want
// like : scheduler.scheduleJob(tb.build());
return true; // The current fire is vetoed
}
// If current date is saturday, then another one-time trigger
// is created to delay the job firing
else if (Calendar.SATURDAY.equals(cal.get(Calendar.DAY_OF_WEEK))) {
cal.add(Calendar.DATE, 2); // Two day later
TriggerBuilder<Trigger> tb = newTrigger()
.startAt(cal.getTime());
.withIdentity("MyTrigger_delayed");
.forJob(context.getJobDetail());
// TODO schedule it in Quartz the way you want
// like : scheduler.scheduleJob(tb.build());
return true;// The current fire is vetoed
}
// If it is a weekday, the job fires normally
else {
return false;
}
}
// It is not your Cron Trigger
return false;
}
}
TriggerListener myTriggerListener = new MyTriggerListener("MyTriggerListener");
scheduler.getListenerManager().addTriggerListener(myTriggerListener, allTriggers());