Я хотел бы написать метод, который обрабатывает поток связи по XMPP. Последовательность вещей, которые я хотел бы сделать:
- Отправить сообщение.
- Ждите ответа.
- Обработка ответа.
Поскольку мы могли бы ждать ответа дольше 30 с (шаг 2), я поставлю задачу, чтобы позаботиться об этом. Эта задача должна отправить сообщение, а затем дождаться ответа от сервлета XMPP, обрабатывающего входящее сообщение. У меня такой вопрос: как мне ждать в потоке сервлета задач, чтобы получить ответ в сервлете XMPP?
Обычно я использовал бы шаблон слушателя, где слушатель сохранял бы сообщение в поле объекта Task, а затем запускал семафор, чтобы сигнализировать о прибытии сообщения. Как это:
- Установить слушатель в сервлете XMPP в статическом поле.
- Отправить сообщение.
- Ждите семафора. ........ Между тем, в потоке сервлетов XMPP придет ответ, и он вызовет метод обратного вызова слушателя, который сохраняет сообщение и освобождает семафор.
- Получить сообщение из поля и обработать.
Я попробовал это, и оно отлично работало на сервере разработки. Однако при загрузке в облако я обнаружил, что должен установить прослушиватель на сервлете XMPP (шаг 1), но тогда при появлении сообщения будет создан новый экземпляр сервлета, и ссылка на слушатель для вызова, событие через слушателя является статическим полем. Я пришел к выводу, что XMPPServlet запускается в совершенно другой виртуальной машине, что означает, что статическое поле не разделяется между этим сервлетом и задачей. Это правильно?
В целом, какова лучшая практика для общения между этими сервлетами? Как поделиться данными (обычно я бы сохранил их в поле объекта) и как я могу сигнализировать от одного к другому, когда происходят события (обычно я бы использовал семафор)?
Извините за длинный вопрос. Скажите, если неясно, и я немного уточню.