ibm mq — WMQ C ++ Получить идентификатор сообщения запроса и установить для него идентификатор корреляции для ответа

У меня проблема с получением идентификатора сообщения и установкой идентификатора корреляции ответа.

Вот кусок кода:

MQBYTE msgID;

request_msg.messageId().copyOut(msgID, MQ_MSG_ID_LENGTH, 0);
response_msg.setCorrelationId(msgID);

когда я проверял Id корреляции ответа, id корреляции равен 0.

Как я могу скопировать / получить messageId запроса и поместить его в корреляционный идентификатор ответа?

Заранее спасибо. 🙂

3

Решение

Инфоцентр Манипулирование бинарными строками в C ++ показывает типы данных, участвующих как ImqBinary а также MQBYTE24, Как отмечает Шаши в комментариях, MQBYTE является одним байтом и не может содержать 24-байтовый идентификатор сообщения. Ссылка на приведенной выше странице содержит справочный пример:

#include <imqi.hpp> // C++ classes

ImqMessage message ;
ImqBinary id, correlationId ;
MQBYTE24 byteId ;

correlationId.set( byteId, sizeof( byteId ) ); // Set.
id = message.id( );                            // Assign.
if ( correlationId == id ) {                   // Compare.
...

Одним из инструментов для диагностики подобных проблем является очень полезный SupportPac MA0W который является выходом API. Он может показать вам точное содержимое структур, переданных в MQ до и после вызова API. Очень часто можно увидеть то, что ожидается (в этом случае скопировав MQMD.MsgID к MQMD.CorrelID это не то, что на самом деле произошло. В этом случае, я полагаю, след, такой как предоставленный MA0W, показал бы, что msgID был точно передан из приложения в MQ, но состоял только из одного символа.

ОБНОВИТЬ
ОП спрашивает:

переменная id является ImqBinary а также message является ImqMessage
объект, из того, что я знаю id не является членом ImqMessage лайк
messageId, correlationId, groupId и т. д. так как можно
message.id() передал это значение на id?

Вы правы в том, что id объявленная переменная типа ImqBinary а не член ImqMessage учебный класс. Пожалуйста, смотрите страницу Инфоцентра для ImqBinary C ++ класс что объясняет, что:

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

Намерение ImqBinary Класс должен предоставлять тип переменной для инкапсуляции массива байтов с перегруженными методами, так что «нормальные» манипуляции с переменными работают, как и ожидалось. Вместо того, чтобы копировать байтовый массив по одному байту за раз, это может быть LVAL или же RVAL в назначении. Вместо того, чтобы сравнивать массив байт за раз, вы можете просто использовать операторы сравнения, такие как ==,

Так что, если ваш код был изменен для использования примера, он может выглядеть так:

#include <imqi.hpp> // C++ classes

ImqMessage request_msg, response_msg ;
ImqBinary id ;

id = request_msg.id( );
response_msg.setCorrelationId(id);

Тем не менее, я не уверен, что вам даже нужна промежуточная переменная. Возможно, вы сможете назначить идентификатор корреляции, используя выходные данные вызова геттера для идентификатора сообщения из исходного сообщения. Что-то вроде….

response_msg.setCorrelationId( request_msg.id( ) );

…может сделать это. Я больше не кодирую C или C ++, поэтому, возможно, я неправильно понял синтаксис или не сделал это так элегантно, как это может быть закодировано, но вы должны понять.

4

Другие решения


По вопросам рекламы [email protected]