MQ JMS Message ID не возвращает текстовое сообщение и как записать MQ JMSCorrelationID в правильном формате - PullRequest
0 голосов
/ 07 февраля 2019

Я протестировал автономный клиент JMS, передающий TextMessage в очередь в IBM MQ, и получил следующий идентификатор сообщения с ошибкой:

ID: 414d51204243573032413154202020205bc6bd3e25423865

java.lang.RuntimeException: нет текстового сообщения

  1. Я отправил TextMessage с This is for Test, но почему я не получил TextMessage?До запуска этого кода в очереди не было других сообщений.
  2. В случае успеха текстового сообщения, как прочитать Id сообщения (ID запроса на отправку и идентификатор сообщения ответа) в читаемом формате на Java.Любая вещь, которую мне нужно изменить в приведенном ниже коде.
TextMessage textMessage = queueSession.createTextMessage("This is for Test");
textMessage.setJMSReplyTo(queue);
textMessage.setJMSType("mcd://xmlns");//message type
textMessage.setJMSExpiration(2*1000);//message expiration
textMessage.setJMSDeliveryMode(DeliveryMode.PERSISTENT); 
queueSender = queueSession.createSender(queueSession.createQueue(outputQName));
queueSender.setTimeToLive(2*1000);
queueSender.send(textMessage);

String jmsCorrelationID = " JMSCorrelationID = '" + textMessage.getJMSMessageID() + "'";
while (true) {                        
    Message message = queueReceiver.receive(60*1000);
    if (! (message instanceof TextMessage))
        throw new RuntimeException("no text message");
    TextMessage tm = (TextMessage) message;
    System.out.println("Message:"+tm.getText());  
}

Ответы [ 3 ]

0 голосов
/ 08 февраля 2019

Может ли быть так, что ваше сообщение истекает из очереди?

Я вижу, вы устанавливаете срок действия сообщения 2 секунды.Многие отвечающие приложения копируют оставшееся значение срока действия в ответное сообщение.Таким образом, если приложение, которое читает запрос и отправляет вам ответ, не считывает ваш запрос в течение 2 секунд с момента его отправки, или если оно выполняет и отвечает с оставшимся сроком действия, и ответ не возвращает его для использованиявы бы исчезли из очереди.

Попробуйте увеличить время истечения до более высокого значения.


Также обратите внимание, что вы устанавливаете одно и то же значение срока действия двумя разными методами, один из которыхподразумевается как значение по умолчанию для всех сообщений, отправляемых производителем, а другое - для каждого сообщения.

Устанавливает срок действия по умолчанию для всех сообщений, отправляемых производителем:

queueSender.setTimeToLive(2*1000);

Этоустанавливает срок действия для конкретного сообщения, которое вы отправляете, и отменяет queueSender.setTimeToLive, поэтому вам нужна только одна из этих строк.

textMessage.setJMSExpiration(2*1000);//message expiration
0 голосов
/ 08 февраля 2019

Является ли ваш сеанс транзакцией?
Если да, то ваше сообщение не будет "видимым" в очереди, пока транзакция не будет "подтверждена", и вы никогда не commit ...
Мне интересно узнать, чтоэто содержимое message, когда вы тестируете его класс ... является ли оно пустым?
Возвращается ли receive сразу или только после истечения времени ожидания (в вашем случае 60 * 1000 мс)?
Денис

0 голосов
/ 07 февраля 2019

В вашем случае использования запрос-ответ вид сообщения, запрашивающего клиента, не имеет прямого отношения к типу получаемого сообщения.Тип сообщения, которое получает запрашивающий клиент, зависит от того, что отправляет отвечающий клиент.

Что касается получения идентификатора сообщения в виде String из реализации IBM MQ, вы можете обратиться к этот ответ .

...