Java中是否有类似Cron的ScheduledExecutorService实现?

时间:2009-01-22 16:42:51

标签: java scheduler

Java中的ScheduledExecutorService对于以固定间隔或固定延迟重复任务非常方便。我想知道是否有像现有的ScheduledExecutorService这样的东西可以让你指定一天中安排任务的时间,而不是一段时间,即“我希望这个任务每天上午10点开火”。

我知道你可以用Quartz来实现这个目标,但是如果可能的话我宁愿不使用那个库(它是一个很棒的库,但我宁愿没有依赖性,原因有几个。)

6 个答案:

答案 0 :(得分:3)

在HA-JDBC中,更多搜索已经出现CronExecutorService。有趣的是,它的CronExpression类依赖于Quartz,但就是这样。那还不错。

更新:我已修复损坏的链接以指向新版本,但我不知道这是否是唯一的依赖

答案 1 :(得分:2)

您可以使用Timer课程。具体来说,scheduleAtFixedRate(TimerTask任务,Date firstTime,long period)。您可以将任务设置为在特定日期的上午10点开始,并且每24小时重复一次。

答案 2 :(得分:1)

使用scheduleAtFixedRate时,您会提供延迟。所以延迟可以是上午10点的差异,周期是24小时。 即使使用计时器,这可能会有点漂移,所以你可以做的是安排一个任务,每次都有适当的延迟将自己添加到ScheduledExecutorService。

答案 3 :(得分:1)

答案 4 :(得分:1)

只要不需要外部线程管理,就可以使用

ThreadPoolTask​​Scheduler。在内部,它委托给 ScheduledExecutorService 实例。 ThreadPoolTask​​Scheduler 实际上也实现了Spring的 TaskExecutor 接口,因此单个实​​例可以尽快用于异步执行,也可以用于计划和可能重复执行。< / p>

CronTrigger()接受cronExpression http://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/scheduling/support/CronSequenceGenerator.html

的位置

有关此解决方案的更多信息,请参阅Spring文档:https://docs.spring.io/spring/docs/current/spring-framework-reference/html/scheduling.html

import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import org.springframework.scheduling.support.CronTrigger;
import java.util.Date;

public class CronTriggerSpringTest{
public static void main(String args[]){
    String cronExpression = "0/5 * * * * *";
    ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
    scheduler.initialize();
    scheduler.schedule(new Runnable() {
        @Override
        public void run() {
            System.out.println("Hello Date:"+new Date());
        }
    }, new CronTrigger(cronExpression));
}
}

答案 5 :(得分:0)

CronScheduler可以解决ScheduledThreadPoolExecutor的时钟漂移问题,当System.nanoTime用于根据UTC时间,Unix时间或系统时间而不是进程中的抽象来实际调度时, Duration syncPeriod = Duration.ofMinutes(1); CronScheduler cron = CronScheduler.create(syncPeriod); ZoneId myTZ = ZoneId.systemDefault(); cron.scheduleAtRoundTimesInDay(Duration.ofHours(2), myTZ, runTimeMillis -> { // Do the task }); 提供的时间。

CronScheduler还提供scheduleAtRoundTimesInDay,用于处理时区人员和夏令时更改。

Claim