Загрузите файлы внешних свойств в приложение EJB 3, работающее в WebLogic 11 - PullRequest
0 голосов
/ 01 июля 2011

Я изучаю лучший способ загрузки файлов внешних свойств и приложения EJB 3, файл EAR которого развернут в WebLogic.

Думал об использовании сервлета инициализации, но где-то читал, что он будет слишком медленным (например, мой обработчик сообщений может получить сообщение из моей очереди JMS до запуска сервлета инициализации).

Предположим, у меня есть несколько файлов свойств или один файл:

~ / Opt / CONF /

Пока что я чувствую, что наилучшее из возможных решений - использование события жизненного цикла приложения Web Logic, где код для чтения файлов свойств во время предварительного запуска:

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

Что произойдет, если сервер уже запущен, будет ли после запуска жизнеспособное решение?

Кто-нибудь может придумать какие-нибудь альтернативные способы, которые лучше?

Ответы [ 2 ]

2 голосов
/ 01 июля 2011

Это действительно зависит от того, как часто вы хотите, чтобы свойства были перезагружены. Один из подходов, который я выбрал, заключается в том, чтобы иметь оболочку файла свойств (singleton), которая имеет настраиваемый параметр, определяющий, как часто файлы следует перезагружать. Затем я всегда буду читать свойства через эту оболочку, и она будет перезагружать свойства каждые 15 минут (аналогично ConfigureAndWatch Log4J). Таким образом, если я захочу, я могу изменить свойства без изменения состояния развернутого приложения.

Это также позволяет загружать свойства из базы данных, а не из файла. Таким образом, вы можете быть уверены, что свойства одинаковы для всех узлов кластера, и это снижает сложность, связанную с управлением файлом конфигурации для каждого узла.

Я предпочитаю это, чем привязывать его к событию жизненного цикла. Если вы никогда не собираетесь их менять, тогда сделайте где-нибудь статические константы:)

Вот пример реализации, чтобы дать вам представление:

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 голосов
/ 05 июля 2011

Разобрался ...

См. Соответствующий / связанный пост о переполнении стека .

...