以编程方式设置应用程序属性

时间:2017-10-03 10:51:19

标签: java spring

基本上我的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文件只更新运行时的值。

1 个答案:

答案 0 :(得分:2)

查看ScheduledAnnotationBeanPostProcessor的源代码我的假设似乎是正确的:这不可能轻易完成。

因为在应用程序上下文启动时会对使用@Scheduled注释的方法进行一次处理,所以会解析注释的值,安排任务,之后再也不会触摸/查看注释。这意味着即使您可以更改实际上很难的注释值,春天也不会知道您更改的值。

当然,您可以编写自己的自定义ScheduledAnnotationBeanPostProcessor来处理该问题,但这将是很多工作。其他选项包括How to change Spring's @Scheduled fixedDelay at runtime中写的内容,这仍然需要你做很多工作。没有开箱即用的解决方案。

当然,你可以做的就是让spring经常触发你的方法,并有一些自定义逻辑来确定何时实际做某事。