Как определить порядок загрузки контекста в Tomcat или определить иерархию зависимостей между контекстами? - PullRequest
3 голосов
/ 15 марта 2012

Предположим, у меня есть два веб-приложения для развертывания в Tomcat 6, упакованные как, скажем, A.war и B.war. Есть ли способ заставить Tomcat при перезапуске:

  • нагрузка B до A? или
  • загрузить A после всего остального? или
  • сделать A загружаемым только после загрузки B - то есть сделать B зависимостью A?

Это вопросы. Ниже приведен фон, который может быть слишком сложным, но также и очень полезным.

* * Фон тысяча двадцать-один * * тысяча двадцать-дв

Я пытаюсь развернуть некоторые портлеты в Liferay. Эти портлеты представляют собой устаревший код, созданный людьми, которые мало знали о том, как работает Liferay, и приняли, скажем, «удивительные» решения, такие как отображение таблиц сущностей Liferay Service Builder в новые классы. На самом деле это не так уж и много, но тот, кто знает Liferay, может немного лучше понять мою точку зрения.

Эти портлеты отправляются Spring и отображаются в базу данных Hibernate. Чтобы избежать раздражающего требования редактирования context.xml (что утомительно, подвержено ошибкам, легко забываемо, делает постоянный слой медленным до чертиков и т. Д.), Я предоставил источник данных Liferay в качестве нового компонента ...

<bean id="liferayDataSource" 
    class="org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy">
    <property name="targetDataSource">
        <bean
            class="com.liferay.portal.kernel.util.InfrastructureUtil"
            factory-method="getDataSource" />
    </property>
</bean>

... и использовал этот новый компонент в качестве источника данных фабрики Entity Manager:

<bean id="entityManagerFactory"
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="liferayDataSource"/>
    <property name="persistenceUnitName" value="liferay-db" />
</bean>

Если у меня запущен Liferay и я развернул свои портлеты, он запускается без проблем, потому что ресурсы Liferay уже доступны. Проблема в том, что при перезапуске Liferay эти портлеты загружаются до запуска приложения Liferay, поэтому класс InfrastructureUtil даже не загружается. Итак, я хочу отложить загрузку портлетов.

Я заметил, что у каждого приложения есть каталог под $CATALINA_HOME/temp/, обычно называемый чем-то вроде 0-this-annoying-portlet, 2-that-weird-portlet и т. Д. Я считаю, что число в начале определяет порядок, поскольку оно вызывает сортировку приложений по алфавиту , Это правда? Могу ли я установить этот номер?

Конечно, я восприимчив к любому решению, но мне действительно интересно узнать о возможностях определения порядка загрузки приложений в Tomcat.

Ответы [ 3 ]

1 голос
/ 17 августа 2012

Liferay может быть принудительно загружен первым приложением, определяющим его контекст в файле $ TOMCAT / conf / server.xml внутри тега:

<Host autoDeploy="true" 
appBase="webapps" name="localhost" unpackWARs="true" 
xmlNamespaceAware="false" xmlValidation="false">
   ....
   <Context path="" crossContext="true" docBase="ROOT">
       ....
   </Context>
   ....
</Host>

И удаляющем файл $ TOMCAT / conf /Каталина / локальный / ROOT.xml

1 голос
/ 24 мая 2012

Проблема заключалась в том, что в пакете Liferay 6.0 SP2 Tomcat развертывал файл контекста XML для каждого портлета. Поэтому, когда я развернул свой annoying-portlet, создается файл $TOMCAT/conf/Catalina/localhost/annoying-portlet.xml. Когда Tomcat перезапускается, эти файлы контекста XML читаются, соответствующие проекты загружаются (случайно в алфавитном порядке), и портлет запускается перед Liferay, имя контекста которого ROOT.

.

Как ясно указала первая ссылка @MarceloBezerra, $TOMCAT/conf/Catalina/localhost/annoying-portlet.xml будет иметь приоритет (в том смысле, что все контексты с файлом в $TOMCAT/conf/Catalina/localhost/ будут загружены до контекстов, у которых просто есть каталог в $TOMCAT/webapps. Решение запрещает развертывание файла $TOMCAT/conf/Catalina/localhost/annoying-portlet.xml.

Как это сделать? Что ж, после некоторого времени общения с замечательными сотрудниками Liferay они обнаружили, что развертывание XML контекста можно запретить, добавив атрибут deployXML="false" к элементу Host из $TOMCAT_HOME/conf/server.xml:

<Host autoDeploy="true" 
    appBase="webapps" name="localhost" unpackWARs="true" 
    xmlNamespaceAware="false" xmlValidation="false">
...