2

背景:

我要求向用户显示的消息必须因语言和公司部门而异。因此,我不能使用开箱即用的资源包,所以我实际上是在使用 PropertiesConfiguration 文件编写我自己的资源包版本。

此外,我要求消息必须在生产中动态修改,而无需重新启动。

我正在加载三个不同的属性文件迭代:

-basename_division.properties
-basename_2CharLanguageCode.properties
-basename.properties

这些文件存在于类路径中。此代码将进入一个标记库,供门户中的多个 portlet 使用。

我构建了可能的 .properties 文件,然后尝试通过以下方式加载每个文件:

PropertiesConfiguration configurationProperties;
try {
    configurationProperties = new PropertiesConfiguration(propertyFileName);
    configurationProperties.setReloadingStrategy(new FileChangedReloadingStrategy());
} catch (ConfigurationException e) {
    /* This is ok -- it just means that the specific configuration file doesn't 
       exist right now, which will often be true. */
    return(null);
}

如果它确实成功地找到了一个文件,它会将创建的 PropertiesConfiguration 保存到一个 hashmap 中以供重复使用,然后尝试找到 key。(与常规资源包不同,如果找不到密钥,它会尝试查找更通用的文件以查看该文件中是否存在该密钥 - 因此只需将覆盖异常放入语言/部门特定属性中文件。)

问题:

如果文件在第一次检查时不存在,则会引发预期的异常。但是,如果稍后将文件放入类路径中,然后重新运行此代码,则仍会引发异常。重新启动门户显然可以解决问题,但这对我没有用 - 我需要能够允许他们将新消息放置在适当的位置,以便在没有重新启动的情况下覆盖 language/companyDivision。而且我对为所有可能的部门创建空白文件并不感兴趣,因为有很多部门。

我假设这是一个类加载器问题,因为它第一次确定类路径中不存在该文件,并在尝试重新加载同一文件时缓存该结果。我对使用类加载器做任何太花哨的事情不感兴趣。(我将是唯一能够理解/维护该代码的人。)具体的环境是 WebSphere Portal。

有什么办法可以解决这个问题还是我被卡住了?

4

1 回答 1

1

我的猜测是,我不确定 Apache 是否FileChangedReloadingStrategy也报告ENTRY_CREATE了文件系统目录上的事件。

如果您使用的是 Java 7,我建议尝试以下方法。ReloadingStrategy简单地说,使用 Java 7实现一个新的WatchService。这样,每当您的目标目录中的文件发生更改或新的属性文件被放置在那里时,您就可poll以为事件添加属性到您的应用程序。

如果不在 Java 7 上,也许使用JNotify之类的库将是获取目录中新条目事件的更好解决方案。但同样,您需要实施ReloadingStrategy.

Java 6 的更新

PropertiesConfiguration configurationProperties;
try {
    configurationProperties = new PropertiesConfiguration(propertyFileName);
    configurationProperties.setReloadingStrategy(new FileChangedReloadingStrategy());
} catch (ConfigurationException e) {
    JNotify.addWatch(propertyFileDirectory, JNotify.FILE_CREATED, false, new FileCreatedListener());
}

在哪里

class FileCreatedListener implements JNotifyListener {
  // other methods

  public void fileCreated(int watchId, String rootPath, String fileName) {
    configurationProperties = new PropertiesConfiguration(rootPath + "/" + fileName);
    configurationProperties.setReloadingStrategy(new FileChangedReloadingStrategy());
    // or any other business with configurationProperties
  }

}
于 2012-03-29T07:47:49.843 回答