Возможен синхронный обмен сообщениями с JMS/WMQ?

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

  • Должен ли партнер предоставить мне отдельную очередь для подписки, а затем я заблокирую мобильный запрос, пока не получу ответное сообщение из этой отдельной очереди?
  • Поддерживает ли JMS или проприетарный интерфейс WebSphere MQ обмен сообщениями синхронизации?
  • Какие есть другие способы реализовать это с помощью обмена сообщениями?

Спасибо


person user567068    schedule 17.02.2011    source источник


Ответы (3)


Схема учебника следующая:

  1. Приложение JMS получает запрос от мобильного устройства.
  2. Приложение JMS открывает очередь ответов (которая может быть динамической).
  3. Приложение JMS подготавливает сообщение запроса, указывающее пункт назначения из #2 ​​в качестве пункта назначения JMSREplyTo.
  4. Приложение JMS отправляет запрос вне точки синхронизации внешнему поставщику услуг.
  5. Приложение JMS ожидает ответа с указанным интервалом ожидания. Если он использует динамическую очередь ответа, он выполняет простой прием. Если несколько экземпляров прослушивают одну и ту же очередь (что более вероятно с внешней службой), тогда он использует JMSMessageID, возвращенный при отправке, как JMSCorrelationID, указанный при получении.
  6. Приложение JMS получает ответ от внешней службы.
  7. Приложение JMS отвечает на мобильное устройство.

Обратите внимание, что при использовании WMQ ожидаемое поведение поставщика услуг заключается в копировании JMSMessageID из сообщения запроса в JMSCorrelationID ответа. Реже требуется, чтобы отправитель сгенерировал JMSCorrelation ID и скопировал его в JMSCorrelationID ответа, но некоторые приложения используют такое поведение. Вам нужно будет понять, как ваш поставщик услуг справляется с этим, чтобы определить правильное поведение вашего запрашивающего приложения.

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

C:\Program Files\IBM\Websphere MQ\tools\jms\samples\simple\simpleRequestor.java

...или эквивалентное расположение под /var/mqm для дистрибутивов UNIX/Linux. Это одна из многих причин установить полный клиент, а не просто брать jar-файлы. Если вам нужно загрузить клиент, он поставляется как SupportPac MQC7.

person T.Rob    schedule 17.02.2011
comment
Спасибо T.Rob, \n у нас нет сервера WMQ. Может ли очередь ответа (из 1.) также быть удаленной очередью? Чтобы мы были чистым клиентом и не должны были размещать сервер? Или у вас должна быть локальная очередь для ответа? Кроме того, будет ли этот сценарий работать в параллельной среде? Например, если сотни мобильных устройств будут отправлять сообщения через одного и того же потребителя и получать ответ через одного и того же слушателя. - person user567068; 18.02.2011
comment
О! Я неправильно понял вопрос. Позвольте мне переписать ответ. - person T.Rob; 18.02.2011
comment
Спасибо Т. Роб. Вы сделали это супер ясно! Не могли бы вы сказать мне, нужно ли для каждого отдельного запроса с мобильного устройства выполнять все шаги из SimpleRequestor.java (например, создать фабрику соединений, получить соединение, открыть очередь, создать временную очередь и т. д.). Или я должен создать фабрику соединений, соединение и пункт назначения. очередь только один раз? Но создайте темп. очередь (ответ) для каждого запроса? Также темп. очередь - это то, что создается локально? И не требует хостинг-сервера, верно? - person user567068; 18.02.2011
comment
Обычно приложение открывает соединение для каждого потока и выполняет описанные выше шаги. Просто имейте в виду, что транзакции ограничены для каждого соединения, поэтому обычно это означает соединение для каждого потока. При использовании внешнего сервиса вам сообщат, поддерживают ли они динамические очереди. Динамическая очередь создается в QMgr, к которому подключено ваше приложение. На самом деле для внешней службы немного необычно разрешать клиентские подключения, а не заставлять вас запускать собственный QMgr, но решение остается за ними. WMQ поддерживает обе модели. - person T.Rob; 18.02.2011

«Клиент» может создать временную очередь и передать ее имя в запросе.

«Сервер» получает запрос в известной очереди, но отправляет «replyTo» с именем очереди, указанной «клиентом».

Для этой цели в JMS есть свойство «replyTo».

Таким образом, клиент видит только предназначенные ему сообщения.

person Peter Lawrey    schedule 17.02.2011

На макушке вижу 2 пути.

  1. создайте 2 очереди: входящую и исходящую. Клиент отправляет во входящую очередь и получает сообщения из исходящей очереди.

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

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

person AlexR    schedule 17.02.2011