Dynamic apache commons configuration2:未为重新加载FileBasedConfiguration Builder生成ConfigurationEvent

Dynamic apache commons configuration2:未为重新加载FileBasedConfiguration Builder生成ConfigurationEvent,dynamic,configuration-management,apache-commons-config,Dynamic,Configuration Management,Apache Commons Config,使用commons configuration2,我希望在特定的基于文件的属性发生更改时收到通知。为此,我使用重新加载基于文件的配置生成器PeriodicReloadingTrigger 根据文档,构建器应该用作中心组件,并在基础文件更改时通过builder.getConfiguration()重新生成配置。我能够在文件更改时获得ConfigurationBuilderEvent.RESET通知,并使用该通知使用新配置刷新我的配置 但是,当我尝试为ConfigurationEvent.ANY添加

使用commons configuration2,我希望在特定的基于文件的属性发生更改时收到通知。为此,我使用重新加载基于文件的配置生成器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"));
        }
    }
}
导入java.io.File;
导入java.util.concurrent.TimeUnit;
导入org.apache.commons.configuration2.PropertiesConfiguration;
导入org.apache.commons.configuration2.builder.ConfigurationBuilderEvent;
导入org.apache.commons.configuration2.builder.EventListenerParameters;
导入org.apache.commons.configuration2.builder.reloadingFileBasedConfiguration builder;
导入org.apache.commons.configuration2.builder.fluent.Parameters;
导入org.apache.commons.configuration2.event.ConfigurationEvent;
导入org.apache.commons.configuration2.event.EventListener;
导入org.apache.commons.configuration2.reloading.PeriodicReloadingTrigger;
公共类重新加载ConfigEventTest{
公共静态void main(字符串[]args)引发异常{
Parameters params=新参数();
EventListenerParameters listenerParams=新的EventListenerParameters();
listenerParams.addEventListener(ConfigurationEvent.ANY,new EventListener()){
public void onEvent(配置事件){
System.out.println(event.getEventType().getName()+“”+event.getPropertyName());
}
}).addEventListener(ConfigurationBuilderEvent.RESET,new EventListener()){
public void OneEvent(配置BuilderEvent事件){
System.out.println(“事件:+Event.getEventType().getName());
}
});
重新加载FileBasedConfiguration builder=新的重新加载FileBasedConfiguration builder(
PropertiesConfiguration.class)
.configure(params.fileBased().setFile(新文件(“src/main/resource/override.conf”)),listenerParams;
PeriodicReloadingTrigger触发器=新的PeriodicReloadingTrigger(builder.getReloadingController(),null,1,
时间单位(秒);
trigger.start();
//在无限循环期间修改属性文件,将拾取新属性,但缺少SET_属性通知
while(true){
睡眠(1000);
System.out.println(builder.getConfiguration().getString(“test.property1”);
}
}
}

不幸的是,我认为这是不可能的,至少在最新的
commons-configuration2
库源代码(2.1.1)中是不可能的。
重新加载filebasedconfigurationbuilder
仅填充从
FileBasedConfiguration
派生的配置实例(例如,
属性配置
),和
FileBasedConfiguration
对象均由加载,而不使用内部方法,这些方法将触发事件,如
ADD\u PROPERTY
SET\u PROPERTY
,等等

我自己过去也对这个很感兴趣,但是
commons-configuration2
并不是这样设置的