apache commons configuration2:不为ReloadingFileBasedConfigurationBuilder生成ConfigurationEvent

时间:2016-11-27 00:18:44

标签: dynamic configuration-management apache-commons-config

使用commons configuration2,我希望在基于特定文件的属性发生更改时收到通知。为此,我使用了ReloadingFileBasedConfigurationBuilder,PeriodicReloadingTrigger。

根据文档,构建器应该用作中央组件,并在底层文件更改时通过builder.getConfiguration()重新生成配置。能够在文件更改时获取ConfigurationBuilderEvent.RESET通知并使用该通知可以使用新配置刷新我的配置。

但是,当我尝试为ConfigurationEvent.ANY添加事件侦听器时,因此我收到有关已更改的文件中的实际属性的通知,我不会收到通知。任何帮助表示赞赏。

以下是我的示例程序来演示:

import java.io.File;
import java.util.concurrent.TimeUnit;

import org.apache.commons.configuration2.PropertiesConfiguration;
import org.apache.commons.configuration2.builder.ConfigurationBuilderEvent;
import org.apache.commons.configuration2.builder.EventListenerParameters;
import org.apache.commons.configuration2.builder.ReloadingFileBasedConfigurationBuilder;
import org.apache.commons.configuration2.builder.fluent.Parameters;
import org.apache.commons.configuration2.event.ConfigurationEvent;
import org.apache.commons.configuration2.event.EventListener;
import org.apache.commons.configuration2.reloading.PeriodicReloadingTrigger;

public class ReloadingConfigEventTest {
    public static void main(String[] args) throws Exception {
        Parameters params = new Parameters();
        EventListenerParameters listenerParams = new EventListenerParameters();
        listenerParams.addEventListener(ConfigurationEvent.ANY, new EventListener<ConfigurationEvent>() {
            public void onEvent(ConfigurationEvent event) {
                System.out.println(event.getEventType().getName() +" "+event.getPropertyName());
            }
        }).addEventListener(ConfigurationBuilderEvent.RESET, new EventListener<ConfigurationBuilderEvent>() {
            public void onEvent(ConfigurationBuilderEvent event) {
                System.out.println("Event:" + event.getEventType().getName());
            }
        });

        ReloadingFileBasedConfigurationBuilder<PropertiesConfiguration> builder = new ReloadingFileBasedConfigurationBuilder<PropertiesConfiguration>(
                PropertiesConfiguration.class)
                        .configure(params.fileBased().setFile(new File("src/main/resource/override.conf")), listenerParams);
        PeriodicReloadingTrigger trigger = new PeriodicReloadingTrigger(builder.getReloadingController(), null, 1,
                TimeUnit.SECONDS);
        trigger.start();

        //modify the property file during the infinite loop, the new property is picked, but the SET_PROPERTY notification is missing
        while (true) {
            Thread.sleep(1000);
            System.out.println(builder.getConfiguration().getString("test.property1"));
        }
    }
}

1 个答案:

答案 0 :(得分:1)

不幸的是,我认为这是不可能的,至少对于最新的commons-configuration2库源(2.1.1)。 ReloadingFileBasedConfigurationBuilder仅填充派生自FileBasedConfiguration的配置实例(例如,PropertiesConfiguration),并且FileBasedConfiguration个对象全部由不使用内部方法加载,这会触发事件例如ADD_PROPERTYSET_PROPERTY

我过去一直对此感兴趣,但commons-configuration2并不是这样设置的。