转换代码页和消息编码

您可以在 Compute 节点中使用 ESQL 转换数据,用于对代码页和消息进行编码。如果您的消息流正在处理 WebSphere MQ 消息,则您可以使用 WebSphere MQ 工具(包括取出和放入选项和 WebSphere MQ 数据转换出口)以提供这些转换。如果您不在处理 WebSphere MQ 消息,或者选择不使用 WebSphere MQ 工具,则可以通过在消息流中的 Compute 节点上编写合适的 ESQL 代码来使用 WebSphere Message Broker 工具。

MQMD、MQRFH2 的内容和已用 CWF 物理格式构建模型的 MRM 域中的消息的消息体服从代码页和编码转换。XML、XMLNS 和 JMS 域中的消息和在已用 XML 或 TDS 物理格式构建模型的 MRM 域中的消息的消息体的内容被作为字符串对待。仅代码页转换适用,不需要进行编码转换。

对于以 CWF 物理格式建模的 MRM 域中的消息,可以将输出消息的 MQMD CCSID 和 Encoding 字段以及任何其他头的 CCSID 和 Encoding 字段设置为所需的目标值。

对于用 XML 或 TDS 物理格式构建模型的 MRM 域中的消息,您可以设置输出消息的 MQMD CCSID 字段以及任何其他头的 CCSID 字段。XML 和 TDS 数据作为字符串处理,因此仅取决于 CCSID 转换。

示例 WebSphere MQ 消息有 MQMD 头、MQRFH2 头和消息体。要将此消息转换为大型机 CodedCharSetId 和 Encoding,请在 Compute 节点中对以下 ESQL 进行编码:

SET OutputRoot.MQMD.CodedCharSetId = 500;
SET OutputRoot.MQMD.Encoding = 785;
SET OutputRoot.MQRFH2.CodedCharSetId = 500;
SET OutputRoot.MQRFH2.Encoding = 785;

