背景
如果想在运行过程中想基于nacos数据变更做一些业务,比如想在运行过程中变更日志的级别,那么我们可以扩展nacos的监听。
步骤
- 定义一个配置类,用@NacosConfigListener标记需要触发的方法,并用dataId标记需要监听的文件。如下:
@Slf4j
@Configuration
public class LoggingLevelConfig {
/**
* 刷新
*/
@NacosConfigListener(dataId = Constants.CONFIG_FILE_NAME)
public void refresh(String msg) {
}
}
需要注意的是这个方法必须要有一个String类型参数,否则不会生效;这个参数就是变更后的文件;
- 解析变更内容
这里有两个思路- 第一个是自己解析字符串;
- 第二个就是利用nacos自动刷新的机制,定义一个配置属性类,然后从这个类里面获取最新的属性值;这里要注意的是被 @NacosConfigListener标记的方法和nacos自动刷新的先后顺序是不能被保证的;我的思路是,开启一个新线程然后可以Sleep几秒后从配置类中读取最新的值。
所以最终的代码:
@Slf4j
@Configuration
public class DemoLoggingLevelConfig {
@Resource
private SomePropertiesConfig propertiesConfig;
@Resource
private LoggingSystem loggingSystem;
/**
* 通用线程池
*/
@Resource
private ThreadPoolTaskExecutor commonTaskExecutor;
/**
* 动态刷新
*/
@NacosConfigListener(dataId = Constants.XXX)
public void refresh(String msg) {
// 线程池处理多线程
taskExecutor.submit(() -> {
try {
Thread.sleep(4000);
log.info("最新的值:{}", propertiesConfig.getDynamicLogger());
// 通过loggingSystem
} catch (Exception e) {
log.error("异常:{}", e.getLocalizedMessage(), e);
}
});
}
}
over~