2017-08-11 28 views
0

我正在研究一个Spring应用程序,我需要访问保存在文件夹内的所有属性文件。我尝试了ReloadingCombinedConfigurationBuilder的方法,但配置只更新一次,然后进一步的文件更改不会出现。这里是我使用的代码:ReloadingCombinedConfigurationBuilder 1重装后不能重装

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> 

然后我补充几个属性配置编程。如果我没有以编程方式添加配置组合Builder.getReloadingController()在设置触发器时返回null。

Configuration config = builder.getConfiguration(); 
     combinedBuilder.getConfiguration().addConfiguration(myFileBasedConfigurationBuilderconfig.getConfiguration()); 

,并启动触发:当我执行它,并更改属性

PeriodicReloadingTrigger trigger = new PeriodicReloadingTrigger(
       combinedBuilder.getReloadingController(), null, 5, TimeUnit.SECONDS); 
     trigger.start(); 

文件的变化是反映一次&则停止提供更改的值。

建议欢迎。

回答

0

我正面临着确切的问题,但是对我而言有效的不是使用PeriodicReloadingTrigger,而是在刷新延迟的配置请求事件上访问配置时重新加载配置。

以下是您可以如何在您的构建器上进行配置。

builder.addEventListener(ConfigurationBuilderEvent.CONFIGURATION_REQUEST, new EventListener() { 
    @Override 
    public void onEvent(Event arg0) { 
    builder.getReloadingController().checkForReloading(null); 
    } 
}); 

ReloadingRefreshDelay可以设置为构建器params中,它可以在XML中定义就像你已经做到了。

0

从版本2.2开始,ReloadingCombinedConfigurationBuilder似乎在每次重新加载后都会调出其ReloadingController。 (是否它应该这样做是一个非常好的问题。)原始代码不起作用,因为PeriodicReloadingTrigger正在ping一个不再连接到构建器的控制器。 Prasad的答案是有效的,因为他打电话给builder.getReloadingController().checkForReloading(null),这总是对当前的控制器有效。 在Spring中,您应该使用Spring的计时功能,但纯Java可以执行下列操作:

ScheduledExcecutorService scheduler = Executors.newSingleThreadScheduledExecutor(); 
scheduler.scheduleAtFixedRate(()->builder.getReloadingController().checkForReloading(null), 
      delay, interval, TimeUnit.SECONDS);