项目场景:
Springboot+Nacos 配置中心 动态刷新自定义配置文件
问题描述
通过nacos注入的配置信息,未刷新spring控制BusinessDictConfig
@Slf4j
@RestController
@RequestMapping("/mqtt")
@RefreshScope
public class ConfigController {
@Autowired
private BusinessDictConfig config;
@GetMapping("/config")
public Result testNacosConfig() throws NacosException {
log.info(config.getBusiness().toString());
return Result.OK(config.getBusiness());
}
}
@Configuration @ConfigurationProperties(prefix = "dict") public class BusinessDictConfig { /** * 通过nacos business.yml 配置注入 */ @Getter @Setter private Map<Integer,String> business; }
server:
port: 7011
spring:
config:
import:
- optional:nacos:business.yml
原因分析:
通过日志和源码发现,nacos配置中心修改,触发了nacos监听机制
例如:Handler
发送消息有两种方式,分别是 Handler.obtainMessage()
和 Handler.sendMessage()
,其中 obtainMessage
方式当数据量过大时,由于 MessageQuene
大小也有限,所以当 message
处理不及时时,会造成先传的数据被覆盖,进而导致数据丢失。
解决方案:
@RefreshScope 配置的class不对
@Configuration
@ConfigurationProperties(prefix = "dict")
@RefreshScope
public class BusinessDictConfig {
/**
* 通过nacos business.yml 配置注入
*/
@Getter
@Setter
private Map<Integer,String> business;
}
需要在刷新的bean上配置@RefreshScope