JAVA多次读取属性文件以进行属性更改

JAVA多次读取属性文件以进行属性更改,java,mule,Java,Mule,我需要从给定位置读取属性文件。触发器是一个石英作业,并且处于长时间运行的过程中 在这种情况下: 假设作业每10分钟触发一次 1:00AM trigger1 -> read config.properties -> other logic 1:10AM trigger2 -> read config.properties -> other logic 我们的要求之一是,我们需要能够在触发器1和触发器2之间更改config.properties中的值,以确保2使用的配置

我需要从给定位置读取属性文件。触发器是一个石英作业,并且处于长时间运行的过程中

在这种情况下: 假设作业每10分钟触发一次

1:00AM trigger1  -> read config.properties -> other logic

1:10AM trigger2 -> read config.properties -> other logic
我们的要求之一是,我们需要能够在触发器1和触发器2之间更改config.properties中的值,以确保2使用的配置与1不同


我在java Properties类和apache commons配置libs中尝试了这一点,发现一旦从第一次触发作业时读取属性文件,下面读取的所有属性文件都不会选择该文件中以后的更改。这是因为java库的设计,还是我的测试方式不对?

第一个答案:这样做应该不会有任何问题。您所需要做的就是在应用程序中提供“挂钩”,驱动应用程序重新打开属性文件;重新读取内容,然后更新应用程序所依赖的属性对象。从概念上讲,没有什么可以阻止这一点——我在过去编写过这样的解决方案

但是,再想一想:从长远来看,我怀疑这是否是一种稳健的设计。你看,当我让我的属性“可重新加载”时,那只是为了测试目的。例如,我希望能够快速更改超时值;无需重新启动整个堆栈

你想在这里做的是完全不同的。您想要“劫持”一种机制,而这种机制从来都不打算用于此类用例,以启用定期、异步更新。我最初的直觉是:不要那样做。如果在写入文件时更新属性,会发生什么情况?如果更新时间很短,会发生什么


如果您希望外部源影响应用程序的行为,那么可以为该需求设计一个健壮的解决方案。不要以为您必须重写属性文件,因为属性文件是当前控制应用程序的文件。

不确定您是如何引用该文件的,但我可以在这里说的一件事是使用协议获取config.properties,即classpath:vs file:

如果您将文件读取为
classpath:config.properties
,那么我认为它将始终获得加载classpath时存在的属性文件的第一个版本

尝试使用文件协议-
file://var/mule/config.properties
,在这种情况下,它将始终是从文件系统的新读取


可能有您的代码供我们查看。

您可以发布一些代码吗?可能需要一些示例代码。我想应该避免使用
ResourceBundle.clearCache()
。例子。然而,这可能是另外一回事。修改时间不易波动,且未检测到任何变化或其他情况。