以下示例说明了修改 CWF 消息,以便可以将其从 WebSphere Message Broker 传递到 z/OS 上的 IMS™ 的必需操作。

  1. 您已定义了 XML 格式的输入消息且使用 MQRFH2 头。请除去消息的头之后再将它传递到 IMS。
  2. 传递到 IMS 的消息必须具有 MQIIH 头,且必须以 z/OS 代码集表示。 此消息在 MRM 中建模并具有名称 IMS1。将该消息中的 PIC X 字段定义为用于要发生 EBCDIC 和 ASCII 之间的转换的逻辑类型字符串。如果它们是逻辑类型二进制,将不发生数据转换;当 MRM 解析器解析 CWF 消息时忽略二进制数据。
  3. 在 MRM 中也定义了从 IMS 收到的消息,该消息名为 IMS2。 将该消息中的 PIC X 字段定义为用于要发生 EBCDIC 和 ASCII 之间的转换的逻辑类型字符串。如果它们是逻辑类型二进制,将不发生数据转换;当 MRM 解析器解析 CWF 消息时忽略二进制数据。
  4. 将应答消息转换为 Windows 代码页。 在此消息中保留 MQIIH 头。
  5. 您已经创建了包含以下节点的消息流: :
    1. 出站流 MQInput1 --> Compute1 --> MQOutput1
    2. 入站流 MQInput2 --> Compute2 --> MQOutput2
  6. 如下所示,在 Compute1(出站)节点中对 ESQL 进行编码,指定相关的消息集标识。 该代码显示缺省 CWF 物理层名称的使用。必须使用与模型定义相匹配的名称。如果指定了不正确的值,则代理失败并发出消息 BIP5431
    -- Loop to copy message headers
    DECLARE I INTEGER 1;
    DECLARE J INTEGER CARDINALITY(InputRoot.*[]);
    
    WHILE I < J - 1 DO
      SET OutputRoot.*[I] = InputRoot.*[I];
      SET I=I+1;
    END WHILE;
    
    SET OutputRoot.MQMD.CodedCharSetId = 500;
    SET OutputRoot.MQMD.Encoding = 785;
    SET OutputRoot.MQMD.Format = 'MQIMS   ';
    SET OutputRoot.MQIIH.StrucId = 'IIH ';
    SET OutputRoot.MQIIH.Version = 1;
    SET OutputRoot.MQIIH.StrucLength = 84;
    SET OutputRoot.MQIIH.Encoding = 785;
    SET OutputRoot.MQIIH.CodedCharSetId = 500;
    SET OutputRoot.MQIIH.Format = 'MQIMSVS ';
    SET OutputRoot.MQIIH.Flags = 0;
    SET OutputRoot.MQIIH.LTermOverride = '        ';
    SET OutputRoot.MQIIH.MFSMapName = '        ';
    SET OutputRoot.MQIIH.ReplyToFormat = 'MQIMSVS ';
    SET OutputRoot.MQIIH.Authenticator = '        ';
    SET OutputRoot.MQIIH.TranInstanceId = X'00000000000000000000000000000000';
    SET OutputRoot.MQIIH.TranState = ' ';
    SET OutputRoot.MQIIH.CommitMode = '0';
    SET OutputRoot.MQIIH.SecurityScope = 'C';
    SET OutputRoot.MQIIH.Reserved = ' ';
    SET OutputRoot.MRM.e_elen08 = 30;
    SET OutputRoot.MRM.e_elen09 = 0;
    SET OutputRoot.MRM.e_string08 = InputBody.e_string01;
    SET OutputRoot.MRM.e_binary02 = X'31323334353637383940';
    SET OutputRoot.Properties.MessageDomain = 'MRM';
    SET OutputRoot.Properties.MessageSet = 'DHCJOEG072001';
    SET OutputRoot.Properties.MessageType = 'IMS1';
    SET OutputRoot.Properties.MessageFormat = 'CWF1';

    请注意变量 J 的使用,它初始化到消息中现有头的基数值。这比计算循环的每个迭代的基数更有效,如果您编写以下 WHILE 语句则会进行这种计算:

    WHILE I < CARDINALITY(InputRoot.*[]) DO
  7. 如下所示,在 Compute2(入站)节点中创建 ESQL,指定相关的消息集标识。 该代码显示缺省 CWF 物理层名称的使用。必须使用与模型定义相匹配的名称。如果指定了不正确的值,则代理失败并发出消息 BIP5431
    -- Loop to copy message headers
    DECLARE I INTEGER 1;
    DECLARE J INTEGER CARDINALITY(InputRoot.*[]);
    
    WHILE I < J DO
      SET OutputRoot.*[I] = InputRoot.*[I];
      SET I=I+1;
    END WHILE;
    
    SET OutputRoot.MQMD.CodedCharSetId = 437;
    SET OutputRoot.MQMD.Encoding = 546;
    SET OutputRoot.MQMD.Format = 'MQIMS   ';
    SET OutputRoot.MQIIH.CodedCharSetId = 437;
    SET OutputRoot.MQIIH.Encoding = 546;
    SET OutputRoot.MQIIH.Format = '        ';
    SET OutputRoot.MRM = InputBody;
    SET OutputRoot.Properties.MessageDomain = 'MRM';
    SET OutputRoot.Properties.MessageSet = 'DHCJOEG072001';
    SET OutputRoot.Properties.MessageType = 'IMS2';
    SET OutputRoot.Properties.MessageFormat = 'CWF1';

您无须为 MQInput1 节点属性设置任何具体值,因为在 MQRFH2 头中消息和消息集是确定的,不需要任何转换。

您必须为入站消息流(MQInput2)的 MQInput 节点中的消息域、集、类型和格式设置值。您不需要设置转换参数。

一个特定的您可能需要将数据从一个代码页转换到另一个的情况是当消息包含新行指示符且正在 EBCDIC 和 ASCII 系统之间传递的时候。在将 EBCDIC NL 转换为 ASCII CR LF中描述了针对此情况必需的转换。

相关概念
消息流概述
ESQL 概述
消息建模
相关任务
设计消息流
定义消息流内容
管理 ESQL 文件
相关参考
本地语言支持
Compute 节点
Database 节点
Filter 节点
ESQL 引用
CARDINALITY 函数
DECLARE 语句
SET 语句
WHILE 语句
支持的代码页
声明 | 商标 | 下载 | 书库 | 支持 | 反馈
Copyright IBM Corporation 1999, 2006 最后一次更新时间:2006/08/14
ac11620_