将 EBCDIC NL 转换为 ASCII CR LF

本主题描述了一个示例任务,该任务将文本消息中的新建行(NL)字符更改为回车(CR)和换行(LF)字符对。

将消息从 EBCDIC 平台(例如使用 CCSID 1047)发送到 ASCII 平台(例如使用 CCSID 437)时,这种转换可能会有用。由于 EBCDIC NL 字符十六进制“15”转换为未定义的 ASCII 字符十六进制“7F”,可能会发生问题。在 ASCII 代码页中 NL 字符没有对应的代码点。

在此示例中,创建将输入消息解释为 BLOB 域中的消息的消息流。此消息流传递到 ResetContentDescriptor 节点,从而将数据重置复为 MRM 域中的消息。该消息称为 msg_nl(EBCDIC NL 字符分隔的一组重复字符串元素)。然后,根据 MRM 域中称为 msg_crlf(以 CR LF 字符对分隔的一组重复字符串元素)的另一条消息使用 Compute 节点创建输出。接下来,在另一个 ResetContentDescriptor 节点中将消息域更改回 BLOB。下图说明了此消息流。


此图显示了由以下节点组成的线形消息流:MQInput1 通过 Out 终端连接到 ResetContentDescriptor1,然后通过 Out 终端连接到 Compute1,接下来使用 Out 终端连接到 ResetContentDescriptor2,最后使用 Out 终端连接到 MQOutput1。没有连接任何其他终端。

以下指示信息显示了如何创建并配置消息流。

  1. 创建 MRM 域中消息的消息模型:
    1. 创建名为 myProj 的消息集项目。
    2. 创建具有 TDS 物理格式(缺省名为 TDS1)的称为 myMessageSet 的消息集。
    3. 创建 xsd:string 类型的元素 string1。
    4. 创建一个名为 t_msg_nl 的复杂类型并指定以下复杂类型属性:
      • 组成 = Ordered Set
      • 内容验证 = Closed
      • 数据元素分隔 = All Elements Delimited
      • 定界符 = <U+0085>(十六进制“0085”是 NL 字符的 UTF-16 表示)
      • 重复 = Yes
      • 最小出现次数 = 1
      • 最大出现次数 = 50(假设消息文本由不超过 50 行组成)
    5. 添加元素 string1 并设置以下属性:
      • 重复元素定界符 = <U+0085>
    6. 创建消息 msg_nl 并将其关联的复杂类型设置为 t_msg_nl
    7. 创建名为 t_msg_crlf 的复杂类型并指定以下复杂类型属性:
      • 组成 = Ordered Set
      • 内容验证 = Closed
      • 数据元素分隔 = All Elements Delimited
      • 定界符 <CR><LF>(<CR> 和 <LF> 是 CR 和 LF 字符的助记符)
      • 重复 = Yes
      • 最小出现次数 = 1
      • 最大出现次数 = 50
    8. 添加元素 string1 并设置以下属性:
      • 重复元素定界符 = <CR><LF>
    9. 创建消息 msg_crlf 并将复杂类型设置为 t_msg_crlf
  2. 配置上图中显示的消息流:
    1. 从 MQInput1 节点开始:
      • 设置消息域 = BLOB
      • 设置队列名 = <您的输入消息队列名>
    2. 添加 ResetContentDescriptor1 节点,它连接到 MQInput1 的 out 终端:
      • 设置消息域 = MRM
      • 选择重置消息域
      • 设置消息集 = <您的消息集标识>(最多 13 个字符)
      • 选择重置消息集
      • 设置消息类型 = msg_nl
      • 选择重置消息类型
      • 设置消息格式 = TDS1
      • 选择重置消息格式
    3. 添加 Compute1 节点,它连接到 ResetContentDescriptor1 的 out 终端:
      • 为此节点输入 ESQL 模块的名称,或接受缺省值(<消息流名称>_Compute1)。
      • 右键单击 Compute1 节点并选择打开 ESQL。在模块中编写以下 ESQL 的代码:
        -- Declare local working variables
        DECLARE I INTEGER 1;
        DECLARE J INTEGER CARDINALITY(InputRoot.*[]);
        
        -- Loop to copy all message headers from input to output message
        WHILE I < J DO
         SET OutputRoot.*[I] = InputRoot.*[I];
         SET I=I+1;
        END WHILE;
        
        -- Set new output message type which uses CRLF delimiter
        SET OutputRoot.Properties.MessageType = 't_msg_crlf';
        
        -- Loop to copy each instance of string1 child within message body
        SET I = 1;
        SET J = CARDINALITY("InputBody"."string1"[]);
        WHILE I <= J DO
          SET "OutputRoot"."MRM"."string1"[I] = "InputBody"."string1"[I];
          SET I=I+1;
        END WHILE;

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

        WHILE I < CARDINALITY(InputRoot.*[]) DO
    4. 添加 ResetContentDescriptor2 节点,它连接到 Compute1 节点的 out 终端:
      • 设置消息域 = BLOB
      • 选择重置消息域
    5. 最后,添加 MQOutput1 节点,它连接到 ResetContentDescriptor2 节点的输出端。将它的属性配置为使输出消息指向必需的队列。
相关概念
消息流概述
ESQL 概述
消息建模
相关任务
设计消息流
定义消息流内容
管理 ESQL 文件
相关参考
本地语言支持
Compute 节点
MQInput 节点
MQOutput 节点
ResetContentDescriptor 节点
ESQL 引用
DECLARE 语句
SET 语句
WHILE 语句
TDS 助记符
声明 | 商标 | 下载 | 书库 | 支持 | 反馈
Copyright IBM Corporation 1999, 2006 最后一次更新时间:2006/08/14
ac11630_