首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ReloadingCombinedConfigurationBuilder在%1重新加载后未重新加载

ReloadingCombinedConfigurationBuilder在%1重新加载后未重新加载
EN

Stack Overflow用户
提问于 2017-08-11 14:48:57
回答 3查看 785关注 0票数 0

我正在开发一个Spring App,我需要访问保存在文件夹中的所有属性文件。我尝试了ReloadingCombinedConfigurationBuilder方法,但是配置只更新了一次,并且没有出现进一步的文件更改。下面是我使用的代码:

代码语言:javascript
复制
ReloadingCombinedConfigurationBuilder combinedBuilder = new ReloadingCombinedConfigurationBuilder()
                .configure(params.fileBased().setFile(new File("configuration.xml")));

这是我的configuration.xml:

代码语言:javascript
复制
<?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>

然后,我以编程方式添加了一些属性配置。如果我没有以编程方式添加配置,则在设置触发器时,combinedBuilder.getReloadingController()返回null。

代码语言:javascript
复制
Configuration config = builder.getConfiguration();
        combinedBuilder.getConfiguration().addConfiguration(myFileBasedConfigurationBuilderconfig.getConfiguration());

并启动触发器:

代码语言:javascript
复制
PeriodicReloadingTrigger trigger = new PeriodicReloadingTrigger(
                combinedBuilder.getReloadingController(), null, 5, TimeUnit.SECONDS);
        trigger.start();

当我执行它并更改属性文件时,更改只反映一次&然后它停止提供更改的值。

欢迎提出建议。

EN

回答 3

Stack Overflow用户

发布于 2018-09-15 00:09:24

我也面临着同样的问题,直到我发现ReloadingController需要显式重置。这是在commons-configuration javadoc中指定的。

通常是监听器之一,负责执行实际的重新加载操作。(如何做到这一点不在控制器对象的作用域中。)完成此操作后,必须调用控制器的resetReloadingState()方法。它告诉控制器已经处理了最后一个通知,并且可以再次进行新的检查。调用此方法是很重要的。否则,checkForReloading()将不再执行任何新的检查或发送事件通知。

在我看来是这样的:

代码语言:javascript
复制
    builder.getReloadingController().addEventListener(ReloadingEvent.ANY, new EventListener<ReloadingEvent>() {

        @Override
        public void onEvent(ReloadingEvent event) {
            // TODO reload properties
            event.getController().resetReloadingState();
        }
    });
票数 1
EN

Stack Overflow用户

发布于 2017-10-01 02:45:24

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

下面是如何在您的构建器上配置它。

代码语言:javascript
复制
builder.addEventListener(ConfigurationBuilderEvent.CONFIGURATION_REQUEST, new EventListener() {
  @Override
  public void onEvent(Event arg0) {
    builder.getReloadingController().checkForReloading(null);
  }
});

ReloadingRefreshDelay可以设置为构建器参数,也可以像您已经做过的那样在xml中定义它。

票数 0
EN

Stack Overflow用户

发布于 2018-03-07 07:04:20

从2.2版开始,ReloadingCombinedConfigurationBuilder似乎在每次重新加载后都会换出它的ReloadingController。(它是否应该这样做是一个非常好的问题。)原始代码无法工作,因为PeriodicReloadingTrigger正在pinging一个不再连接到构建器的控制器。Prasad的答案是有效的,因为他调用的是builder.getReloadingController().checkForReloading(null),它总是对当前控制器起作用。在Spring中,你应该使用Spring的计时特性,但在纯Java中,你可以这样做:

代码语言:javascript
复制
ScheduledExcecutorService scheduler = Executors.newSingleThreadScheduledExecutor();
scheduler.scheduleAtFixedRate(()->builder.getReloadingController().checkForReloading(null),
           delay, interval, TimeUnit.SECONDS);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45628704

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档