如何解决Spring Cloud Configuration Client不刷新属性
我有一个配置服务器,并且一个Spring Boot 2.3.1应用程序连接到服务器,以加载适当配置文件的配置属性。
配置服务器使用git来获取每个应用程序和配置文件的配置文件。
这正常工作,当Spring Boot应用程序启动时,它会从配置服务器加载属性的正确值。
当我更新配置文件中的值并将其推送到git,然后在Spring Boot应用程序的Post
至/actuator/refresh
端点上执行操作时,我看到返回了带有属性名称的json我更新了我所期望的。
问题在于,此后实际上并未更新属性。它们仍然具有旧的价值。
例如:
@Service
//@RefreshScope
public class WhitelistService {
private static final Logger log = LoggerFactory.getLogger(WhitelistService.class);
private final WhitelistRepository whitelistRepository;
private final Boolean isWhitelistEnabled;
private final Integer identifier;
@Autowired
public WhitelistService(WhitelistRepository whitelistRepository,@Value("${app.whitelist.isEnabled:true}") Boolean isWhitelistEnabled,@Value("${app.whitelist.identifier:-1}") Integer identifier) {
super();
this.whitelistRepository = whitelistRepository;
this.isWhitelistEnabled = isWhitelistEnabled;
this.identifier = identifier;
}
public boolean processBasedOnWhitelist(Long id) {
if (!isWhitelistEnabled)
return true;
else if (identifier <= -1)
return isInWhitelist(id);
else
return isInWhitelistWithIdentifier(id,identifier);
}
}
如果如上所述@RefreshScope
被注释掉了,我在适当的属性文件中更新了app.whitelist.isEnabled
,并将其推送到配置文件并执行了actuator/refresh
,那么{{1} }保留旧值。
即使我对值字段使用app.whitelist.isEnabled
还是在声明期间仅用setter
注释字段本身,这都是正确的。
如果启用@Value
,该值将按预期更新。
但是,上一次我在另一个项目中使用Configuration Server和Spring Boot作为客户端时,情况并非如此(除非在Spring Boot 2.3.1中进行了更改)。它过去经常立即进行更新,而无需使用@RefreshScope
。
我错过了什么吗?我想避免向每个具有属性值引用的Bean添加另一个注释。没什么大不了的,但是似乎没有必要并且容易出错。
解决方法
在Spring Cloud Bus文档中:https://cloud.spring.io/spring-cloud-static/spring-cloud-bus/2.1.0.RELEASE/single/spring-cloud-bus.html#_bus_refresh_endpoint
/ actuator / bus-refresh端点清除RefreshScope缓存并重新绑定@ConfigurationProperties。有关更多信息,请参见刷新作用域文档。
因此,您可以使用@RefreshScope注释您的bean,或者使用@ConfigurationProperties注释。由于您的bean没有使用@ConfigurationProperties进行注释,因此必须使用@RefreshScope注释才能刷新它。
可能在您的其他项目中,您的bean将使用@ConfigurationProperties注释
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。