[IBM i]

IBM® i 上的转换处理

此信息描述队列管理器为响应 GMCONV 选项而执行的处理。

如果在 MQGET 调用上指定了 GMCONV 选项,并且存在要返回到应用程序的消息,那么队列管理器将执行以下操作:
  1. 如果满足以下一项或多项条件,那么无需进行转换:
    • 消息数据已包含在发出 MQGET 调用的应用程序所需的字符集和编码中。 在发出调用之前,应用程序必须将 MQGET 调用的 MSGDSC 参数中的 MDCSIMDENC 字段设置为必需值。
    • 消息数据的长度为零。
    • MQGET 调用的 BUFFER 参数的长度为零。
    在这些情况下,将返回消息而不转换为发出 MQGET 调用的应用程序; MSGDSC 参数中的 MDCSIMDENC 值将设置为消息中的控制信息中的值,并且调用将通过完成代码和原因码的下列其中一个组合来完成:
    完成代码
    原因码
    CCOK
    RCNONE
    CCWARN
    RC2079
    CCWARN
    RC2080

仅当消息数据的字符集或编码与 MSGDSC 参数中的相应值不同并且存在要转换的数据时,才会执行以下步骤:

  1. 如果消息中的控制信息中的 MDFMT 字段具有值 FMNONE ,那么将返回未转换的消息,完成代码为 CCWARN ,原因码为 RC2110。

    在所有其他情况下,将继续进行转换处理。

  2. 将从队列中除去该消息,并将其放入与 BUFFER 参数大小相同的临时缓冲区中。 对于浏览操作,消息将复制到临时缓冲区中,而不是从队列中除去。
  3. 如果必须截断消息以适合缓冲区,那么将执行以下操作:
    • 如果未指定 GMATM 选项,那么将返回未转换的消息,完成代码为 CCWARN ,原因码为 RC2080。
    • 如果指定了 GMATM 选项 ,那么完成代码将设置为 CCWARN ,原因码将设置为 RC2079,并且转换处理将继续。
  4. 如果可以在缓冲区中容纳消息而不截断,或者指定了 GMATM 选项,那么将执行以下操作:
    • 如果格式是内置格式,那么会将缓冲区传递到队列管理器的数据转换服务。
    • 如果格式不是内置格式,那么会将缓冲区传递到与格式同名的用户编写的出口。 如果找不到出口,那么将返回未转换的消息,完成代码为 CCWARN ,原因码为 RC2110。

    如果未发生错误,那么来自数据转换服务或用户编写的出口的输出是已转换的消息,以及要返回到发出 MQGET 调用的应用程序的完成代码和原因码。

  5. 如果转换成功,那么队列管理器会将转换后的消息返回给应用程序。 在这种情况下, MQGET 调用返回的完成代码和原因码通常将是下列其中一个组合:
    完成代码
    原因码
    CCOK
    RCNONE
    CCWARN
    RC2079
    但是,如果转换由用户编写的出口执行,那么即使转换成功,也可以返回其他原因码。

    如果转换失败 (无论出于何种原因) ,队列管理器会将未转换的消息返回到应用程序,并且 MSGDSC 参数中的 MDCSIMDENC 字段设置为消息中控制信息中的值,并且具有完成代码 CCWARN。