這實際上取決於您希望重新加載屬性的頻率。我採取的一種方法是有一個屬性文件包裝器(單件),它具有一個可配置參數,用於定義文件應該重新加載的頻率。然後我總是通過該包裝器讀取屬性,並且它會在15分鐘內重新加載屬性(類似於Log4J的ConfigureAndWatch)。這樣,如果我想,我可以在不更改已部署應用程序的狀態的情況下更改屬性。
這也允許您從數據庫而不是文件加載屬性。通過這種方式,您可以確信集羣中各個節點的屬性是一致的,並且可以降低與管理每個節點的配置文件相關的複雜性。
我更喜歡將它綁定到生命週期事件。如果你沒有曾經打算改變他們,然後讓他們靜態常量的地方:)
下面是一個例子實施給你一個想法:
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.*;
/**
* User: jeffrey.a.west
* Date: Jul 1, 2011
* Time: 8:43:55 AM
*/
public class ReloadingProperties
{
private final String lockObject = "LockMe";
private long lastLoadTime = 0;
private long reloadInterval;
private String filePath;
private Properties properties;
private static final Map<String, ReloadingProperties> instanceMap;
private static final long DEFAULT_RELOAD_INTERVAL = 1000 * 60 * 5;
public static void main(String[] args)
{
ReloadingProperties props = ReloadingProperties.getInstance("myProperties.properties");
System.out.println(props.getProperty("example"));
try
{
Thread.sleep(6000);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
System.out.println(props.getProperty("example"));
}
static
{
instanceMap = new HashMap(31);
}
public static ReloadingProperties getInstance(String filePath)
{
ReloadingProperties instance = instanceMap.get(filePath);
if (instance == null)
{
instance = new ReloadingProperties(filePath, DEFAULT_RELOAD_INTERVAL);
synchronized (instanceMap)
{
instanceMap.put(filePath, instance);
}
}
return instance;
}
private ReloadingProperties(String filePath, long reloadInterval)
{
this.reloadInterval = reloadInterval;
this.filePath = filePath;
}
private void checkRefresh()
{
long currentTime = System.currentTimeMillis();
long sinceLastLoad = currentTime - lastLoadTime;
if (properties == null || sinceLastLoad > reloadInterval)
{
System.out.println("Reloading!");
lastLoadTime = System.currentTimeMillis();
Properties newProperties = new Properties();
FileInputStream fileIn = null;
synchronized (lockObject)
{
try
{
fileIn = new FileInputStream(filePath);
newProperties.load(fileIn);
}
catch (FileNotFoundException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
finally
{
if (fileIn != null)
{
try
{
fileIn.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
properties = newProperties;
}
}
}
public String getProperty(String key, String defaultValue)
{
checkRefresh();
return properties.getProperty(key, defaultValue);
}
public String getProperty(String key)
{
checkRefresh();
return properties.getProperty(key);
}
}
謝謝傑夫......你能告訴我一些實現嗎?從數據庫加載屬性超出了此任務的範圍。 –
添加代碼示例。 –
感謝您的代碼示例!我不知道我的領導是否希望像這樣開箱即可......將建議給他。沒有默認目錄或只有簡單的配置區域,WebLogic加載可供任何在WebLogic中運行的應用程序訪問的屬性文件? –