我在获取邮件ID时遇到问题,并将其设置为回复的相关ID。
这是一段代码:
MQBYTE msgID;
request_msg.messageId().copyOut(msgID, MQ_MSG_ID_LENGTH, 0);
response_msg.setCorrelationId(msgID);
当我检查回复的相关ID时,相关id为0。
如何复制/获取请求的messageId并将其放在回复的相关ID上?
提前致谢。 :)
答案 0 :(得分:4)
信息中心页面Manipulating binary strings in C++显示涉及的数据类型为ImqBinary
和MQBYTE24
。正如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问:
变量
id
是ImqBinary
而message
是ImqMessage
对象,据我所知id
不是ImqMessage
的成员messageId
,correlationId
,groupId
等等,怎么可能message.id()
在id
上传递了它的值?
{01}}是id
类型的声明变量而不是ImqBinary
类的成员,这是正确的。请参阅ImqBinary C++ class的信息中心页面,其中解释了:
此类封装了可用于的二进制字节数组 ImqMessage会计令牌,相关ID和消息ID值。它 允许轻松分配,复制和比较。
ImqMessage
类的目的是提供一个变量类型来封装具有重载方法的字节数组,以便“正常”变量操作按预期工作。不是一次一个字节地复制字节数组,而是在赋值中可以是ImqBinary
或LVAL
。您可以使用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 ++代码了,所以我的语法可能有问题或者没有像编码那样优雅,但你应该明白这一点。