无法在应用程序属性中设置cron作业计划。 SpringBoot;使用Scheduler在运行时计划cron作业

时间:2019-12-22 14:03:02

标签: spring-boot cron spring-scheduled

我正在尝试使用

安排我的休息服务(使用GET方法)

@Scheduled(cron = xyzzy.getTimeSchedule())

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

3 个答案:

答案 0 :(得分:2)

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

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

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

@Scheduled(cron = TIME_SCHEDULE)

就您而言,您应该申请@TaskScheduler(来自文档)

  

任务计划程序接口,该接口根据不同类型的触发器抽象出Runnable的计划。   该接口与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());
  

现在您摆脱“注释属性Scheduled.cron的值必须是一个常量表达式”

答案 1 :(得分:1)

最后,这对我有用。 我将自己的属性存储为key:云上的值对。就像这样。

xyz.Schedule = */5 * * * * ;

public Class testController {

@Autowired private Type type;

@Scheduled(cron = "${type.getSchedule()}") @GetMapping(path = "/", produces = "application/json") public void getmethod() { blah blah } }

我成功运行了我的应用程序,并且能够在应用程序启动时填充通过云配置的属性,并且也能够获得针对我的api的响应。

我尝试过的事情: 正如Shekhar Rai在此讨论链中所建议的那样,将其声明为最终变量,但无法在我的方法中访问它。

试图将方法包装为可运行的任务,无法这样做。

到达:@ Scheduled.cron总是期望使用常量参数(如字符串),但是get()是动态的,因此将其包装为常量参数。

答案 2 :(得分:0)

@ManagedConfiguration
private ConfigClass configClass;
    
@bean
public String getSchedulerValue() {
return configClass.getSchedule();}

@Scheduled(cron="#{getSchedulerValue}")