1

我有一个小问题我目前无法解决。在 BPEL 中,我想创建一个 onAlarm eventHandler,它会立即触发(即“for”元素设置为“PT0S”)并每 2 秒重复一次。此事件处理程序应包含一个计数器,该计数器在每次警报触发时递增。

问题是:如何初始化计数器?如果变量将在 onAlarm 范围内初始化,则该值将不再增加。在“正常”控制流中,该值也无法初始化,因为如果进程或 onAlarm 范围首先运行,则未定义该值。所以我会时不时地得到一个 uninitializedVariable 异常。

我的解决方案是不在进程范围内也不在 onAlarm 范围内初始化变量,而是创建一个 faultHandler ,其中将初始化变量,然后执行 onAlarm 流程。问题是每个 uninitializedVariable 执行现在都会被这个 faultHandler 捕获,并且可能还有另一个。

那么是否有另一种可能性来处理这个问题,或者我可以以某种方式找出哪个变量没有正确初始化,以便 faultHandler 可以获得两个控制流?

该解决方案应该适用于每个 BPEL 引擎。

谢谢,迈克尔

4

1 回答 1

1

from-spec您可以使用就像在赋值中一样使用其定义上的默认值来初始化变量。有关详细信息,请参阅规范的第 8.4.1 节

默认初始化可能如下所示:

<variables>
    <variable name="Default" type="xsd:int" >
        <from>5</from>
    </variable>
</variables>

这应该像eventHandlers在流程的启动活动完成后安装的那样工作。到那时,根作用域中定义的变量已经被初始化了。要引用规范,第 12.1 节

作用域初始化包括实例化和初始化作用域的变量和伙伴链接;...如果范围包含初始启动活动,则启动活动必须在安装事件处理程序之前完成。

规范就这么多。我认为没有人能说这是否“适用于每个 BPEL 引擎”。据我所知,它适用于 bpel-g、Orchestra 和 EasyBPEL,但不适用于 Apache ODE 或 OpenESB。

于 2012-09-12T15:36:25.193 回答