我正在开发一个Spring App,我需要访问保存在文件夹中的所有属性文件。我尝试了ReloadingCombinedConfigurationBuilder方法,但是配置只更新了一次,并且没有出现进一步的文件更改。下面是我使用的代码:
ReloadingCombinedConfigurationBuilder combinedBuilder = new ReloadingCombinedConfigurationBuilder()
.configure(params.fileBased().setFile(new File("configuration.xml")));这是我的configuration.xml:
<?xml version="1.0" encoding="ISO-8859-1" ?>
<configuration>
<properties fileName="{absolute-path}/a.properties" config-reload="true" reloadingRefreshDelay="10000"/>
<properties fileName="{absolute-path}/b.properties" config-reload="true"/>
</configuration>然后,我以编程方式添加了一些属性配置。如果我没有以编程方式添加配置,则在设置触发器时,combinedBuilder.getReloadingController()返回null。
Configuration config = builder.getConfiguration();
combinedBuilder.getConfiguration().addConfiguration(myFileBasedConfigurationBuilderconfig.getConfiguration());并启动触发器:
PeriodicReloadingTrigger trigger = new PeriodicReloadingTrigger(
combinedBuilder.getReloadingController(), null, 5, TimeUnit.SECONDS);
trigger.start();当我执行它并更改属性文件时,更改只反映一次&然后它停止提供更改的值。
欢迎提出建议。
发布于 2018-09-15 00:09:24
我也面临着同样的问题,直到我发现ReloadingController需要显式重置。这是在commons-configuration javadoc中指定的。
通常是监听器之一,负责执行实际的重新加载操作。(如何做到这一点不在控制器对象的作用域中。)完成此操作后,必须调用控制器的resetReloadingState()方法。它告诉控制器已经处理了最后一个通知,并且可以再次进行新的检查。调用此方法是很重要的。否则,checkForReloading()将不再执行任何新的检查或发送事件通知。
在我看来是这样的:
builder.getReloadingController().addEventListener(ReloadingEvent.ANY, new EventListener<ReloadingEvent>() {
@Override
public void onEvent(ReloadingEvent event) {
// TODO reload properties
event.getController().resetReloadingState();
}
});发布于 2017-10-01 02:45:24
我正面临着确切的问题,但对我有效的不是使用PeriodicReloadingTrigger,而是在配置请求事件上使用刷新延迟来访问配置时重新加载配置。
下面是如何在您的构建器上配置它。
builder.addEventListener(ConfigurationBuilderEvent.CONFIGURATION_REQUEST, new EventListener() {
@Override
public void onEvent(Event arg0) {
builder.getReloadingController().checkForReloading(null);
}
});ReloadingRefreshDelay可以设置为构建器参数,也可以像您已经做过的那样在xml中定义它。
发布于 2018-03-07 07:04:20
从2.2版开始,ReloadingCombinedConfigurationBuilder似乎在每次重新加载后都会换出它的ReloadingController。(它是否应该这样做是一个非常好的问题。)原始代码无法工作,因为PeriodicReloadingTrigger正在pinging一个不再连接到构建器的控制器。Prasad的答案是有效的,因为他调用的是builder.getReloadingController().checkForReloading(null),它总是对当前控制器起作用。在Spring中,你应该使用Spring的计时特性,但在纯Java中,你可以这样做:
ScheduledExcecutorService scheduler = Executors.newSingleThreadScheduledExecutor();
scheduler.scheduleAtFixedRate(()->builder.getReloadingController().checkForReloading(null),
delay, interval, TimeUnit.SECONDS);https://stackoverflow.com/questions/45628704
复制相似问题