Связь между сервлетами - PullRequest
0 голосов
/ 05 октября 2011

Я хотел бы написать метод, который обрабатывает поток связи по XMPP. Последовательность вещей, которые я хотел бы сделать:

  1. Отправить сообщение.
  2. Ждите ответа.
  3. Обработка ответа.

Поскольку мы могли бы ждать ответа дольше 30 с (шаг 2), я поставлю задачу, чтобы позаботиться об этом. Эта задача должна отправить сообщение, а затем дождаться ответа от сервлета XMPP, обрабатывающего входящее сообщение. У меня такой вопрос: как мне ждать в потоке сервлета задач, чтобы получить ответ в сервлете XMPP?

Обычно я использовал бы шаблон слушателя, где слушатель сохранял бы сообщение в поле объекта Task, а затем запускал семафор, чтобы сигнализировать о прибытии сообщения. Как это:

  1. Установить слушатель в сервлете XMPP в статическом поле.
  2. Отправить сообщение.
  3. Ждите семафора. ........ Между тем, в потоке сервлетов XMPP придет ответ, и он вызовет метод обратного вызова слушателя, который сохраняет сообщение и освобождает семафор.
  4. Получить сообщение из поля и обработать.

Я попробовал это, и оно отлично работало на сервере разработки. Однако при загрузке в облако я обнаружил, что должен установить прослушиватель на сервлете XMPP (шаг 1), но тогда при появлении сообщения будет создан новый экземпляр сервлета, и ссылка на слушатель для вызова, событие через слушателя является статическим полем. Я пришел к выводу, что XMPPServlet запускается в совершенно другой виртуальной машине, что означает, что статическое поле не разделяется между этим сервлетом и задачей. Это правильно?

В целом, какова лучшая практика для общения между этими сервлетами? Как поделиться данными (обычно я бы сохранил их в поле объекта) и как я могу сигнализировать от одного к другому, когда происходят события (обычно я бы использовал семафор)?

Извините за длинный вопрос. Скажите, если неясно, и я немного уточню.

1 Ответ

2 голосов
/ 06 октября 2011

Повторное размещение моего ответа на тот же вопрос, который вы задали в списке рассылки:

Вы не можете [дождаться ответа в процессе отправки].Вместо этого вы должны использовать асинхронный шаблон: отправьте сообщение и зарегистрируйте обработчик для входящих сообщений XMPP.Этот обработчик должен сопоставить ответ на соответствующий запрос (при необходимости сохраненный в хранилище данных) и выполнить соответствующую обработку на нем.

Приложение App Engine может быть запущено на любом количестве компьютеров;примитивы синхронизации, предназначенные для связи между потоками, работать не будут.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...