2011-12-20 2 views
7

Я пытаюсь развернуть два или более независимых Play! (1.2.4) на основе того же экземпляра Jetty.Играйте! framework, одиночный экземпляр Jetty, развертывание нескольких проектов, совместное использование libs

По this post это, по-видимому, можно извлечь общих библитек из каждого PrjName.war/WEB-INF/lib каталога и поместить их в общем Lib каталога т.е. jetty/lib/ext.

У нас есть большое количество небольших независимых проектов, которые мы бы использовали , чтобы реализовать с помощью Play! но все они должны быть развернуты в том же экземпляре Jetty, который использует все библиотеки для сокращения использования ОЗУ. Является ли мое предположение правильным, что несколько проектов, совместно использующих одни и те же библиотеки, уменьшат общий объем памяти?

Мои попытки поместить все библиотеки в общую папку, то есть jetty/lib/ext работал для одного проекта, но второй проект завершился неудачей и разбил первый.

Похоже, что это проблема с конфликтующими экземплярами EhCache.

Вот журнал молы:

... 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
     at java.lang.reflect.Method.invoke(Unknown Source) 
     at org.eclipse.jetty.start.Main.invokeMain(Main.java:469) 
     at org.eclipse.jetty.start.Main.start(Main.java:612) 
     at org.eclipse.jetty.start.Main.parseCommandLine(Main.java:265) 
     at org.eclipse.jetty.start.Main.main(Main.java:79) 
Caused by: net.sf.ehcache.ObjectExistsException: Cache play already 
exists 
     at net.sf.ehcache.CacheManager.addCache(CacheManager.java:859) 
     at play.cache.EhCacheImpl.<init>(EhCacheImpl.java:32) 
     at play.cache.EhCacheImpl.newInstance(EhCacheImpl.java:41) 
     at play.cache.Cache.init(Cache.java:241) 
     at play.Play.start(Play.java:511) 
     ... 42 more 

Любая помощь очень ценится.

ответ

1

Когда вы используете общие банки, Jetty будет использовать Classloader системы для загрузки классов внутри общих банок. И, поскольку Play EhCacheImpl (почти) синглтон, второе приложение для начала будет влиять на первое и наоборот. Это исключение, которое вы получаете сейчас: Play пытается указать два кэша в одном и том же загрузчике классов с тем же именем. Я могу думать о следующих решениях:

  1. Fix Playframework так, что он может справиться с этой ситуацией
  2. Используйте свою собственную реализацию кэша (не уверен, если это единственное, что предотвращает ваши оба приложения для совместной работы)
  3. Используйте обычную установку и реплицируйте банки для каждого приложения.

Опция 3 звучит лучше для меня, так как вам не обязательно иметь шанс создать фреймворк, и он также более безопасен в отношении ошибок регрессии. Что касается области памяти, вы можете использовать visualvm для проверки того, отличается ли потребление памяти существенно оправданным для общих баннеров.

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