2

バックグラウンド:

ユーザーに表示されるメッセージは、言語と会社の部門の両方で異なる必要があるという要件があります。したがって、すぐに使用できるリソース バンドルを使用することはできないため、基本的には、PropertiesConfiguration ファイルを使用して独自のバージョンのリソース バンドルを作成しています。

さらに、再起動を行わずに、本番環境でメッセージを動的に変更できる必要があるという要件があります。

プロパティ ファイルの 3 つの異なる繰り返しを読み込んでいます。

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

これらのファイルはクラスパスに存在します。このコードは、Portal 内の複数のポートレットで使用されるタグ ライブラリに入れられます。

可能な .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 を再利用できるようにハッシュマップに保存し、キーを見つけようとします。(通常のリソース バンドルとは異なり、キーが見つからない場合は、より一般的なファイルを見つけて、そのファイルにキーが存在するかどうかを確認しようとします。そのため、オーバーライド例外のみを言語/部門固有のプロパティに入れる必要があります。ファイル。)

問題:

最初にチェックされたときにファイルが存在しなかった場合、予想される例外がスローされます。ただし、後でファイルがクラスパスにドロップされ、このコードが再実行された場合でも、例外はスローされます。ポータルを再起動すると明らかに問題は解消されますが、それは私にとっては役に立ちません。言語/会社部門のオーバーライドのために、再起動なしで新しいメッセージをドロップできるようにする必要があります。また、かなりの数の部門があるため、考えられるすべての部門に対して空のファイルを作成することにあまり興味がありません。

これは classLoader の問題であると想定しています。最初はファイルがクラスパスに存在しなかったと判断し、同じファイルをリロードしようとしたときにその結果がキャッシュされます。私はclassLoaderであまりにも派手なことをすることに興味はありません。(そのコードを理解/保守できるのは私だけです。) 特定の環境は WebSphere Portal です。

これを回避する方法はありますか?

4

1 に答える 1

1

私の推測では、Apacheもファイル システム ディレクトリFileChangedReloadingStrategyのイベントを報告するかどうかはわかりません。ENTRY_CREATE

Java 7 を使用している場合は、次のことを試してみることをお勧めします。簡単に言えば、ReloadingStrategyJava 7 を使用して new を実装します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 に答える