apache commons configuration2:没有为 ReloadingFileBasedConfigurationBuilder 生成 ConfigurationEvent
apache commons configuration2 :ConfigurationEvent is not generated for ReloadingFileBasedConfigurationBuilder
使用公共配置 2,我希望在基于 属性 的特定文件发生更改时收到通知。为此,我正在使用 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"));
}
}
}
不幸的是,我不相信这是可能的,至少对于最新的 commons-configuration2
库源 (2.1.1)。 ReloadingFileBasedConfigurationBuilder
仅填充派生自 FileBasedConfiguration
的配置实例(例如,PropertiesConfiguration
),并且 FileBasedConfiguration
对象全部由不使用会触发事件的内部方法加载像 ADD_PROPERTY
、SET_PROPERTY
等
我自己过去对此很感兴趣,但是 commons-configuration2
并不是这样设置的。
使用公共配置 2,我希望在基于 属性 的特定文件发生更改时收到通知。为此,我正在使用 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"));
}
}
}
不幸的是,我不相信这是可能的,至少对于最新的 commons-configuration2
库源 (2.1.1)。 ReloadingFileBasedConfigurationBuilder
仅填充派生自 FileBasedConfiguration
的配置实例(例如,PropertiesConfiguration
),并且 FileBasedConfiguration
对象全部由不使用会触发事件的内部方法加载像 ADD_PROPERTY
、SET_PROPERTY
等
我自己过去对此很感兴趣,但是 commons-configuration2
并不是这样设置的。