迁移消息映射的限制

某些情况下不支持对 .mfmap 文件的迁移。本主题解释了在这些情况下不能自动进行迁移的原因,并提供了成功完成迁移的指示信息。

消息映射的编程模型在 V5.0(其中文件格式为 .mfmap)和 V6.0(其中格式为 .msgmap)中有所不同。V5.0 消息映射有一个过程化编程模型,它实际上是另一个 ESQL,在其中您描述执行转换所需的所有步骤。V6.0 使用声明式的编程模型,在其中您描述转换的结果,以及决定如果获得该结果的工具。

大多数迁移失败的原因是,消息映射包含了太多关于执行转换的步骤的信息,而没有提供所需结果的足够信息。对于这些消息映射,通过更改 .mfmap 文件可以启用迁移,这样特定的“如何”部分就会分组到消息映射可以调用的 ESQL 函数或过程中。.mfmap 文件调用 ESQL,而不是将它包含为一个表达式。然后 mqsimigratemfmaps 命令将迁移 .mfmap 文件,但是它将调用 ESQL,而不是记录迁移错误。

有一个限制是,ESQL(.mfmap 和 .msgmap 文件的运行时)不能定义返回复杂元素(或 REFERENCE)值的函数。以下过程解释了如何解决这个复杂元素目标限制;在许多情况下,它意味着必须将映射重写为 ESQL。有关从映射调用 ESQL 的更多示例和信息,请参阅帮助 > 标本收藏夹 > 技术示例 > 消息代理 > 消息映射中的 WebSphere Message Brokers 映射示例。

  1. 确定您是否可以定义 .mfmap 文件的 ESQL 函数。
    1. 当目标值是复杂元素,或在 ESQL 中是 REFERENCE 时,必须重写 .msgmap 文件中的个别映射。从 .mfmap 文件中删除映射,然后继续执行第 4 步。
    2. 为以下所有其他情况使用函数:CHAR 字符串、数字、日期和时间。继续第 2 步。
  2. 确定函数的源参数和返回类型。
    1. 对于映射中的每个源路径,函数或过程中必须有一个参数。对于函数,所有参数都是不可更改的。参数的类型必须匹配源数据类型。
    2. 函数的返回类型是以上所标识的 ESQL 数据类型。
  3. 更新 .mfmap 文件来启用迁移。更改 .mfmap 文件来调用映射中的函数,并按照在第 2a 步中列出的顺序将源参数传递到函数中。
  4. 重新运行 mqsimigratemfmaps 命令来迁移已更改的 .mfmap 文件。
  5. 重复第 1 至第 4 步,直到迁移日志中没有错误为止。
  6. 启动 V6.0 Message Brokers Toolkit,并打开已迁移的 .msgmap 文件。
    1. 对于作为函数迁移的 ESQL,应该没有任何错误。
    2. 对于复杂元素目标,使用 V6.0 功能重写映射。
以下示例说明了从 .mfmap 文件到 .msgmap 文件的迁移。
  • 要迁移重复源表达式的多个引用:
    src_msg.e[1] + src_msg.e[2]
    使用 ESQL 函数来计算结果,如:
    CREATE FUNCTION addOneAndTwo(IN src_msg)
    BEGIN
    	RETURN src_msg.e[1] + src_msg.e[2]; 	
    END;
    在 .msgmap 文件中,将父元素 src_msg 用作参数来调用 ESQL 函数 addOneAndTwo。

  • 不使用元素名称的表达式:
    src_msg.*
    src_msg.*[]  	
    可以由使用重复字段父元素的函数来处理:
    CREATE FUNCTION processAny(IN src_msg)
    BEGIN 		
    DECLARE nodeRef REFERENCE TO src_msg.e.*;
    DECLARE result <dataType> <initialValue>;
    	WHILE LASTMOVE nodeRef DO 			
    		--expression goes here 			
    		SET result = result; 		
    	END WHILE; 		
    	RETURN RESULT; 	
    END;
    在 .msgmap 文件中,将父元素 src_msg 用作参数来调用 ESQL 函数。

  • 动态计算元素名称的表达式:
    src_msg.{'a' || 'b'}
    可以由处理重复字段父元素的 ESQL 函数来处理:
    CREATE FUNCTION processDynamicName(IN src_msg)
    BEGIN 		
    	RETURN src_msg.{'a' || 'b'}; 	
    END;
    在 .msgmap 文件中,将父元素 src_msg 用作参数来调用 ESQL 函数。

  • 使用选择 MIN、MAX 和 COUNT 函数的表达式:
    SELECT MAX("#T".FIRSTNAME)
    FROM Database.CUSTOMER AS "#T"
    WHERE "#T".CUSTOMERID = custId
    可以由处理重复字段父元素的 ESQL 函数来处理:
    CREATE FUNCTION processMAX(IN custId)
    BEGIN 		
    	RETURN  			
    SELECT MAX("#T".FIRSTNAME)
    FROM Database.CUSTOMER AS "#T"
    WHERE "#T".CUSTOMERID = custId
    END;
    在 .msgmap 文件中,将元素 custId 用作参数来调用 ESQL 函数。

  • 在表达式中使用 mfmap 下标变量的 .mfmap 文件:
    e || "#I"
    必须使用 ESQL 全部重写。根据定义,必须有复杂的重复父元素,但这并不为 ESQL 函数所支持。

  • 使用源表达式来计算值的表达式:
    src_msg.e[src_msg.a]
    必须使用 if 行、msgmap:occurrence() 函数和 ESQL 函数来重写:
    for src_msg.e 		
    	if 			
    		condition msgmap:occurrence(src_msg/e) = src_msg/a 

  • 对于使用索引表达式来计算值的表达式:
    src_msg.e["#I" +5]
    src_msg.e[< 3]
    必须使用 ESQL 重写整个 .mfmap 文件,这是因为 .msgmap 文件还不支持重复字段的变址访问。

  • 使用 ROW 表达式来计算值的 .mfmap 文件:
    src_msg.e IN (1, 2, 3)
    必须使用 ESQL 重写,这是因为 .msgmap 文件不支持 ESQL ROW 表达式。
相关任务
正在开发 ESQL
相关参考
mqsimigratemfmaps 命令
从 V5.0 迁移消息映射
声明 | 商标 | 下载 | 书库 | 支持 | 反馈
Copyright IBM Corporation 1999, 2006 最后一次更新时间:2006/08/14
ar25255_