4

我正在使用 Quartz-Scheduler 来执行重复性任务,但我遇到了麻烦。在我的服务器端,我的用户想要指定一些日期范围,例如 2013-09-27 in 09:00 AM - 12:00 PM 2013-09-30

解释:

运行工作从2013-09-272013-09-30但仅在之间09:00 AM - 12:00 PM

我在为其编写 Cron 表达式时遇到了麻烦,而且我的用户不是技术人员,所以我的用户希望我从两个时间戳值自动创建 Cron 表达式。

请帮帮我。让我知道是否有其他方法。

我在谷歌上看到了很多资源,但我仍然什么也找不到。

链接:

http://quartz-scheduler.org/documentation/quartz-1.x/tutorials/crontrigger

http://quartz-scheduler.org/documentation/quartz-2.x/tutorials/tutorial-lesson-05

unix/linux 中的 cron 表达式是否允许指定确切的开始和结束日期

更新

我写了一个,但它不起作用

|------------------------------------------------------------------|
| Seconds | Minutes | Hours | DayOfMonth | Month | DayOfWeek | Year|
|         |         |       |            |       |           |     |
|   0     |    0    | 9-12  |   27-30    |   9   |     ?     | 2013|
|------------------------------------------------------------------|

试图映射2013-09-272013-09-30但仅限于之间09:00 AM - 12:00 PM

更新 了我也试过运行它

Trigger trigger = TriggerBuilder.newTrigger().withIdentity(NAME_TRIGGER_TASK_UPDATER, GROUP_TASK_TRIGGER)
                    .withSchedule(CronScheduleBuilder.cronSchedule("0 0 9-12 19-22 10 ? *")).build();

但它没有给出任何错误,也没有进入我工作的执行方法

cronSchedule("0 0 9-12 ? * ?") throws invalid schedule exception.

下面的代码在不考虑开始和结束日期的情况下运行它。

String startDateStr = "2013-09-27 00:00:00.0";
        String endDateStr = "2013-09-31 00:00:00.0";

        Date startDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S").parse(startDateStr);
        Date endDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S").parse(endDateStr);

        CronTrigger cronTrigger = newTrigger()
          .withIdentity("trigger1", "testJob")
          .startAt(startDate)
          .withSchedule(CronScheduleBuilder.cronSchedule("0 0 9-12 * * ?"))
          .endAt(endDate)
          .build();
4

1 回答 1

7

当你说它不起作用时,你得到什么错误?

您可以尝试以下代码(编辑:适用于 Quartz 2.2)。这种方法不在 cron 表达式中指定开始/结束日期和年份,而是使用 Trigger 方法来指定它们。(注意:我自己没有测试过,如果它适合你,请告诉我)

编辑: 我有机会测试这段代码,我运行下面的代码并不断更改系统时钟,从开始到结束日期的上午 9 点到 12 点之间所有触发器都成功。

public class CronJob {

    public static void main(String[] args) throws ParseException, SchedulerException {

        Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();

        JobDetail job = newJob(TestJob.class)
            .withIdentity("cronJob", "testJob") 
            .build();

        String startDateStr = "2013-09-27 00:00:00.0";
        String endDateStr = "2013-09-31 00:00:00.0";

        Date startDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S").parse(startDateStr);
        Date endDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S").parse(endDateStr);

        CronTrigger cronTrigger = newTrigger()
          .withIdentity("trigger1", "testJob")
          .startAt(startDate)
          .withSchedule(CronScheduleBuilder.cronSchedule("0 0 9-12 * * ?").withMisfireHandlingInstructionDoNothing())
          .endAt(endDate)
          .build();

        scheduler.scheduleJob(job, cronTrigger);
        scheduler.start();
    }    

    public static class TestJob implements Job {
        @Override
        public void execute(JobExecutionContext context) throws JobExecutionException {
            System.out.println("this is a cron scheduled test job");
        }        
    }
}

如果上面的代码不起作用,请尝试替换cronSchedule("0 0 9-12 * * ?")cronSchedule("0 0 9-12 ? * ?")

于 2013-09-27T19:07:46.870 回答