2013-06-24 4 views
1

У меня есть фундаментальный вопрос: возможно ли общение между двумя войнами, которые работают на одном экземпляре?Взаимосвязь между двумя войнами в Томкате

Другой способ, предположим, что поток A [daemon] запущен/инициирован из A.war, а Thread B [daemon] запущен/инициирован из B.war, обе войны развернуты в одном экземпляре tomcat. Могу ли я связываться между Thread A и Thread B? Если да, то как это возможно [ссылка на учебник]?

+2

Хотя пользовательские решения могут существовать, всегда есть старый добрый способ использования сокетов ... Хотя это может показаться тяжелым с первого взгляда, он будет работать, даже если две войны будут разделены. Или вы можете абстрагироваться от различий и использовать любой лучший канал. – fge

ответ

1

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

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

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

Что-то, что было бы слишком тяжело, чтобы предложить на основе вашего вопроса, - это построение службы Liferay - это компонент, который абстрагирует различные контексты приложения для определенных вызовов API и позволяет вам прозрачно обращаться в другое приложение. Это связано с Liferay, хотя это может и не быть решением, которое вы ищете.

0

Ну, простейшая вещь, которая могла бы работать, - поместить общую библиотеку (jar) в общий загрузчик классов (не помните, в каком каталоге она находится, lib, pehaps). Затем вы можете получить такую ​​же фантазию, как вы хотите, относительно всех вариантов, которые у вас есть, например. BlockingQueues, Семафоры и еще много чего. Просто будьте осторожны в том, что Types вы перетасовываете в каждое приложение и из него, чтобы исключить исключения класса.

0

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

Я бы сказал, что у вас есть 2 типичные пути пойти:

  1. Удаленный доступ через какой-то веб-службы (основано на патрубках, RMI, HTTP ... Вы называете это). Он даже позволяет развернуть свои войны в разных случаях.
  2. Использование общего компонента, который должен быть предоставлен как ресурс экземпляром сервера, как правило, через JNDI. В качестве примера посмотрите here на то, как это делается с Tomcat7 для dataSources (наиболее распространенный вариант использования).