基本上我的application.yml中有一些cron属性:
B = 0 11/15 * * * ?
我有一个具有
的bean RefresherB@Scheduled(cron = "${B}")
public void refresh() {
//Refreshing
}
我还有一个休息端点,我想从中更新这个B属性
@RequestMapping("schedule")
public boolean changeRefreshSchedule(@QueryParam("cron") String expression){
我想更新B属性,以便RefresherB bean也获得更新。我该怎么做呢?我不想更改application.yml文件只更新运行时的值。
答案 0 :(得分:2)
查看ScheduledAnnotationBeanPostProcessor
的源代码我的假设似乎是正确的:这不可能轻易完成。
因为在应用程序上下文启动时会对使用@Scheduled
注释的方法进行一次处理,所以会解析注释的值,安排任务,之后再也不会触摸/查看注释。这意味着即使您可以更改实际上很难的注释值,春天也不会知道您更改的值。
当然,您可以编写自己的自定义ScheduledAnnotationBeanPostProcessor
来处理该问题,但这将是很多工作。其他选项包括How to change Spring's @Scheduled fixedDelay at runtime中写的内容,这仍然需要你做很多工作。没有开箱即用的解决方案。
当然,你可以做的就是让spring经常触发你的方法,并有一些自定义逻辑来确定何时实际做某事。