我正在尝试使用
安排我的休息服务(使用GET方法) @Scheduled(cron = xyzzy.getTimeSchedule())
在应用程序启动期间,预计将从云的应用程序属性中获取计划详细信息。但是,我收到“注释属性Scheduled.cron的值必须为常量表达式”的编译时错误。请提出建议。还有什么潜在的问题,例如Spring注释和应用程序启动时可用的属性。请指导或指导我了解TIA。
答案 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}")