背景:是否可以在運行時提供新的PropertiesConfiguration文件?
我有一個顯示給用戶的信息都必須通過語言和公司部門而異的要求。因此,我不能使用開箱即用的資源包,所以我基本上使用PropertiesConfiguration文件編寫了自己的資源包版本。
此外,我有一個要求,消息必須在生產w/o重新啓動時動態修改。
我加載了屬性文件三種不同的迭代:在classpath中存在
-basename_division.properties
-basename_2CharLanguageCode.properties
-basename.properties
這些文件。此代碼將進入標籤庫以供Portal中的多個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重複使用,然後嘗試找到密鑰。 (與常規資源包不同,如果找不到密鑰,則會嘗試查找更一般的文件以查看密鑰是否存在於該文件中 - 以便只有覆蓋異常需要放入語言/分區特定屬性文件)
的問題:
如果文件不存在,第一次被確認,它拋出預期的異常。但是,如果以後某個文件稍後會被放入類路徑中,然後重新運行該代碼,則該異常仍然會被拋出。重新啓動門戶網站顯然會清除問題,但這對我沒有用處 - 我需要允許他們爲語言/ companyDivision覆蓋而不是重新啓動時放置新消息。而且我並不是對所有可能的部門創建空白文件感興趣,因爲有很多部門。
我假設這是一個類加載器的問題,因爲它確定該文件沒有在classpath中存在第一次,並試圖加載相同的文件時導致緩存。我不喜歡做類似classLoader的任何事情。 (我將是唯一能夠理解/維護該代碼的人員)。特定的環境是WebSphere Portal。
任何解決方法或我卡住了嗎?
實際上,'ConfigurationException'是在構造函數中拋出。即使此文件已被刪除,我也永遠不會停止獲取該異常。所以,實現我自己的'FileChangedReloadingStrategy'不會直接幫助。 (在我的情況下,它是Java 6)。 – 2012-03-29 13:58:36
我相信接受例外是有道理的。 'FileChangedReloadingStrategy'用於監視「文件更改」,這意味着您假定該文件已存在;所以它不報告在目錄中丟棄的新文件,因爲它之前不存在。這就是爲什麼我相信你需要一個修改版本,讓我們稱之爲'NewFileReloadingStrategy'來捕獲新文件被刪除的事件。既然你使用的是Java 6,那麼是否給JNotify一個可行的嘗試來接收目錄中新文件的事件呢? – nobeh 2012-03-29 17:50:23
現在更有意義 - 我沒有看到你的意思。我會試着在本週末把它放在一起,看看它是否按預期工作。 – 2012-03-30 14:38:25