Как лучше всего сопоставить два экземпляра объекта между двумя различными приложениями на сервере J2EE? - PullRequest
0 голосов
/ 31 октября 2008

У меня есть приложение J2ee, в котором я хочу, чтобы два объекта, созданные двумя отдельными сервлетами, могли напрямую взаимодействовать, и мне нужно, чтобы эти экземпляры были стабильными, то есть «знали» друг друга во время сеанса.

Последовательность примерно равна:

  1. Клиент отправляет запрос сервлету № 1, который создает объект A
  2. Клиент отправляет второй запрос (после первого возврата) сервлету № 2, который создает объект B.
  3. Объект B находит A, используя JNDI, и два объекта взаимодействуют.
  4. Теперь клиент продолжает отправлять запросы к объекту A, который должен снова найти B.

Как мне убедиться, что эти два экземпляра знают каждый на протяжении сеанса? Связывание их с JNDI не полностью решает проблему, поскольку объект B должен взаимодействовать со своим исходным сервлетом (сервлетом # 2), который не поддерживается стабильным при запросах.

Есть идеи?

Заранее спасибо.


Да, я признаю, что описание проблемы немного расплывчато. Но это не очень простое приложение. Тем не менее, я постараюсь спросить это лучше:

Моя конечная цель - создать своего рода «семантический отладчик» для моего приложения, в отличие от отладчика java, который просто отлаживает операторы java.

Отлаженное приложение - это в основном сервлет. к которому мой инструмент подключается. Инструмент поддерживает соединение с приложением через другой сервлет, который управляет процессом отладки. Эти два сервлета должны общаться друг с другом постоянно и напрямую.

Моя текущая мысль состоит в том, чтобы установить сессионный компонент с сохранением состояния, который облегчит это взаимодействие (никогда не делал этого, все еще борется с его настройкой).

Но я был бы признателен за любые мысли о том, как добиться этого лучше.

Ответы [ 2 ]

1 голос
/ 31 октября 2008

А что мешает вам использовать сессию? Вам не нужен JNDI, просто поместите ваш объект в сессию под предопределенным именем. Если объект связи распространяется на все приложения, используйте Singleton.

P.S. Мне кажется, вы делаете что-то странное, хотя решение на самом деле может быть проще. Можете ли вы описать задачу, а не предлагаемую реализацию? Что такое "семантический отладчик"?

0 голосов
/ 31 октября 2008

Если честно: я не до конца понимаю, чего вы пытаетесь достичь. Не могли бы вы попытаться объяснить проблему, которую вы пытаетесь решить, вместо решения?

От чего зависят эти объекты? Они специфичны для пользователя? Затем поместите их в сеанс, и вы сможете снова извлечь их из сеанса (request.getSession (). GetAttribute ("A")).

Являются ли они глобальными для всех пользователей? В этом случае поместите их в конфигурацию пружины и извлеките их оттуда.

Никогда не храните информацию внутри сервлета.

EDIT: Итак, из того, что я понимаю, хранение значений в сеансе является лучшим способом решения этой проблемы (в «Псевдокоде Java»):

public class BusinessServlet {

protected void doGet(HttpServletRequest req, HttpServletResponse res)  {
  HttpSession session = req.getSession(true);
  BusinessCode business = session.getAttribute("A");
  if (business == null) {       
    business = new BusinessCode();
    session.setAttribute("A", business);
  }

  DebugObject debug = session.getAttribute("B");
  if (debug == null) {       
    debug = new DebugObject();
    session.setAttribute("B", debug);
  }

  business.doSomeWork(debug); 
  }
} 

public class DebugServlet {
  protected void doGet(HttpServletRequest req, HttpServletResponse res)  {
    HttpSession session = req.getSession(true);
    DebugObject debug = session.getAttribute("B");
    if (debug != null) {
      debug.printDebugMessages(res);
    }
  }
} 

Это помогает?

...