使用 MQPUT1 调用将一条消息放置到队列上

如果希望在将单条消息放置到队列上后立即关闭队列,请使用 MQPUT1 调用。 例如,服务器应用程序在向各个队列发送回复时,可能会使用 MQPUT1 调用。

MQPUT1 的功能相当于调用 MQOPEN 后跟 MQPUT 后跟 MQCLOSE 的功能。 MQPUT 和 MQPUT1 调用的语法唯一区别是,对于 MQPUT ,指定对象句柄,而对于 MQPUT1 ,指定 MQOPEN 中定义的对象描述符结构 (MQOD) (请参阅 标识对象 (MQOD 结构) )。 这是因为您需要向 MQPUT1 调用提供有关其必须打开的队列的信息,而当您调用 MQPUT 时,该队列必须已打开。

作为 MQPUT1 调用的输入,必须提供:
  • 连接句柄。
  • 要打开的对象的描述。 这采用了对象描述符结构 (MQOD) 的形式。
  • 要放置到队列上的消息的描述。 此消息采用消息描述符结构 (MQMD) 的形式。
  • 控制信息,采用放置消息选项结构 (MQPMO) 的形式。
  • 消息中包含的数据的长度 (MQLONG)。
  • 消息数据的地址。
MQPUT1 的输出为:
  • 完成代码
  • 原因码

如果调用成功完成,那么还会返回选项结构以及消息描述符结构。 调用修改选项结构以显示要向其发送消息的队列的名称和队列管理器的名称。 如果请求队列管理器为将放置的消息的标识生成唯一值(通过在 MQMD 结构的 MsgId 字段中指定二进制零),那么调用会先在 MsgId 字段中插入值,再向您返回此结构。

注: 不能将 MQPUT1 与模型队列名称配合使用; 但是,打开模型队列后,可以向动态队列发出 MQPUT1 。
MQPUT1 的六个输入参数为:
Hconn
这是连接句柄。 对于 CICS® 应用程序,可以指定常量 MQHC_DEF_HCONN (值为零) ,或者使用 MQCONN 或 MQCONNX 调用返回的连接句柄。 对于其他程序,始终使用 MQCONN 或 MQCONNX 调用返回的连接句柄。
ObjDesc
这是对象描述符结构 (MQOD)。

ObjectNameObjectQMgrName 字段中,提供希望在其上放置消息的队列的名称以及拥有此队列的队列管理器的名称。

针对 MQPUT1 调用,将忽略 DynamicQName 字段,因为此调用无法使用模型队列。

如果希望指定将用于测试打开队列的权限的备用用户标识,请使用 AlternateUserId 字段。

MsgDesc
这是消息描述符结构 (MQMD)。 与 MQPUT 调用一样,使用此结构定义将放置到队列上的消息。
PutMsgOpts
这是放置消息选项结构 (MQPMO)。 将其用于 MQPUT 调用 (请参阅 使用 MQPMO 结构指定选项 )。

Options 字段设置为零时,队列管理器会使用您自己的用户标识对访问队列的权限执行测试。 此外,队列管理器会忽略 MQOD 结构的 AlternateUserId 字段中提供的任何备用用户标识。

BufferLength
这是消息的长度。
Buffer
这是包含消息文本的缓冲区区域。

使用集群时,MQPUT1 会运行,好像 MQOO_BIND_NOT_FIXED 已生效。 应用程序必须使用 MQPMO 结构而不是 MQOD 结构中的解析字段来确定消息的发送位置。 请参阅 配置队列管理器集群 以获取更多信息。

MQPUT1中提供了 MQPUT1 调用的描述。