Java 仅当属性文件发生更改时加载属性文件

Java 仅当属性文件发生更改时加载属性文件,java,jndi,Java,Jndi,伙计们,我在jboss类路径之外创建了一个属性文件 我一直呆在外面,因为我可以在运行时进行更改,这些值将被反映出来 每次我都像System.getPropertyjboss.base.dir.home一样加载这个属性文件来进行rmi查找。我认为每次加载同一个文件时,即使它没有更改,也会很痛苦 我想要的想法,如何检测在属性文件中的变化,并加载只有当有变化。我想有时间戳的lastmodified。请让我知道你的建议 也许您可以使用命名约定来实现这一点。例如,如果没有更改,则文件将以您现在的名称命名,

伙计们,我在jboss类路径之外创建了一个属性文件

我一直呆在外面,因为我可以在运行时进行更改,这些值将被反映出来

每次我都像System.getPropertyjboss.base.dir.home一样加载这个属性文件来进行rmi查找。我认为每次加载同一个文件时,即使它没有更改,也会很痛苦


我想要的想法,如何检测在属性文件中的变化,并加载只有当有变化。我想有时间戳的lastmodified。请让我知道你的建议

也许您可以使用命名约定来实现这一点。例如,如果没有更改,则文件将以您现在的名称命名,例如:

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

foo.properties-changed

然后,您可以通过编程方式查找'-changed'文件,加载它,然后去掉后缀。

也许您可以使用命名约定来实现这一点。例如,如果没有更改,则文件将以您现在的名称命名,例如:

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

foo.properties-changed

然后,您可以通过编程方式查找'-changed'文件,加载它,然后去掉后缀。

您可以重用Apache commons来读取属性文件:

你可以自己编程。这将重新实现ApacheCommons代码-可能需要更少的测试和更容易出错。如果您坚持这种方法,我认为您可以:

在属性实例上使用包装器类。 初始化该包装类时,应该从预定义位置加载属性文件 包装器post init应该启动一个将永远运行的线程,并执行以下操作: 在file类中记录属性文件最近读取的see方法的修改时间戳 睡眠时间可配置 唤醒并检查属性文件的修改时间戳 如果时间戳不同,请将属性文件重新加载到属性实例中。请记住,这必须单独完成,即在没有人访问对象时更改对象。
HTH

您可以重用Apache commons来读取属性文件:

你可以自己编程。这将重新实现ApacheCommons代码-可能需要更少的测试和更容易出错。如果您坚持这种方法,我认为您可以:

在属性实例上使用包装器类。 初始化该包装类时,应该从预定义位置加载属性文件 包装器post init应该启动一个将永远运行的线程,并执行以下操作: 在file类中记录属性文件最近读取的see方法的修改时间戳 睡眠时间可配置 唤醒并检查属性文件的修改时间戳 如果时间戳不同,请将属性文件重新加载到属性实例中。请记住,这必须单独完成,即在没有人访问对象时更改对象。
HTH

此解决方案的灵感来自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的新文件。

此解决方案的灵感来自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的新文件