如何在Quartz调度程序中每25秒运行一次?

17
我正在使用Java的Quartz调度API。你能帮我使用cron表达式每25秒运行一次吗?它只是一个延迟。它不必总是在第0秒开始。例如,序列如下:0:00、0:25、0:50、1:15、1:40、2:05等,直到第5分钟序列再次从0秒开始。 谢谢。
7个回答

16

我认为cron表达式不能做到这一点,但你可以使用其他方法

SimpleScheduleBuilder.repeatSecondlyForever( 25 )

由于300秒(5分钟)是25的倍数,因此它将自动重复。


10
如果您想要一个定期触发的工作,可以使用Quartz SimpleTrigger和指定repeatInterval

6
这是这个问题的正确答案,时间表达式不适用于这个特定任务。 - ug_

8
使用Quartz 2.1.5 可以帮助实现以下内容:
CronTrigger trigger = newTrigger()
    .withIdentity("trigger1", "group1")
    .withSchedule(cronSchedule("0/20 * * * * ?"))
    .build();

4
每20秒一次,因为60是20的倍数。OP明确要求每25秒一次,这种方式不能满足要求。 - dcsohl

7

如果使用cron触发器来完成这个任务,唯一的方法太过复杂而且没有用处;你最好使用其他答案中提到的SimpleTrigger。不过,如果必须使用cron,你需要设置五个不同的cron触发器:

 0/25 0/5 * * * *
15/25 1/5 * * * *
 5/25 2/5 * * * *
20/25 3/5 * * * *
10/25 4/5 * * * *

第一触发器在0:00:25、0:00:50时触发;第二个触发器在0:01:15和0:01:40时触发;第三个在0:02:05、0:02:30、0:02:55;第四个在0:03:20、0:03:45;最后一个在0:04:10和0:04:35。然后第一个触发器在0:05:00再次接管,以此类推。
仅因为25秒可以整除5分钟(进而整除1小时),这才有效。如果你想每23秒触发一次?算了吧!

2

从逻辑上讲,这似乎应该奏效,但我使用的quartz版本(2.0.1)却没有。它每分钟都像0/25一样从0秒重新开始。 - rediVider
1
这不是每25秒一次,而是秒数的顺序如下:0 - 25 - 50 - 0。 - Levent Divilioglu

0

对于Quartz,您不能有这样的时间表。

您可以做的一件事是安排一个包装作业每5秒运行一次,并且只在第五次执行时进行任何工作。


0

你可以使用Camel的Throttler调节频率,将作业安排为不断运行。

<route>
  <from uri="jms:queue:TestQueue"/>
  <!-- throttle 1 messages per 25 sec -->
  <throttle timePeriodMillis="25000">
    <constant>1</constant>
    <to uri="bean:TestBean?method=testMethod"/>
  </throttle>
</route>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接