Spring 调度程序 - 获取下一个事件的时间

问题描述 投票:0回答:3

我有一个 SpringBoot Scheduler,如下所示:

 @Scheduled(cron = "*/10 * * * * * ")   // Every 10 seconds
    public void scheduleTaskUsingCronExpression() {
        long now = System.currentTimeMillis() / 1000;
        System.out.println("schedule tasks using cron jobs - " + now);
    }

我想获取下一个活动的时间,以便我可以在每个活动结束时将其打印出来。我读过有关使用

CronExpression
的内容,它有一个 next() 方法,但不确定如何获取 CronExpression。或者我是否创建一个 CronExpression 并以某种方式传递它而不是使用
@Scheduled
注释?

spring-boot scheduled-tasks
3个回答
3
投票

我不确定我能否获得准确的间隔时间,但我可以从以下代码中获得大致正确的下一次运行时间。

@Value("${cron.schedule}") String schedule;

@Scheduled(cron = "${cron.schedule}")   // Every 10 seconds
public void scheduleTaskUsingCronExpression() {
    var expression = CronExpression.parse(schedule);
    var result = expression.next(LocalDateTime.now());
    System.out.println("schedule tasks using cron jobs - " + result);
}

1
投票

您可以将 cron 字符串(在

@Scheduled
注释中使用)定义为类的最终字段,然后从中创建
CronExpression
以找出下一个触发日期。

此外,您可以查看 Spring 的

@Scheduled
(来自包
TaskScheduler
),而不是使用
org.springframework.scheduling
注释。它的方法
TaskScheduler#schedule
有两个参数:一个将在后台运行的
Runnable
和一个用于设置 cron 表达式和执行后台任务的时区的
CronTrigger

UPD。重用 cron 的另一种方法是将其设置在

application.properties
中,并在
@Value
@Scheduled
注释中使用,例如
@Scheduled(cron = ${property.from.file})
。在这种情况下,如果需要,您还可以在运行应用程序之前更改 cron 表达式。


0
投票

在 Kaz 的答案之上构建,您还可以在构造函数中打印启动时的第一次执行,或在服务中使用

@PostConstruct

@Service
public class MyService {

    @Value("${cron.schedule}") String schedule;

    @PostConstruct
    public void postConstruct() {
        final var nextExecution = CronExpression.parse(schedule).next(ZonedDateTime.now());
        log.info("Next scheduled job: " + nextExecution);
    }

    @Scheduled(cron = "${cron.schedule}")
    public void runScheduled() {
        // run the actual job
    }
}

我使用了

ZonedDateTime
,所以它还打印了时区:

下次预定工作:2024-04-26T07:50+02:00[欧洲/阿姆斯特丹]

© www.soinside.com 2019 - 2024. All rights reserved.