Apollo支持ConfigurationProperties自动更新

3,227 阅读1分钟

在项目中使用了Apollo作为配置中心,当修改配置后通过@Value方式获取配置是可以更新的,而使用@ConfigurationProperties方式获取无法更新,必须要重启项目才能完成更新。

一直认为配置中心应该是支持这种方式的实时更新的,然后就去查看Apollo文档,终于在文档中发现了相关的说明,如下:

image.png

从上面的截图可以看出,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));
    }
}

之后再启动项目测试,便可以自动更新配置内容了。