3

С помощью Commons configuration2, я хотел бы получать уведомление, когда изменяется определенное свойство на основе файла. Для этого я использую ReloadingFileBasedConfigurationBuilder, PeriodicReloadingTrigger.Конфигурация apache2: ConfigurationEvent не сгенерирован для ReloadingFileBasedConfigurationBuilder

В соответствии с документацией строитель должен использоваться как центральный компонент и восстанавливать конфигурацию с помощью 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")); 
     } 
    } 
} 

ответ

0

К сожалению, я не считаю, что это возможно, по крайней мере, с последней commons-configuration2 источника библиотеки (2.1.1). ReloadingFileBasedConfigurationBuilder заселяет только экземпляры конфигурации, которые вытекают из FileBasedConfiguration (например, PropertiesConfiguration), и FileBasedConfiguration объектов все, нагруженный без использования внутренних методов, которые будут срабатывать события как ADD_PROPERTY, SET_PROPERTY и т.д.

Я был заинтересован в этом я в прошлом, но commons-configuration2 просто не настроен таким образом.

 Смежные вопросы

  • Нет связанных вопросов^_^