Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在下一个工作日提交石英晶体表达式_Java_Scheduled Tasks_Quartz Scheduler - Fatal编程技术网

Java 在下一个工作日提交石英晶体表达式

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个

我需要创建一个Quartz-cron表达式,如果它是工作日,则每10天激发一次,否则会激发到第二天或第二天之后

  • 例如,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());