2012-03-20 2 views
10

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

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

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

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

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

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

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

Редактировать:

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

ответ

5

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

Проверить this

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

+0

Спасибо вам за ответ! Почему вы отказались от поддержки JNDI Jetty? Итак, вы внедрили свой собственный NamingManager, но все равно используете Context API, или вы все-таки бросаете JNDI?Не могли бы вы указать мне на какой-то ресурс, описывающий, как его сложно зарегистрировать с помощью Jetty? О, и, наконец, объекты передаются через это решение, переданное ссылкой или сериализованное? – ebaxt

+0

Мы переходим по ссылке, так что объекты Экземпляры непосредственно адресуются. JNDI в порядке: попробуйте эту ссылку для некоторой информации [link] (http://docs.codehaus.org/display/JETTY/JNDI). Причина, по которой мы отказались, была в два раза: нам нужна была большая гибкость (несколько реестров с фиксированными интерфейсами, функциональность запросов, регистрация времени выполнения) и более компактный пакет (JNDI является общим и предоставляет функциональные возможности, которые нам не нужны). Реализация вашего реестра требует, чтобы вы надлежащим образом обрабатывали жизненный цикл webapp, что может быть нелегко –

+0

Удивительно, спасибо большое! – ebaxt

2

Предоставление услуги в качестве EJB с локальным интерфейсом будет одним из вариантов. Стандарт не гарантирует, что это будет реализовано как прямой вызов, когда будет сделано через apllications, но apparently most app servers implement it that way. Для работы в Jetty вам придется использовать вложенный EJB-контейнер, такой как OpenEJB, JBoss embeddable или Spring's Pitchfork.

+0

Спасибо! Поскольку у нас есть большое SOA-развертывание, основанное на пользовательской оболочке встроенного ящика, я не добавляю, что EJB-контейнер будет летать вместе с моим менеджером. – ebaxt

+0

@ebaxt: Я подозреваю, что шарниры полностью на этикетке «EJB» и его плохая репутация от 10 лет назад. Если никакое другое простое решение не появится, возможно, стоит попробовать. –

+0

Да, вы, вероятно, правы в обоих пунктах;) – ebaxt

1

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

Предложил Peer Рейндерс (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 */ 
Смежные вопросы