在项目中使用了Apollo作为配置中心,当修改配置后通过@Value方式获取配置是可以更新的,而使用@ConfigurationProperties方式获取无法更新,必须要重启项目才能完成更新。
一直认为配置中心应该是支持这种方式的实时更新的,然后就去查看Apollo文档,终于在文档中发现了相关的说明,如下:
从上面的截图可以看出,Apollo是支持@ConfigurationProperties自动更新配置的值的,但需要增加一些配置。
好了废话不多说了,找到问题的原因后,我们在项目中增加一个ApolloRefreshConfig的配置类,源码如下:
import com.alibaba.fastjson.JSON;
import com.ctrip.framework.apollo.model.ConfigChangeEvent;
import com.ctrip.framework.apollo.spring.annotation.ApolloConfigChangeListener;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeansException;
import org.springframework.cloud.context.environment.EnvironmentChangeEvent;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
import java.util.Set;
/**
* Create By IntelliJ IDEA
*
* @author: XieHua
* @date: 2021-10-14 13:57
*/
@Slf4j
@Component
public class ApolloRefreshConfig implements ApplicationContextAware {
private ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
// 指定需要监测的配置文件
@ApolloConfigChangeListener(value = {"application"})
public void onChange(ConfigChangeEvent changeEvent) {
Set<String> changedKeys = changeEvent.changedKeys();
log.info("Apollo changed keys: {}", JSON.toJSONString(changedKeys));
this.applicationContext.publishEvent(new EnvironmentChangeEvent(changedKeys));
}
}
之后再启动项目测试,便可以自动更新配置内容了。