Внутрипроцессное взаимодействие между войнами в одном контейнере - PullRequest
11 голосов
/ 20 марта 2012

Какие есть варианты для обеспечения связи с малой задержкой между двумя войнами, ведущимися в одном и том же пристани?

Мне в основном нужно вызывать службу в одной войне из другой, но я не могу себе позволить называть ее веб-службой.

Поскольку они работают в одной и той же JVM, я надеюсь не использовать RMI / JMS и т. Д., Но я не знаю, какие у меня есть другие варианты?

Я смотрел на связь между сервлетами, но поскольку прямой вызов метода устарел , это не кажется правильным выбором?

Я также нашел kyronet , но есть ли лучшие решения, так как это в той же JVM?

Я ищу что-то вроде VM-компонента Apache Camel ( seda между веб-приложениями), но поскольку только одно из приложений использует Camel, это не вариант.

Я знаю, что мне, возможно, придется делить некоторые DTO между войнами, но, пожалуйста, не предлагайте помещать службу в общую библиотеку, если бы это был вариант, я бы не задавал этот вопрос:)

Изменить:

Встраивание EJB-контейнера также, вероятно, не вариант.

Ответы [ 3 ]

5 голосов
/ 20 марта 2012

Зарегистрируйте интерфейсы в JNDI и сделайте их глобальными, чтобы «другой» сервлет мог получить их из репозитория.

Проверьте this

(примечание: мы далиJNDI в пользу нашей собственной реализации реестра, но мы запускаем реестр и Jetty программно в той же JVM)

2 голосов
/ 31 октября 2013

Можно "обмениваться данными" между двумя совместно расположенными веб-приложениями, используя ServletContext.getContext (String uriPath) и RequestDispatchers (или даже прослушиватели ServletContext).

Ниже приводится рабочий код. Предложил Пир Рейндерс (http://www.coderanch.com/t/222608/Web-Services/java/communicate-war-files)

public void doGet(HttpServletRequest Prequest, HttpServletResponse Presponse)
  throws IOException, ServletException {

  ServletContext    sc = getServletContext().getContext("/war2");
  RequestDispatcher rd = sc.getRequestDispatcher("/LoginHandler?UserId=DummyUser");
  rd.forward(Prequest, Presponse);
} /* End of doGet */
2 голосов
/ 20 марта 2012

Предоставление сервиса в виде EJB с локальным интерфейсом будет одним из вариантов.Стандарт не гарантирует, что это будет реализовано как прямой вызов, когда выполняется через приложения, но , очевидно, большинство серверов приложений реализуют его таким образом .Для работы в Jetty вам нужно будет использовать встраиваемый EJB-контейнер, такой как OpenEJB , JBoss встраиваемый или Вилы Spring * .

...