【发布时间】:2019-09-17 15:40:05
【问题描述】:
我正在尝试将 IBM MQ 客户端 9 与 C++ 一起使用。我只想阅读组 id 为“2”的邮件。我已经尝试了一切,但它只是不起作用。有人可以帮忙吗?
我尝试设置 groupId 和 flag 以匹配组。
MQGET
gmoptions.setMatchOptions(MQMO_MATCH_GROUP_ID);
MQBYTE24 bGroupId("2");
ImqBinary _groupId;
_groupId.set(bGroupId, sizeof(bGroupId));
message.setGroupId(_groupId);
q->get(message, gmoptions);
MQPUT
MQBYTE24 bGroupId("2");
ImqBinary _groupId;
_groupId.set(bGroupId, sizeof(bGroupId));
message.setGroupId(_groupId);
ImqPutMessageOptions pmo;
pmo.setOptions(MQPMO_LOGICAL_ORDER);
pmo.setRecordFields(MQPMRF_GROUP_ID);
q->put(message, pmo);
mqget 应该能够获取 groupId "2" 的所有 msg,但它不能。虽然它可以在我删除 setMatchOptions 后立即读取消息。
基本上,我想使用组 ID 作为过滤器,其中服务器实例 1 将仅读取组 1 中的消息,服务器实例 2 将仅读取组 2 中的消息,依此类推,而不是为每个服务器实例创建单独的队列。
如果组 id 仅用于批处理而不是过滤,但不确定如何在 C++ 中“使用 MQSUB 和 MQOPEN 函数调用进行选择”,可能会帮助我 https://www.ibm.com/support/knowledgecenter/SSFKSJ_9.0.0/com.ibm.mq.dev.doc/q022990_.htm
有没有 MQSETMP 的 C++ 等价物?我在 ImqQueue 或 ImqObject 中找不到任何可以让我设置消息属性或 selectionString 的接口。
【问题讨论】:
-
您能否使用
amqsbcg示例程序浏览groupId "2" 的消息并提供GroupId行的输出,它可能类似于GroupId : X'000000000000000000000000000000000000000000000000'。 -
通常此字段与队列管理器一起使用是自动分段消息(例如:设置消息标志
MQMF_SEGMENTATION_ALLOWED。每个唯一消息组的消息将具有唯一的组 ID 以及每个消息具有序列号(例如:1、2、3)和整个消息中的偏移量,组中的最后一条消息将带有一个标志,指示它是最后一条消息。 -
应用程序也可以使用它来创建消息组。但正如您指出的那样,它是一个 24 字节字段,您只是将其设置为 ascii 字符“2”的字节值。
-
C++ 不支持发布订阅。看到这个答案stackoverflow.com/questions/57101776/…
-
要回答您的最新更新,请参阅我提供的链接。 C++ 类已稳定在 v6 级别,并且从 7.0 或更高版本起没有进行任何增强。消息属性是在 7.0 中添加的。您需要使用 C API 来使用这些功能。你有什么理由不回复我要离开你的cmets?