PROPAGATE 语句

PROPAGATE 语句将消息传播到下游节点中。

语法

读取语法图跳过可视语法图PROPAGATE TOTERMINALTerminalExpressionLABELLabelExpression MessageSources 控件
WHERE
读取语法图跳过可视语法图MessageSources = ENVIRONMENT表达式 MESSAGE表达式 EXCEPTION表达式
读取语法图跳过可视语法图控件 = FINALIZEDEFAULTNONE DELETEDEFAULTNONE

可以在 ComputeDatabase 节点中使用 PROPAGATE 语句,但不能在 Filter 节点中使用 PROPAGATE 语句。 此语句的新增内容有助于错误处理-请参阅 编码 ESQL 以处理错误

TO TERMINAL 子句
如果存在 TO TERMINAL 子句,将对 TerminalExpression 求值。 如果结果属于 CHARACTER 类型,将按照规则将消息传播到终端:
'nowhere' : no propagation
'failure' : Failure
 'out'    : Out 
 'out1'   : Out1
 'out2'   : Out2
 'out3'   : Out3
 'out4'   : Out4
提示: 终端名称区分大小写,因此,例如, Out1 与任何终端都不匹配。
如果 TerminalExpression 的结果属于 INTEGER 类型,将按照规则将消息传播到终端:
-2 : no propagation
-1 : Failure
 0 : Out 
 1 : Out1
 2 : Out2
 3 : Out3
 4 : Out4

如果 TerminalExpression 的结果既不属于 CHARACTER 类型也不属于 INTEGER 类型,那么集成节点将抛出异常。

如果 TO TERMINAL 子句和 TO LABEL 子句都不存在,那么集成节点会将消息传播到 Out 终端。

提示: 在终端表达式中使用字符值会生成最自然且可读的代码。 不过整数值在循环中更容易处理,处理速度更快。
TO LABEL 子句
如果存在 TO LABEL 子句,将对 LabelExpression 求值。 如果结果类型为 CHARACTER 并且在同一流程中有一个 Label 节点,其 Label 属性与 LabelExpression 匹配,则集成节点会向该节点传播一条消息。
提示: 标签 (如终端) 区分大小写。 此外,请注意,与路由到 Label 节点一样,定义目标的是 Label 节点的 Label Name 属性,而不是节点的标签本身。

如果 LabelExpression 的结果为 NULL 或不是 CHARACTER 类型,或者流中没有匹配的 Label 节点,那么集成节点将抛出异常。

如果 TO TERMINAL 子句和 TO LABEL 子句都不存在,那么集成节点会将消息传播到 Out 终端。

MessageSources 子句

MessageSources 子句选择要传播的消息树。 此子句仅适用于 Compute 节点 (在 数据库 节点中无效)。

可以在 MessageSources 子句中指定的值有:
ENVIRONMENT : 
  InputLocalEnvironment 
  OutputLocalEnvironment 

Message : 
  InputRoot 
  OutputRoot

ExceptionList : 
  InputExceptionList
  OutputExceptionList

如果没有 MessageSources 子句,将使用节点的计算方式属性决定要传播的消息。

FINALIZE 子句
最终化是固定头链并使 Properties 文件夹匹配这些头的过程。 如果存在 FINALIZE 子句,便可以控制最终化。

此子句仅适用于 Compute 节点 (在 数据库 节点中不起作用)。

Compute 节点允许其他节点更改其输出消息 (由其他节点更改其输入消息)。 但是, Compute 节点创建的消息在以下时间之后无法由另一个节点更改:
  • 已最终化
  • 已到达任何输出节点或其他生成位流的节点

如果 FINALIZE 设置为 DEFAULT,或者没有 FINALIZE 子句,将在传播之前对输出消息(但不是 Environment、Local Environment 或 Exception List)进行最终化。

如果 FINALIZE 设置为 NONE,将不进行最终化。 如果您要保留并允许通过消息流中的节点下游进行的整个输出消息树的更新,此选项则是必需的,并与 DELETE NONE 一起使用,如下一部分中所述。

DELETE 子句
DELETE 子句用于控制输出本地环境、消息和异常列表的清除。

DELETE 子句仅适用于 Compute 节点 (在 数据库 节点中不起作用)。

如果 DELETE 设置为 DEFAULT,或者没有 DELETE 子句,将在传播之后立即清除所有输出本地环境、消息和异常列表并恢复它们的内存。

如果 DELETE 设置为 NONE,将不清除任何内容。 如果您希望下游节点能够看到输出本地环境消息的单个实例和异常列表树,请使用 DELETE NONE。 每次传播都从上一次传播所创建的这些树的内容开始,而不是从空树开始。 如果您还希望这些节点更新输出树,必须将 DELETE NONE 与上一部分中所述的 FINALIZE NONE 选项一起使用。

注意,无论传播哪些内容,输出树都会最终确定和清除。

传播是一个同步过程。 即,直到下游节点中的所有消息都已处理完,才执行下一条语句。 请注意,此过程可能会抛出异常,如果未捕获这些异常,它们将阻止执行 PROPAGATE 调用后面的语句。 此行为可能就是您的流所需的逻辑,但如果不是,您可以使用处理程序来捕获异常并执行必需的操作。 请注意,在传播的下游抛出的异常 (如果未捕获) 也会阻止 ComputeDatabase 节点的最终自动操作 (例如,将 COMMIT 事务集设置为 "落实") 发生。

如果在您的节点中使用 PROPAGATE 语句,使用 RETURN FALSE; 阻止消息自动传播到消息流中的下一个节点将变得很重要。

DECLARE i INTEGER 1;
DECLARE count INTEGER;
SET count = CARDINALITY(InputRoot.XMLNS.Invoice.Purchases."Item"[])

WHILE i <= count DO 
  --use the default tooling-generated procedure for copying message headers 
  CALL CopyMessageHeaders(); 
  SET OutputRoot.XMLNS.BookSold.Item = InputRoot.XMLNS.Invoice.Purchases.Item[i]; 
  PROPAGATE; 
  SET i = i+1; 
END WHILE; 
RETURN FALSE;

以下消息由 PROPAGATE 语句在 OUT 终端上产生:


<BookSold>
 <Item>
  <Title Category="Computer" Form="Paperback" Edition="2">The XML Companion </Title>
  <ISBN>0201674866</ISBN>
  <Author>Neil Bradley</Author>
  <Publisher>Addison-Wesley</Publisher>
  <PublishDate>October 1999</PublishDate>
  <UnitPrice>27.95</UnitPrice>
  <Quantity>2</Quantity>
 </Item>
</BookSold>

<BookSold>
 <Item>
  <Title Category="Computer" Form="Paperback" Edition="2">A Complete Guide to 
   DB2 Universal Database</Title>
  <ISBN>1558604820</ISBN>
  <Author>Don Chamberlin</Author>
  <Publisher>Morgan Kaufmann Publishers</Publisher>
  <PublishDate>April 1998</PublishDate>
  <UnitPrice>42.95</UnitPrice>
  <Quantity>1</Quantity>
 </Item>
</BookSold>

<BookSold>
 <Item>
  <Title Category="Computer" Form="Hardcover" Edition="0">JAVA 2 Developers
  Handbook</Title>
  <ISBN>0782121799</ISBN>
  <Author>Phillip Heller, Simon Roberts </Author>
  <Publisher>Sybex, Inc.</Publisher>
  <PublishDate>September 1998</PublishDate>  <UnitPrice>59.99</UnitPrice>
  <Quantity>1</Quantity>
 </Item>
</BookSold>