天天看点

java搭建Apollo的热部署问题总结

@ConfigurationProperties和@Component搭配使用后,可以让配置类

遇到一个新问题注解@ConfigurationProperties应用在类上时不能实现动态刷新,经过查阅相关资料后,总结了两个方法。@ApolloConfigChangeListener主要用来自动注册ConfigChangeListener

(1)通过RefreshScope实现刷新

配置类加上RefreshScope注解

@Component
@ConfigurationProperties(prefix = "order")
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@RefreshScope
public class OrderProperties {

    private Integer payTimeSeconds;

    private Integer createFrequencySeconds;

    private Integer timeOut;

    @Override
    public String toString() {
        return "OrderProperties{" +
                "payTimeSeconds=" + payTimeSeconds +
                ", createFrequencySeconds=" + createFrequencySeconds +
                ", timeOut=" + timeOut +
                '}';
    }
}
           
@RestController
public class ApolloController3 {

    @Autowired
    private OrderProperties orderProperties;

    @Autowired
    private RefreshScope refreshScope;

    @RequestMapping("demo3")
    public String testDemo3(){
        return orderProperties.toString();
    }

    @ApolloConfigChangeListener(value = "application",interestedKeyPrefixes = "order.")//监听的是namespace
    public void refresh(ConfigChangeEvent configChangeEvent){
    //refreshScope.refresh(name)这个name为加了@ConfigurationProperties注解的Bean name
        refreshScope.refresh("orderProperties");
        Set<String> keySet = configChangeEvent.changedKeys();
        for (String key:keySet) {
            System.out.println("key的值为:"+key+",对应的值为:"+configChangeEvent.getChange(key));
        }
        System.out.println(orderProperties.toString());
    }
}
           

(2)通过Spring的事件驱动基于EnvironmentChangeEvent实现刷新

OrderProperties配置类可以去掉@RefreshScope注解

@Component
public class OrderPropertyRefresh implements ApplicationContextAware {

    @Autowired
    private OrderProperties orderProperties;

    @Autowired
    private ApplicationContext applicationContext;


    @ApolloConfigChangeListener(interestedKeyPrefixes = "order.")
    public void refresh(ConfigChangeEvent changeEvent){
        this.applicationContext.publishEvent(new EnvironmentChangeEvent(changeEvent.changedKeys()));
        System.out.println(orderProperties.toString());
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
    }
}