У меня проблема с получением идентификатора сообщения и установкой идентификатора корреляции ответа.
Вот кусок кода:
MQBYTE msgID;
request_msg.messageId().copyOut(msgID, MQ_MSG_ID_LENGTH, 0);
response_msg.setCorrelationId(msgID);
когда я проверял Id корреляции ответа, id корреляции равен 0.
Как я могу скопировать / получить messageId запроса и поместить его в корреляционный идентификатор ответа?
Заранее спасибо. 🙂
Инфоцентр Манипулирование бинарными строками в 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 ++, поэтому, возможно, я неправильно понял синтаксис или не сделал это так элегантно, как это может быть закодировано, но вы должны понять.