背景
如果想在运行过程中想基于nacos数据变更做一些业务,比如想在运行过程中变更日志的级别,那么我们可以扩展nacos的监听。
步骤
- 定义一个配置类,用@NacosConfigListener标记需要触发的方法,并用dataId标记需要监听的文件。如下:
/*** 日志级别 nacos动态调整*/
@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 {@Resourceprivate SomePropertiesConfig propertiesConfig;/*** LoggingSystem*/@Resourceprivate LoggingSystem loggingSystem;/*** 通用线程池*/@Resource(name = "commonTaskExecutor")private ThreadPoolTaskExecutor commonTaskExecutor;/*** 动态刷新*/@NacosConfigListener(dataId = Constants.FILE_NAME)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~