某些情况下不支持对 .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 映射示例。
中的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 函数。
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 函数。
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 文件还不支持重复字段的变址访问。
src_msg.e IN (1, 2, 3)必须使用 ESQL 重写,这是因为 .msgmap 文件不支持 ESQL ROW 表达式。