Подтвердить что ты не робот

Как сделать синхронный запрос JMS

У меня есть webapp, который, как ожидается, будет извлекать и отображать данные из внешнего приложения, доступного только через обмен сообщениями (JMS).

Итак, если пользователь отправляет запрос в браузере, тот же поток HTTP-запроса должен взаимодействовать с системой обмена сообщениями (серия MQ), так что тот же поток запросов может отображать данные, полученные из системы обмена сообщениями.

Есть ли образец, который я могу использовать здесь? Я видел некоторые неопределенные ссылки в сети, которые используют "Идентификатор корреляции" таким образом:

Msg m = new TextMsg("findDataXYZ");
String cr_id = m.setCorrelationID(id);

sendQueue.send(m).

// now start listening to the Queue for a msg that bears that specific cr_id

Response r = receiverQueue.receive(cr_id);

Есть ли что-то лучше? Другие найденные мной шаблоны ожидают, что ответ будет получен асинхронно. Это не вариант для меня, так как я должен отправить ответ обратно по тому же HTTP-запросу.

4b9b3361

Ответ 1

Сначала откройте очередь ответов. Затем передайте этот объект заданному методу ответа на сообщение. Таким образом, служба, отвечающая вашему запросу, знает, куда отправить ответ. Обычно служба копирует идентификатор сообщения в поле идентификатора корреляции, поэтому, когда вы отправляете сообщение, возвращайте идентификатор сообщения и используете его для прослушивания в очереди ответов. Конечно, если вы используете динамическую очередь ответа, даже если это не важно, просто слушайте следующее сообщение в очереди.

Вот пример кода, который показывает все это. Если вы установили в местоположение по умолчанию, пример кода находится в "C:\Program Files (x86)\IBM\WebSphere MQ\tools\jms\samples\simple\SimpleRequestor.java" в окне Windows или /var/mqm/toolsjms/samples/simple/SimpleRequestor.java в поле * nix.

И на случай, когда вы задаетесь вопросом: "Установить, что именно?" установка WMQ-клиента можно бесплатно загрузить как SupportPac MQC71.

Ответ 2

Шаблон обмена запрос/ответ полезен для вашего требования. Обычно вы используете CorrelationId для связи сообщений запроса и ответа.

При отправке сообщения с запросом вы устанавливаете JMSReplyTo destination в сообщении. Обычно в качестве адреса JMSReplyTo используется временная очередь. При создании потребителя для получения ответа используйте селектор с JMSCorrelationId, что-то вроде

cons = session.createConsumer(tempDestination,"JMSCorrelationId="+requestMsg.JMSMessageId);

На другом конце приложение, обрабатывающее сообщение запроса, должно использовать JMSReplyTo для отправки ответа. Он также должен использовать MessageId сообщения запроса и установить его как CorrelationId ответного сообщения.