【问题标题】:ReloadingCombinedConfigurationBuilder not reloading after 1 reloadReloadingCombinedConfigurationBuilder 1 次重新加载后未重新加载
【发布时间】:2017-08-11 06:48:57
【问题描述】:

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

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>

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

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

并启动触发器:

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

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

欢迎提出建议。

【问题讨论】:

    标签: java spring apache-commons-config


    【解决方案1】:

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

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

    这就是我这边的样子:

        builder.getReloadingController().addEventListener(ReloadingEvent.ANY, new EventListener<ReloadingEvent>() {
    
            @Override
            public void onEvent(ReloadingEvent event) {
                // TODO reload properties
                event.getController().resetReloadingState();
            }
        });
    

    【讨论】:

      【解决方案2】:

      我遇到了确切的问题,但对我有用的不是使用 PeriodicReloadingTrigger,而是在使用刷新延迟的配置请求事件访问配置时重新加载配置。

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

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

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

      【讨论】:

        【解决方案3】:

        从 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);
        

        【讨论】:

          猜你喜欢
          • 2012-08-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-02-24
          • 2012-04-14
          • 1970-01-01
          • 2013-06-03
          相关资源
          最近更新 更多