2015-10-23 2 views
0

я нашел некоторую информацию по этой теме, но не нашли хорошее решение еще:Absolute одноточечно над несколькими войнами (доля ClassLoader)

Скажем, у меня есть 3 проекта:

  • Ключевых (Java)
  • FrontEnd (JSP и уголек)
  • WS (Java)

Оба WS и FrontEnd содержат Maven д выносливость к Core. в ядре, есть одноэлементно SomeDao, подобные этим:

private static SomeDao _instance = null; 

public static SomeDao getInstance() { 
    if (_instance != null) 
     return _instance; 
    synchronized (SomeDao.class) { 
     if (_instance == null) 
      _instance = new SomeDao(); 
     return _instance; 
    } 
} 

Приложение размещается в JBoss WildFly и как WS (Java) и FrontEnd (JSP) используют SomeDao, но из-за различных загрузчиков классов, там это два экземпляра для SomeDao. SomeDao имеет свой собственный кеш и, следовательно, через некоторое время перестает синхронизироваться (WS < -> FrontEnd).

Мои вопросы:

  • Каков наилучший подход к силе только один instantation (сделать родительское войну, плавить войны, используют один и тот же загрузчик классов, Maven решение, поместите Ядро, как Lib в JBoss, развернуть Core как его собственная война в JBoss) и почему?
  • Возможно ли получить доступ к загрузчику классов другой WAR в JBoss? Если да, то как?
+0

Для уточнения: JBoss имеет 2 войны: фронтэнда и WS каждый со своей собственной зависимости от Ядра –

ответ

0

Нечто подобное может работать для вас:

Поскольку несколько загрузчиков классов, как правило, используется во многих ситуациях, в том числе сервлета-вы можете свернуть с несколько одноплодных случаями, независимо от того, насколько тщательно вы» Вы внедрили свои одноэлементные классы. Если вы хотите убедиться, что один и тот же загрузчик классов загружает ваши синглтоны, вы должны указать загрузчик классов самостоятельно; для Например:

private static Class getClass(String classname) 
             throws ClassNotFoundException { 
     ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); 
     if(classLoader == null) 
     classLoader = Singleton.class.getClassLoader(); 
     return (classLoader.loadClass(classname)); 
    } 
} 

Источник: Simply Singleton - JavaWorld

Смежные вопросы