控制消息上下文信息
使用 MQPUT 或 MQPUT1 调用将消息放入队列时,您可以指定队列管理器向消息描述符中添加某些缺省上下文信息。 拥有相应权限级别的应用程序可以添加额外的上下文信息。 您可以在 MQPMO 结构中使用 options 字段来控制上下文信息。
消息上下文信息允许检索消息的应用程序查找有关消息的发起方的信息。 所有上下文信息都存储在消息描述符的上下文字段中。 信息类型划分为身份信息、源信息和用户上下文信息。
要控制上下文信息,请在 MQPMO 结构中使用 Options 字段。
如果没有为上下文信息指定任何选项,那么队列管理器会使用其已为消息生成的身份和上下文信息覆盖消息描述符中可能已存在的上下文信息。 这与指定 MQPMO_DEFAULT_CONTEXT 选项的效果相同。 创建新消息时(例如,处理查询屏幕中的用户输入时),可能需要此缺省上下文信息。
如果不需要与消息关联的上下文信息,请使用 MQPMO_NO_CONTEX 选项。 放置没有上下文的消息时, IBM® MQ 进行的任何权限检查都是使用空白用户标识进行的。 不能为空白用户标识分配对 IBM MQ 资源的显式权限,但会将其视为特殊组 "无人" 的成员。 有关特殊组 nobody的更多详细信息,请参阅 可安装服务接口参考信息。
可以通过使用 MQOPEN 后跟 MQPUT,同时使用以下部分中指示的 MQOO_ 选项和 MQPMO_ 选项来执行上下文设置。 还可仅使用 MQPUT1 执行上下文设置,在此情况下,仅需要选择以下部分中指示的 MQPMO_ 选项。
此主题的以下部分说明了身份上下文、用户上下文和所有上下文的使用。
传递身份上下文
通常,程序应该在应用程序中消息之间传递身份上下文信息,直到数据到达其最终目标。
程序在每次更改数据时都应该更改源上下文信息。 但是,需要更改或设置任何上下文信息的应用程序必须具有相应的权限级别。 应用程序打开队列时,队列管理器会检查此权限;这些应用程序必须有权使用 MQOPEN 调用的相应上下文选项。
如果应用程序获取消息,处理消息中的数据,然后将更改的数据放置到其他消息中(可能供其他应用程序处理),那么应用程序必须将身份上下文信息从原始消息传递到新消息。 可以允许队列管理器创建源上下文信息。
要保存来自原始消息的上下文信息,请在打开队列以获取消息时使用 MQOO_SAVE_ALL_CONTEXT 选项。 还使用与 MQOPEN 调用配合使用的任何其他选项。 但是,请注意,如果仅浏览消息,那么无法保存上下文信息。
- 使用 MQOO_PASS_IDENTITY_CONTEXT 选项(以及 MQOO_OUTPUT 选项)打开队列。
- 在放置消息选项结构的
Context字段中,提供保存了其中上下文信息的队列的句柄。 - 在放置消息选项结构的
Options字段中,指定 MQPMO_PASS_IDENTITY_CONTEXT 选项。
传递用户上下文
无法选择仅传递用户上下文。 要在放置消息时传递用户上下文,请指定 MQPMO_PASS_ALL_CONTEXT。 用户上下文中任何属性以源上下文中相同的方式传递。
发生 MQPUT 或 MQPUT1 调用且传递上下文时,会将用户上下文中的所有属性从检索到的消息传递到放置消息。 放置应用程序已更改的任何用户上下文属性将使用其原始值进行放置。 放置应用程序已删除的任何用户上下文属性将在放置消息中复原。 将保留放置应用程序已添加到消息的任何用户上下文属性。
传递所有上下文
如果应用程序获取消息,将消息数据(未更改)放置到其他消息中,那么应用程序必须将所有上下文信息(身份、源和用户)从原始消息传递到新消息。 可执行此操作的应用程序示例为消息移动程序,其将消息从一个队列移动到另一个队列。
遵循与传递身份上下文相同的过程,不同之处在于使用 MQOPEN 选项 MQOO_PASS_ALL_CONTEXT 和放置消息选项 MQPMO_PASS_ALL_CONTEX。
设置身份上下文
- 使用 MQOO_SET_IDENTITY_CONTEXT 选项打开队列。
- 将消息放置到队列上,同时指定 MQPMO_SET_IDENTITY_CONTEXT 选项。 在消息描述符中,指定所需的任何身份上下文信息。
要修改任何消息上下文选项,必须具有相应权限来发出调用。 例如,要使用 MQOO_SET_IDENTITY_CONTEXT 或 MQPMO_SET_IDENTITY_CONTEXT,必须具有 +setid 许可权。
设置用户上下文
要在用户上下文中设置属性,请在执行 MQSETMP 调用时,将消息属性描述符 (MQPD) 的 Context 字段设置为 MQPD_USER_CONTEXT。
不需要任何特殊权限,即可在用户上下文中设置属性。 用户上下文没有 MQOO_SET_* 或 MQPMO_SET_* 上下文选项。
设置所有上下文
- 使用 MQOO_SET_ALL_CONTEXT 选项打开队列。
- 将消息放置到队列上,同时指定 MQPMO_SET_ALL_CONTEXT 选项。 在消息描述符中,指定所需的任何身份上下文信息和源上下文信息。