我有一个 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
注释?
我不确定我能否获得准确的间隔时间,但我可以从以下代码中获得大致正确的下一次运行时间。
@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);
}
您可以将 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 表达式。
在 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[欧洲/阿姆斯特丹]