首页 > 解决方案 > 无法在应用程序属性中设置 cron 作业计划。SpringBoot ; 使用调度器在运行时调度 cron 作业

问题描述

我正在尝试使用来安排我的休息服务(使用 GET 方法)

@Scheduled(cron = xyzzy.getTimeSchedule())

计划详细信息预计将在应用程序启动期间从云中的应用程序属性中获取。但是我得到“Annotation 属性 Scheduled.cron 的值必须是一个常量表达式”编译时错误。请建议。还有什么可能是潜在的问题,比如 Spring 注释和在应用程序启动期间可用的属性。请指导或指导我了解.TIA。

标签: spring-bootcronspring-scheduled

解决方案


使用@Scheduled注释,您无法为来自云端的 cron-expression 提供方法。由于 java 注释需要constant-expression,这是一个变量,其值一旦被分配就不能改变。为此,您需要使用final关键字。

public static final String TIME_SCHEDULE = "0 0/30 8-10 * * *";

然后在调度程序方法中使用该常量表达式,

@Scheduled(cron = TIME_SCHEDULE)

在你的情况下,你应该去@TaskScheduler(来自doc)

任务调度器接口,它基于不同类型的触发器抽象了 Runnables 的调度。这个接口与 SchedulingTaskExecutor 是分开的,因为它通常代表不同类型的后端,即具有不同特性和功能的线程池。如果实现可以处理这两种执行特性,则它们可以实现这两种接口。

用@TaskScheduler 替换@Scheduled 注解

首先,自动装配 TaskScheduler 并确保使用@EnableScheduling注释对主类进行注释,以便为 TaskScheduler 提供 bean。

@Autowired 
private TaskScheduler scheduler;

现在您需要安排提供 Runnable 和CronTrigger参数。它调度给定的 Runnable,只要触发器指示下一个执行时间就调用它。

这意味着您需要将您的逻辑(当前这是来自您的 @Schduled 方法主体的代码)包装到 Runnable 实例中。并且您xyzzy.getTimeSchedule()应该提供给 CronTrigger 构造函数。

Runnable runnableTask = () -> {
   //call REST API here
};

scheduler.schedule(runnableTask, new CronTrigger(xyzzy.getTimeSchedule());

现在您摆脱了“Annotation 属性 Scheduled.cron 的值必须是常量表达式”


推荐阅读