![[UNIX、Linux、Windows、IBM i]](ngmulti.gif)
按队列管理器分段和组装
这是最简单的场景,在此场景中一个应用程序会放入将由另一个应用程序检索的消息。 消息可能会很大:对于要在单个缓冲区中处理消息的放入或获取应用程序不太大,但对于要放入消息的队列管理器或队列则过大。
这些应用程序所需的唯一更改是在需要时,使放入应用程序授权队列管理器执行分段:
PMO.Options = (existing options)
MD.MsgFlags = MQMF_SEGMENTATION_ALLOWED
MD.Version = MQMD_VERSION_2
memcpy(MD.GroupId, MQGI_NONE, MQ_GROUP_ID_LENGTH)
MQPUT
使获取应用程序在已对消息分段时,请求队列管理器重新汇编消息: GMO.Options = MQGMO_COMPLETE_MSG | (existing options)
MQGET
在这一最简单的场景中,应用程序必须在调用 MQPUT 前将 GroupId 字段重置为 MQGI_NONE,以便队列管理器能够为每条消息生成唯一的组标识。 如果没有这样做,那么无关的消息可能具有相同的组标识,这可能会导致后续处理不正确。
应用程序缓冲区必须足够大,能够包含重新汇编的消息(除非包含 MQGMO_ACCEPT_TRUNCATED_MSG 选项)。
如果将修改队列的 MAXMSGLEN 属性以支持消息分段,请考虑:
- 本地队列上支持的最小消息段为 16 个字节。
- 对于传输队列,MAXMSGLEN 还必须包含头所需的空间。 考虑在可以放在传输队列上的任何消息段中,使用至少大于用户数据的最大预期长度 4000 个字节的值。
如果需要进行数据转换,那么获取应用程序可能必须要通过指定 MQGMO_CONVERT 来完成转换。 这一过程应当是简单的,因为完整的消息提供了数据转换出口。 如果将消息分段,并且数据格式导致数据转换出口无法对不完整数据执行转换,那么请勿尝试在发送方通道中转换数据。