8

Java 中的 ScheduledExecutorService 对于以固定间隔或固定延迟重复任务非常方便。我想知道是否有类似于现有的 ScheduledExecutorService 的东西,它可以让您指定一天中的某个时间来安排任务,而不是一个时间间隔,即“我希望这个任务在每天上午 10 点触发”。

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

4

6 回答 6

11

ThreadPoolTask​​Scheduler,可以在不需要外部线程管理时使用。在内部,它委托给一个ScheduledExecutorService实例。ThreadPoolTask​​Scheduler也 实现了 Spring 的TaskExecutor接口,因此单个实​​例可以用于异步执行以及计划的和可能重复的执行。

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));
}
}
于 2017-03-26T18:41:54.657 回答
4

HA-JDBC 中的CronExecutorService出现了更多搜索。有趣的是,它的CronExpression类依赖于 Quartz,但仅此而已。这还不错。

更新:我已经修复了指向新版本的断开链接,但我不知道这是否是唯一的依赖项了

于 2009-01-23T11:26:17.563 回答
3

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

于 2009-01-22T16:46:21.613 回答
2

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

于 2009-01-22T20:26:32.980 回答
1

JT 克罗恩

http://jarretttaylor.com/java/jt-cron.html

于 2009-01-22T23:28:06.653 回答
0

CronScheduler解决了时钟漂移问题,ScheduledThreadPoolExecutor当后者用于根据 UTC 时间、Unix 时间或系统时间进行实际调度时,而不是由System.nanoTime.

CronScheduler 还提供scheduleAtRoundTimesInDay处理时区人员和夏令时更改的功能。

Duration syncPeriod = Duration.ofMinutes(1);
CronScheduler cron = CronScheduler.create(syncPeriod);
ZoneId myTZ = ZoneId.systemDefault();
cron.scheduleAtRoundTimesInDay(Duration.ofHours(2), myTZ, runTimeMillis -> {
    // Do the task
});
于 2020-01-29T14:34:21.147 回答