2011-06-30 46 views
0

正在研究從其EAR文件部署到WebLogic的EJB 3應用程序加載外部屬性文件的最佳方式。將外部屬性文件加載到運行在WebLogic 11上的EJB 3應用程序

想使用一個初始化servlet的,但我讀的地方,這將是太慢了(如我的消息處理程序可以從我的JMS隊列的servlet的init運行之前收到的消息)。

假設我有多重屬性文件或一個文件在這裏:

〜/選擇/ conf目錄/

到目前爲止,我覺得最好的解決方案是通過使用Web邏輯應用程序生命週期事件,其中代碼讀取性能的預啓動時文件:

import weblogic.application.ApplicationLifecycleListener; 
import weblogic.application.ApplicationLifecycleEvent; 

public class MyListener extends ApplicationLifecycleListener { 
    public void preStart(ApplicationLifecycleEvent evt) { 
     // Load properties files 
    } 
} 

參見:http://download.oracle.com/docs/cd/E13222_01/wls/docs90/programming/lifecycle.html

會發生什麼,如果SERV呃已經在運行了,會在開始後成爲可行的解決方案嗎?

任何人都可以想到更好的替代方法嗎?

回答

2

這實際上取決於您希望重新加載屬性的頻率。我採取的一種方法是有一個屬性文件包裝器(單件),它具有一個可配置參數,用於定義文件應該重新加載的頻率。然後我總是通過該包裝器讀取屬性,並且它會在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); 
    } 
} 
+0

謝謝傑夫......你能告訴我一些實現嗎?從數據庫加載屬性超出了此任務的範圍。 –

+0

添加代碼示例。 –

+0

感謝您的代碼示例!我不知道我的領導是否希望像這樣開箱即可......將建議給他。沒有默認目錄或只有簡單的配置區域,WebLogic加載可供任何在WebLogic中運行的應用程序訪問的屬性文件? –

相關問題