Java Quartz时间间隔调度器

Java Quartz时间间隔调度器,java,quartz-scheduler,Java,Quartz Scheduler,我有一个工作,我想开始使用石英调度器(v2.1.5)在每天的特定时间(例如,上午8点到10点,间隔5分钟),不使用cron表达式,只使用本机方法。(据我所知,本机方法是在石英库中实现的)。 我有一个触发器: TriggerBuilder builder = TriggerBuilder.newTrigger() .withIdentity(name, group) .withSchedule(SimpleScheduleBuilde

我有一个工作,我想开始使用石英调度器(v2.1.5)在每天的特定时间(例如,上午8点到10点,间隔5分钟),不使用cron表达式,只使用本机方法。(据我所知,本机方法是在石英库中实现的)。 我有一个触发器:

TriggerBuilder builder = TriggerBuilder.newTrigger()
                .withIdentity(name, group)
                .withSchedule(SimpleScheduleBuilder.simpleSchedule()
                        .withIntervalInMilliseconds(interval)
                        .repeatForever());

当然,cron表达式并不困难,我可以用它来代替。但无论如何,我只想知道在这个问题上使用本机方法是否可行。乐意接受任何建议

下面是一个示例(修改了一点):


诀窍是有一个简单的触发器(如上面所示),但有一个日历实现,可以指定允许执行该触发器的时间

下面是一个示例(修改了一点):


诀窍是有一个简单的触发器(如上面所示),但有一个日历实现,可以指定允许执行该触发器的时间

API方法涵盖了几种简单(每个X,在X处)和不太简单(在X处的A、B、C天,在X处的每月)的场景,但您的方法稍微超出了这一点。
您可以尝试此操作,以使作业计划每5分钟(上午8点到上午10点)运行一次:

Trigger trigger = TriggerBuilder.newTrigger() // identity, job, etc.
        .withSchedule(simpleSchedule()
                .withIntervalInMinutes(5)
                .repeatForever())
        .startAt(DateBuilder.tomorrowAt(8,0,0))
        .endAt(DateBuilder.tomorrowAt(10,0,0))
        .build();
然后在你的工作中加入一些逻辑,以同样的方式重新安排自己在完成后的第二天。
或者,您可以将其计划为永远每5分钟运行一次,并在执行任何操作之前检查作业是否在上午8点到上午10点之间

或者你可以用,你知道的。。。cron表达式:

Trigger trigger = TriggerBuilder.newTrigger() // identity, job, etc.
        .withSchedule(cronSchedule("0 0/5 8-10 * * ? *"))
        .startAt(DateBuilder.evenMinuteDateAfterNow())
        .build();

这正是您想要的——这就是cron表达式的用途。

API方法涵盖了几种简单(每个X,在X)和不那么简单(A、B、C在X,每月在X)的场景,但您的场景稍微超出了这一点。
您可以尝试此操作,以使作业计划每5分钟(上午8点到上午10点)运行一次:

Trigger trigger = TriggerBuilder.newTrigger() // identity, job, etc.
        .withSchedule(simpleSchedule()
                .withIntervalInMinutes(5)
                .repeatForever())
        .startAt(DateBuilder.tomorrowAt(8,0,0))
        .endAt(DateBuilder.tomorrowAt(10,0,0))
        .build();
然后在你的工作中加入一些逻辑,以同样的方式重新安排自己在完成后的第二天。
或者,您可以将其计划为永远每5分钟运行一次,并在执行任何操作之前检查作业是否在上午8点到上午10点之间

或者你可以用,你知道的。。。cron表达式:

Trigger trigger = TriggerBuilder.newTrigger() // identity, job, etc.
        .withSchedule(cronSchedule("0 0/5 8-10 * * ? *"))
        .startAt(DateBuilder.evenMinuteDateAfterNow())
        .build();

这正是您想要的——这就是cron表达式的用途。

非常感谢您的回答!不幸的是,它没有解决我的问题。我想在上午8点到上午10点之间以一定的时间间隔(例如5秒)运行作业,这样它可以执行多个任务。我想每天都重复一遍。@Xavizo我更新了答案-这应该对你有用。@MatthiasHuttar看来DailyCalendar就是我要找的。谢谢!:)非常感谢您的回答!不幸的是,它没有解决我的问题。我想在上午8点到上午10点之间以一定的时间间隔(例如5秒)运行作业,这样它可以执行多个任务。我想每天都重复一遍。@Xavizo我更新了答案-这应该对你有用。@MatthiasHuttar看来DailyCalendar就是我要找的。谢谢!:)当您将Cron表达式与小时/天等一起使用时,它很有用,但当您希望通过在分钟或秒之间触发来使用它(例如,8:55-10:15,有一定间隔)时,它可能会涉及问题(您无法为该问题提供正确的表达式)。这就是为什么我会避免这样做。谢谢你的回答!是的,我知道cron表达式的局限性,但是对于你问题中更合理的例子,它们符合要求。我发现,在生产中,其他使用cron“不可行”的计划非常罕见,但如果您确实需要一个,您可以应用我的第一个解决方案(简单的日内计划计划计划,并让作业进行日常重新计划).您的解决方案确实很有帮助,但如果我希望在提供作业的同一天执行作业,该怎么办?事实上,在日常执行之前,我必须等待一天。可能是由另一个作业触发作业(使用方法todayAt而不是tommorowAt),该作业将计划每24小时运行一次(开始时间为上午12点+间隔24小时)?我使用了
tomorrowAt
,因为这是作业应该做的,以便正确地重新安排自己。在我们的设置中,作业的初始调度在应用程序启动期间完成(
RAMJobStore
),这可以在任何时候发生;如果我们使用
todayAt(8,0,0)
并且应用程序在上午8点后重新启动,那么作业将永远不会运行。使用
tomorrowAt
可以确保它能够做到这一点。但是是的,如果你想让它在你计划的同一天运行(你没有提到),是的,你可以在今天使用
。如果第一次运行的时间不重要,您也可以只执行
startNow()
。此外,可能我不清楚,但是使用
tomorrowAt
重新调度将在作业的
execute()
方法的末尾,而第一个
scheduleJob()
将在代码的不同部分(应用程序初始化代码、作业调度UI等)。不需要单独的“调度程序作业”IMHO.Cron表达式,当您在小时/天等情况下使用它时非常有用,但当您希望通过在分钟或秒之间触发来使用它时(例如,8:55-10:15,有一定间隔),它可能会涉及问题(您无法为该问题提供正确的表达式)。这就是为什么我会避免这样做。谢谢你的回答!是的,我知道cron表达式的限制,但对于你问题中更合理的例子,它们符合要求。那些其他使用cron“不可行”的计划,我发现它们在生产中非常罕见,但如果你真的需要,你可以应用我的第一个解决方案(简单的日内计划安排,并让作业进行日常重新安排)。您的解决方案非常有用,但如果我希望在提供作业的同一天执行作业,该怎么办?实际上,在日常执行之前,我必须等待一天。可能触发作业(使用方法todayAt代替tommorowAt)另一个作业将计划每24小时运行一次(开始时间为12am+间隔24小时)?我使用了
tomorrowAt
,因为这是作业应该做的,以正确地重新安排自己。在我们的设置中,初始计划