Взаимодействие между войнами в одном контейнере

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

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

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

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

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

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

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

Edit:

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

Ответ 1

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

Отметьте this

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

Ответ 2

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

Ответ 3

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

Предлагается Peer Reynders (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 */