2011-06-30 12 views
0

EARファイルがWebLogicにデプロイされているEJB 3アプリケーションから外部プロパティファイルをロードする最適な方法を研究しています。外部プロパティファイルをWebLogic 11上で実行するEJB 3アプリケーションにロード

initサーブレットの使用を考えていましたが、遅すぎると読んでいました(たとえば、initサーブレットが実行される前にメッセージハンドラがJMSキューからメッセージを受け取るなど)。

私はここで、複数のプロパティファイルまたは1つのファイルがあるとします。

〜は/ opt/confに/

これまでのところ、私は最善の解決策はどこウェブロジックアプリケーションライフサイクルイベントを使用していることを感じます事前開始時にプロパティファイルを読み込むためのコード:

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

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

参照:SERV場合に何が起こるかhttp://download.oracle.com/docs/cd/E13222_01/wls/docs90/programming/lifecycle.html

erはすでに実行されていますが、実行可能な解決策になるでしょうか?

他の方法が良いと思いますか?

答えて

0

はそれを考え出したが

対応する/関連する投稿on Stack Overflowを参照してください。

2

実際にどのくらい頻繁にプロパティをリロードするかによって異なります。私が取ったアプローチの1つは、ファイルを再ロードする頻度を定義する設定可能なパラメータを持つプロパティファイルラッパー(シングルトン)を持つことです。私はそのラッパーを通して常にプロパティを読み込み、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

ありがとうございましたJeff ...実装を表示できますか?データベースからプロパティをロードすることは、このタスクの範囲外です。 –

+0

コード例が追加されました。 –

+0

コードサンプルをありがとう!私の指導者がこのような箱からそれをやりたいのかどうかわからない...彼にそれを提案するだろう。 WebLogicで実行されるすべてのアプリケーションからアクセス可能なプロパティファイルをWebLogicがロードするデフォルトのディレクトリまたは単純な構成領域はありませんか? –

関連する問題