选择器
消息选择器是长度可变的字符串,由应用程序用来仅注册某些消息,这些消息的属性满足选择字符串所表示的结构化查询语言 (SQL) 查询。
使用 MQSUB 和 MQOPEN 函数调用的选择
使用 MQCHARV 类型结构的 SelectionString 来通过 MQSUB 和 MQOPEN 调用进行选择。
SelectionString 结构用于将长度可变的选择字符串传递到队列管理器。
与选择器字符串关联的 CCSID 通过 MQCHARV 结构的 VSCCSID 字段设置。 使用的值必须是选择器字符串支持的 CCSID。 请参阅 代码页转换 以获取受支持代码页的列表。
指定不支持 IBM® MQ Unicode 转换的 CCSID 会导致 MQRC_SOURCE_CCSID_ERROR 错误。 此错误在选择器提交到队列管理器时返回,即进行 MQSUB、MQOPEN 或 MQPUT1 调用时。
VSCCSID 字段的缺省值为 MQCCSI_APPL,表示选择字符串的 CCSID 等于队列管理器 CCSID,或等于客户机 CCSID(如果通过客户机连接)。 但是,编译之前,应用程序可通过重新定义来覆盖 MQCCSI_APPL 常量。
如果 MQCHARV 选择器表示 NULL 字符串,那么不会为该消息使用者进行任何选择,并且会像不使用选择器一样发送消息。
选择字符串的最大长度只受限于 MQCHARV 字段 VSLength 可以描述的内容。
如果您已提供缓冲区并且 VSBufSize 缓冲区长度为正,将使用 MQSO_RESUME 订阅选项在 MQSUB 调用的输出中返回 SelectionString。 如果您不提供缓冲区,那么 MQCHARV 的 VSLength 字段中只会返回选择字符串的长度。 如果提供的缓冲区小于返回字段所需的空间,那么只有 VSBufSize 字节会返回到提供的缓冲区。
- MQOPEN
- 使用 MQCLOSE 关闭打开的句柄,然后在后续 MQOPEN 调用上指定新的选择字符串。
- MQSUB
- 使用 MQCLOSE 关闭返回的预订句柄 (hSub),然后在后续 MQSUB 调用上指定新的选择字符串。

通过使用 MQSD 结构中的 SelectionString 字段,选择器可以在 MQSUB 调用中进行传递。 在 MQSUB 上传递选择器的结果是只有那些发布到预订主题且与提供的选择字符串匹配的消息才能在目标队列上使用。

通过使用 MQSD 结构中的 SelectionString 字段,选择器可以在 MQOPEN 调用上传递。 在 MQOPEN 调用上传递选择器的结果是只有那些位于打开队列上且与选择器匹配的消息会发送给消息使用者。
选择器在 MQOPEN 调用上的主要用途是针对点到点情况,这种情况下,应用程序可以选择只接收那些与选择器匹配的队列上的消息。 上述示例展示了一个简单的场景,即两条消息放入一个由 MQOPEN 打开的队列,但获取这些消息的应用程序只接收到一条消息,因为这是唯一一个与选择器匹配的消息。
请注意,后续 MQGET 调用结果为 MQRC_NO_MSG_AVAILABLE,因为与给定选择器匹配的队列上不存在其他消息。