使用主题字符串
根据主题对象中标识的子主题以及应用程序提供的子主题来构造主题。 您可以使用子主题作为主题名称,也可以将其组合以形成新的主题名称。
在 MQI 程序中,完整主题名称由 MQOPEN创建。 它由发布/预订 MQI 调用中使用的两个字段组成,按列出的顺序:
- 主题对象的 TOPICSTR 属性,在 ObjectName 字段中指定。
- 定义应用程序提供的子主题的 ObjectString 参数。
生成的主题字符串将在 ResObjectString 参数中返回。
如果每个字段的第一个字符不是空白或空字符,并且字段长度大于零,那么这些字段被视为存在。 如果仅存在其中一个字段,那么将其用作主题名称。 如果两个字段都没有值,那么调用将失败,原因码为 MQRC_UNKNOWN_OBJECT_NAME 或 MQRC_TOPIC_STRING_ERROR (如果完整主题名称无效)。
如果两个字段都存在,那么 " / ' 在生成的组合主题名称的两个元素之间插入字符。
表 1 显示了主题字符串并置的示例:
| TOPICSTR | ObjectString | 完整主题名称 | 注释 |
|---|---|---|---|
| 足球/苏格兰人 | '' |
足球/苏格兰人 | TOPICSTR 单独使用 |
'' |
足球/苏格兰人 | 足球/苏格兰人 | 单独使用 ObjectString |
| 美式足球 | 评分 | 足球/苏格兰人 | 在并置点添加 "/" 字符 |
| 美式足球 | /得分 | 足球//苏格兰人 | 在两个字符串之间生成 "空节点" |
| /足球 | 评分 | /足球/苏格兰人 | 主题以 "空节点" 开头 |
' / ' 字符被视为特殊字符,为 主题树中的完整主题名称提供结构,并且由于主题树的结构受到影响,不得用于任何其他原因。 主题 " /Football " 与话题不一样 " Football "。
以下通配符是特殊字符:
- 加号 '
+' - 数字符号 '
#' - 星号 '
*' - 问号 '
?'
# ' 或 ' + ' 与主题级别中的其他字符 (包括自身) 混合,可以使用任一通配符方案进行预订。 使用 " # ' 或 ' + ' 作为两个 ' 之间的唯一字符 / ' 字符生成无法由应用程序使用通配符方案 MQSO_WILDCARD_TOPIC 显式预订的主题字符串。 这种情况会导致应用程序获得比预期更多的发布。示例代码片段
从示例程序 Example 2: Publisher to a variable topic中抽取的此代码片段将主题对象与变量主题字符串组合在一起。MQOD td = {MQOD_DEFAULT}; /* Object Descriptor */
td.ObjectType = MQOT_TOPIC; /* Object is a topic */
td.Version = MQOD_VERSION_4; /* Descriptor needs to be V4 */
strncpy(td.ObjectName, topicName, MQ_TOPIC_NAME_LENGTH);
td.ObjectString.VSPtr = topicString;
td.ObjectString.VSLength = (MQLONG)strlen(topicString);
td.ResObjectString.VSPtr = resTopicStr;
td.ResObjectString.VSBufSize = sizeof(resTopicStr)-1;
MQOPEN(Hconn, &td, MQOO_OUTPUT | MQOO_FAIL_IF_QUIESCING, &Hobj, &CompCode, &Reason);