仅在更改时加载属性文件

时间:2010-11-12 07:25:09

标签: java jndi

我已经在jboss类路径

之外创建了一个属性文件

(我留在外面,因为我可以在运行时更改,并且会反映这些值。)

我每次都要加载这个属性文件(比如System.getProperty("jboss.base.dir.home"))来进行rmi查找。我认为每次加载同一个文件,尽管没有改变,但是很痛苦。

我想要想法,如何检测属性文件中的更改并仅在有更改时加载。我想到了lastmodified的时间戳。请让我知道你的建议。

3 个答案:

答案 0 :(得分:4)

您可以重用Apache commons来读取属性文件: http://commons.apache.org/configuration/userguide/howto_filebased.html#Automatic_Reloading

OR

你可以自己编程。这将重新实现apache commons代码 - 可能测试更少,更容易出错。如果你坚持这种方法,我认为你可以这样做:

  1. Properties实例上使用包装类。
  2. 此包装类应该(在初始化时)从预定义位置加载属性文件(可能是可配置的)
  3. init之后的包装器应该启动一个永远运行的线程并执行此操作:
    • 记录最近读取的属性文件的修改时间戳(请参阅File类中的方法)
    • 睡眠可配置的时间段
    • 唤醒并检查属性文件的修改时间戳
    • 如果时间戳有差异 - 将属性文件重新加载到Properties实例中。请记住,这必须是孤立地完成的(即,当没有人访问它时更改对象)。
  4. HTH

答案 1 :(得分:1)

也许您可以使用命名约定来完成此操作。例如,如果没有更改,则会命名文件(无论您现在为何命名),例如:

foo.properties

但是,另一方面,如果你想改变它,你可以命名为:

foo.properties-changed

然后,您可以以编程方式查找“-changed”文件,加载它,然后删除后缀。

答案 2 :(得分:0)

这个解决方案的灵感来自于javamonkey79的答案以及JBoss EAP 6.1.0中热部署的处理方式。每当我更改它时,我都不是重命名foo.properties文件,而是在同一目录中创建了一个额外的foo.updated文件。每当我更改foo.properties文件中的设置时,我都会将foo.updated重命名为foo.doUpdate。

在启动时从foo.properties文件加载设置的单例bean中,在我尝试从bean获取某个值之前,我首先检查配置目录中是否有foo.doUpdate文件。如果是这样,我从foo.properties文件中读取设置,然后删除foo.doUpdate并创建一个名为foo.updated的新文件。