编写数据转换出口

此主题集合包含了有关如何编写数据转换出口的信息。

注: 在 VSE/ESA的 MQSeries® 中不受支持。

执行 MQPUT 时,应用程序会创建消息的消息描述符 (MQMD)。 由于 IBM® MQ 需要能够了解 MQMD 的内容,而不考虑它是在哪个平台上创建的,因此系统会自动对其进行转换。

但是,无法自动转换应用程序数据。 如果字符数据正在 CodedCharSetIdEncoding 字段不同的平台之间进行交换(例如,ASCII 和 EBCDIC 之间),应用程序必须安排消息的转换。 队列管理器自身或用户出口程序可以执行应用程序数据转换,并将其称为数据转换出口。 如果应用程序数据为某种内置格式(如 MQFMT_STRING),那么队列管理器可以使用某个内置的转换例程自行执行数据转换。 本主题包含有关 IBM MQ 在应用程序数据未采用内置格式时提供的数据转换出口工具的信息。

在 MQGET 调用期间,可以将控制传递给数据转换出口。 这避免了在到达最终目标之前跨多个不同平台进行转换。 但是,如果最终目标是一个不支持在 MQGET 上进行数据转换的平台,那么您必须在将数据发送至其最终目标的发送方通道上指定 CONVERT(YES)。 这将确保 IBM MQ 在传输期间转换数据。 在这种情况下,数据转换出口必须位于已定义发送方通道的系统上。

MQGET 调用由应用程序直接发布。 将 MQMD 中的 CodedCharSetIdEncoding 字段设置为所需的字符集和编码。 如果应用程序使用与队列管理器相同的字符集和编码,那么将 CodedCharSetId 设置为 MQCCSI_Q_MGR,并将 Encoding 设置为 MQENC_NATIVE。 在 MQGET 调用完成之后,这些字段便具有了与返回的消息数据相应的值。 如果转换不成功,这些值可能与所需的值不同。 应用程序应将这些字段重置为每次调用 MQGET 之前所需的值。

要调用的数据转换出口所需的条件是针对 MQGET中的 MQGET 调用定义的。

有关传递到数据转换出口的参数的描述以及详细的用法说明,请参阅 MQ_DATA_CONV_EXIT 调用和 MQDXP 结构的 数据转换

在不同机器编码和 CCSID 之间转换应用程序数据的程序必须符合 IBM MQ 数据转换接口 (DCI)。

对于多点广播客户机,API 出口和数据转换出口必须能够在客户端上运行,这是因为某些消息可能无法通过队列管理器。 以下库属于客户机包和服务器包:
表 1. 位于客户机包和服务器包中的库
操作系统
[AIX]AIX® 32 位及 64 位:libmqm.a 和 libmqm_r.a
[IBM i]IBM i LIBMQM 和 LIBMQM_R
[Linux]Linux® 32 位及 64 位:libmqm.so 和 libmqm_r.so
[Windows]Windows 32 位及 64 位:mqm.dll 和 mqm.pdb