重新加载后,重新加载僵尸配置构建器不会重新加载

时间:2017-08-11 06:48:57

标签: java spring apache-commons-config

我正在开发一个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;然后它停止提供更改的值。

欢迎提出建议。

3 个答案:

答案 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)