Java 重新加载CombinedConfigurationBuilder在1次重新加载后不重新加载

Java 重新加载CombinedConfigurationBuilder在1次重新加载后不重新加载,java,spring,apache-commons-config,Java,Spring,Apache Commons Config,我正在开发一个Spring应用程序,需要访问文件夹中的所有属性文件。我尝试了这种方法,但是配置只更新了一次,然后没有出现进一步的文件更改。以下是我正在使用的代码: ReloadingCombinedConfigurationBuilder combinedBuilder = new ReloadingCombinedConfigurationBuilder() .configure(params.fileBased().setFile(new File("conf

我正在开发一个Spring应用程序,需要访问文件夹中的所有属性文件。我尝试了这种方法,但是配置只更新了一次,然后没有出现进一步的文件更改。以下是我正在使用的代码:

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>
然后启动触发器:

PeriodicReloadingTrigger trigger = new PeriodicReloadingTrigger(
                combinedBuilder.getReloadingController(), null, 5, TimeUnit.SECONDS);
        trigger.start();
当我执行它并更改属性文件时,更改会反映一次&然后它停止提供更改的值


欢迎您提出建议。

我遇到了确切的问题,但对我有效的不是使用PeriodicReloadingTrigger,而是在配置请求事件中以刷新延迟访问配置时重新加载配置

下面是如何在构建器上配置此选项

builder.addEventListener(ConfigurationBuilderEvent.CONFIGURATION_REQUEST, new EventListener() {
  @Override
  public void onEvent(Event arg0) {
    builder.getReloadingController().checkForReloading(null);
  }
});

ReloadingRefreshDelay可以设置为生成器参数,也可以像您已经做的那样在xml中定义它。

从2.2版开始,ReloadingCombinedConfigurationBuilder在每次重新加载后都会调出其ReloadingController。(它是否应该这样做是一个很好的问题。)原始代码不起作用,因为PeriodicReloadingTrigger正在ping一个不再连接到构建器的控制器。 Prasad的答案之所以有效,是因为他正在调用
builder.getReloadingController().checkForReloading(null)
,它始终对当前控制器有效。 在Spring中,您应该使用Spring的计时功能,但纯Java可以执行以下操作:

ScheduledExcecutorService scheduler = Executors.newSingleThreadScheduledExecutor();
scheduler.scheduleAtFixedRate(()->builder.getReloadingController().checkForReloading(null),
           delay, interval, TimeUnit.SECONDS);

我也面临同样的问题,直到我发现重载控制器需要显式重置。这是在中指定的

通常,一个侦听器负责执行实际的重新加载操作。(如何完成此操作不在控制器对象的范围内。)完成此操作后,必须调用控制器的resetReloadingState()方法。它告诉控制器上一次通知已经处理,可以再次进行新的检查。调用此方法非常重要。否则,checkForReloading()将不再执行任何新检查或发送事件通知

这就是我这边的情况:

    builder.getReloadingController().addEventListener(ReloadingEvent.ANY, new EventListener<ReloadingEvent>() {

        @Override
        public void onEvent(ReloadingEvent event) {
            // TODO reload properties
            event.getController().resetReloadingState();
        }
    });
builder.getReloadingController().addEventListener(ReloadingEvent.ANY,new EventListener()){
@凌驾
public void onEvent(重新加载事件){
//TODO重新加载属性
event.getController().resetReloadingState();
}
});
    builder.getReloadingController().addEventListener(ReloadingEvent.ANY, new EventListener<ReloadingEvent>() {

        @Override
        public void onEvent(ReloadingEvent event) {
            // TODO reload properties
            event.getController().resetReloadingState();
        }
    });