我正在开发一个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>
然后我以编程方式添加一些属性Configuration。如果我没有以编程方式添加配置,那么在设置触发器时,combineBuilder.getReloadingController()会返回null。
Configuration config = builder.getConfiguration();
combinedBuilder.getConfiguration().addConfiguration(myFileBasedConfigurationBuilderconfig.getConfiguration());
然后开始触发:
PeriodicReloadingTrigger trigger = new PeriodicReloadingTrigger(
combinedBuilder.getReloadingController(), null, 5, TimeUnit.SECONDS);
trigger.start();
当我执行它并更改属性文件时,更改会反映一次&amp;然后它停止提供更改的值。
欢迎提出建议。
答案 0 :(得分:1)
我遇到了同样的问题,直到我发现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();
}
});
答案 1 :(得分:0)
我遇到了确切的问题,但是对我有用的不是使用PeriodicReloadingTrigger,而是在具有刷新延迟的配置请求事件中访问配置时重新加载配置。
以下是如何在构建器上配置它。
builder.addEventListener(ConfigurationBuilderEvent.CONFIGURATION_REQUEST, new EventListener() {
@Override
public void onEvent(Event arg0) {
builder.getReloadingController().checkForReloading(null);
}
});
ReloadingRefreshDelay既可以设置为构建器参数,也可以像在xml中一样在xml中定义。
答案 2 :(得分:0)
从版本2.2开始,ReloadingCombinedConfigurationBuilder似乎在每次重新加载后交换其ReloadingController。 (是否这样做是一个非常好的问题。)原始代码不起作用,因为PeriodicReloadingTrigger正在ping一个不再附加到构建器的控制器。
Prasad的回答是有效的,因为他正在调用'a'
,它总是对当前控制器起作用。
在Spring中你应该使用Spring的计时功能,但是纯Java你可以做类似的事情:
builder.getReloadingController().checkForReloading(null)