WMQ C ++获取请求的消息ID并为其设置相关ID以进行回复

时间:2015-05-27 19:32:30

标签: c++ ibm-mq

我在获取邮件ID时遇到问题,并将其设置为回复的相关ID。

这是一段代码:

MQBYTE msgID;

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

当我检查回复的相关ID时,相关id为0。

如何复制/获取请求的messageId并将其放在回复的相关ID上?

提前致谢。 :)

1 个答案:

答案 0 :(得分:4)

信息中心页面Manipulating binary strings in C++显示涉及的数据类型为ImqBinaryMQBYTE24。正如Shashi在评论中指出的那样,MQBYTE是一个单字节,不能包含24字节的消息ID。上面链接的页面提供了一个参考示例:

#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退出。它可以向您显示API调用之前和之后传递给MQ的结构的确切内容。通常看到的是预期的结果(在这种情况下将MQMD.MsgID复制到MQMD.CorrelID并不是实际发生的事情。在这种情况下,我相信MA0W提供的跟踪显示msgID已准确地从应用程序传递到MQ,但只包含一个字符。

<强>更新
OP问:

  

变量idImqBinarymessageImqMessage   对象,据我所知id不是ImqMessage的成员   messageIdcorrelationIdgroupId等等,怎么可能   message.id()id上传递了它的值?

{01}}是id类型的声明变量而不是ImqBinary类的成员,这是正确的。请参阅ImqBinary C++ class的信息中心页面,其中解释了:

  

此类封装了可用于的二进制字节数组   ImqMessage会计令牌,相关ID和消息ID值。它   允许轻松分配,复制和比较。

ImqMessage类的目的是提供一个变量类型来封装具有重载方法的字节数组,以便“正常”变量操作按预期工作。不是一次一个字节地复制字节数组,而是在赋值中可以是ImqBinaryLVAL。您可以使用RVAL等比较运算符,而不是一次比较数组一个字节。

因此,如果您的代码被修改为使用该示例,则它可能如下所示:

==

那就是说,我不确定你甚至需要一个中间变量。您可以使用getter调用的输出为源消息中的消息ID分配相关ID。像......那样......

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

ImqMessage request_msg, response_msg ;
ImqBinary id ;

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

......可能会这样做。我不再编写C或C ++代码了,所以我的语法可能有问题或者没有像编码那样优雅,但你应该明白这一点。