2012-03-29 42 views
2

背景:是否可以在運行時提供新的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。

任何解決方法或我卡住了嗎?

回答

1

我的猜測是,我不確定Apache的FileChangedReloadingStrategy是否也在文件系統目錄上報告ENTRY_CREATE的事件。

如果您使用Java 7,我建議嘗試以下操作。簡單地說,使用Java 7 WatchService實現新的ReloadingStrategy。通過這種方式,每次在目標目錄中更改文件或在其中放置新的屬性文件時,您都可以爲該事件poll並能夠將屬性添加到您的應用程序。

如果不是Java 7的,也許使用庫如JNotify會是一個更好的解決方案來獲得目錄中的一個新條目事件。但是,您需要實施ReloadingStrategy

UPDATE的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 
    } 

} 
+0

實際上,'ConfigurationException'是在構造函數中拋出。即使此文件已被刪除,我也永遠不會停止獲取該異常。所以,實現我自己的'FileChangedReloadingStrategy'不會直接幫助。 (在我的情況下,它是Java 6)。 – 2012-03-29 13:58:36

+0

我相信接受例外是有道理的。 'FileChangedReloadingStrategy'用於監視「文件更改」,這意味着您假定該文件已存在;所以它不報告在目錄中丟棄的新文件,因爲它之前不存在。這就是爲什麼我相信你需要一個修改版本,讓我們稱之爲'NewFileReloadingStrategy'來捕獲新文件被刪除的事件。既然你使用的是Java 6,那麼是否給JNotify一個可行的嘗試來接收目錄中新文件的事件呢? – nobeh 2012-03-29 17:50:23

+0

現在更有意義 - 我沒有看到你的意思。我會試着在本週末把它放在一起,看看它是否按預期工作。 – 2012-03-30 14:38:25

相關問題