Играть!Framework, один экземпляр Jetty, развертывание нескольких проектов, совместное использование библиотек - PullRequest
7 голосов
/ 21 декабря 2011

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

Согласно этому посту , по-видимому, можно извлечь общие библиотеки из каждого 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 Ответ

1 голос
/ 30 января 2012

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

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

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

...