Каков наилучший способ реализовать шаблон запроса / ответа, если нет доступных временных очередей? - PullRequest
3 голосов
/ 31 января 2011

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

К сожалению, мне приходится использовать протокол Stomp, который не имеет понятия о временных очередях или темах. (Хотя у брокера сообщений есть)

Каков наилучший способ гарантировать, что только оригинальный запросчик получит ответ? Есть ли лучшие практики для этой печальной ситуации?

Ответы [ 2 ]

4 голосов
/ 31 января 2011

Обычное решение, когда несколько запрашивающих слушают ответы в одной и той же очереди, заключается в использовании идентификаторов корреляции для выбора сообщений.На стороне клиента это выглядит так:

  1. Поместите сообщение в очередь запросов и подтвердите.
  2. Извлеките JMSMessageID из исходящего сообщения (значение определяется посредником иобновляет объект сообщения в результате отправки).
  3. Получить сообщение из очереди ответов, указав JMSMessageID из исходящего сообщения в качестве идентификатора корреляции в селекторе.
  4. Обработка и принятие.

На стороне сервера это выглядит следующим образом:

  1. Получение сообщения с синхронизацией.
  2. Обработка запроса и подготовка ответа.
  3. Установите JMSCorrelationID в ответе на значение JMSMessageID из запроса.
  4. Отправьте сообщение.
  5. Commit.

Потребитель установитчто-то вроде селектора: activemq.selector:JMSCorrelationID=.

Поскольку брокер создает идентификатор сообщения, который должен быть глобально уникальным, шаблон использования его в качестве идентификатора корреляции предотвращает конфликтns, которые возможны, когда каждому запрашивающему разрешено указывать свое собственное значение.

2 голосов
/ 31 января 2011

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

Более подробно, это означает установку случайного идентификатора в сообщении запроса (используя setJMSCorrelationID()) и помещение этого сообщения в очередь запросов. Получатель этого сообщения-запроса обрабатывает его, создает ответное сообщение, устанавливает тот же идентификатор корреляции в ответном сообщении и помещает его в тему ответа. Тем временем клиент прослушивает тему ответа с помощью выражения селектора, которое указывает ожидаемый идентификатор корреляции.

Опасность заключается в том, что ответное сообщение отправляется раньше, чем клиент успевает его прослушать, хотя это, вероятно, маловероятно. Вы можете попробовать использовать предварительно настроенную Очередь для ответов, а не для темы, но я обнаружил, что темы, как правило, работают более надежно (мой поставщик JMS - HornetQ - ваш пробег может отличаться).

Все это говорит мне, что JMS очень плохо подходит для модели запрос / ответ. API просто не поддерживает его должным образом. В этом нет ничего удивительного, поскольку JMS никогда не использовался.

Что-то вроде вычислительной сетки (терракота, гигапространства, Infinispan и т. Д.), Вероятно, даст лучшие результаты, но на самом деле это не вариант для вас.

...