2015-06-25 3 views
3

У меня есть несколько классов Singleton в приложении Liferay, которые содержат несколько параметров конфигурации и ServiceLocator с экземплярами WebServices, которые мне нужно использовать.Класс Singleton для совместного использования несколькими портлетами

Я поместил эти классы в банку, которая объявлена ​​как зависимость от всех моих портлетов.

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

Для класса AppConfig это может быть не так уж и важно, но мой ServiceLocator действительно содержит кучу ссылок, которые занимают хорошую память.

Есть ли способ, которым я могу помещать эти ссылки Singleton в какой-то общий контекст в моем Liferay Portal?

+0

Имеет ли каждый портлет свой экземпляр класса загрузчика? – Alexander

+0

Да, они в разном войнах – MichelReap

+2

В этом проблема! Обычно, когда мне приходилось достигать чего-то подобного, мне пришлось помещать JAR, содержащий классы Singleton, в библиотеку загрузчика класса _common_ (In Tomcat: '/common/lib' или что-то в этом роде) вместо того, чтобы упаковывать его в каждую WAR. Проблема в том, что вам также придется поместить все зависимые библиотеки в этот общий каталог lib. Не знаю, как это сделать в Лиферу. Для tomcat см. Эту тему: http://stackoverflow.com/questions/267953/does-tomcat-load-the-same-library-file-into-memory-twice-if-they-are-in-two-web – Alexander

ответ

2

Ответ Александра дает общий ответ, который верен с учетом или отсутствием Лиферэй.

Liferay (как вы упомянули выше) добавляет еще один вариант: ServiceBuilder. Вы получите фактические экземпляры, содержащиеся только в одном веб-приложении, и у вас будет сопрягаемая банка, которую вы можете распространять с каждым зависимым приложением. Таким образом, вы можете более легко обновить свою реализацию: легко настроить горячее развертывание новых и обновленных веб-приложений на ваш сервер приложений - сложнее обновить код, который живет в глобальном пути к классам.

Глобальный путь класса (ответ Александра), однако, приносит вам немедленный успех, в то время как ServiceBuilder имеет собственную кривую обучения и вводит некоторые другие зависимости. Я не против этих зависимостей, но ваш пробег может отличаться. Решите для себя

3

Проблема заключается в том, что каждый портлет работает в своем собственном файле WAR, а файл войны aech имеет свой собственный загрузчик классов.

Обычно, когда мне приходилось выполнять такое требование, мне пришлось помещать класс Singleton в файл JAR и этот файл JAR в общую библиотеку загрузчика классов вместо того, чтобы упаковывать его в каждую WAR. (В Tomcat: <tomcatHome>/common/lib или что-то в этом роде)

Тогда вам также придется поместить все зависимые библиотеки в этот общий каталог lib. Не знаю, как это сделать в Лиферэй. Для tomcat см. Эту тему: stackoverflow.com/questions/267953/ и эту документацию: http://tomcat.apache.org/tomcat-7.0-doc/class-loader-howto.html. Зависит от контейнера Servlet.

+0

Спасибо за конвертацию. Upvoted –

0

С портфолио maven вы можете создать общий компонент Spring и импортировать в pom каждого портлета. Другим решением является использование сервис-строителя. Портлет Spring MVC был бы самым рекомендуемым для этого.

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