我有一个问题,到目前为止我无法解决。在BPEL中,我想创建一个onAlarm eventHandler,它立即触发(即“for”元素设置为'PT0S')并每2秒重复一次。这个eventHandler应该包含一个计数器,每当闹钟触发时它会递增。
问题是:如何初始化计数器?如果变量将在onAlarm范围内初始化,则该值不再增加。在“正常”控制流中,该值也无法初始化,因为如果进程或onAlarm作用域首先运行,则不会定义该值。所以我会偶尔得到一个uninitializedVariable异常。
我的解决方案是既不在进程范围也不在onAlarm范围初始化变量,而是创建一个faultHandler,其中变量将被初始化,之后将执行onAlarm流程。问题是这个faultHandler现在将捕获每个未初始化的变量执行,并且可能还有另一个。
那么还有另一种可能性来处理这个问题,还是我可以找出哪个变量未正确初始化,以便faultHandler可以得到两个控制流?
解决方案应该适用于每个BPEL引擎。
谢谢,迈克尔
答案 0 :(得分:1)
您可以使用from-spec
在其定义中使用默认值初始化变量,就像在赋值中一样。有关详细信息,请参阅section 8.4.1 of the spec。
默认初始化可能如下所示:
<variables>
<variable name="Default" type="xsd:int" >
<from>5</from>
</variable>
</variables>
这应该在进程的启动活动完成后安装eventHandlers
时有效。到那时,根范围中定义的变量已经初始化。引用spec, section 12.1:
范围初始化包括实例化和初始化 范围的变量和合作伙伴链接; ...如果范围包含 初始启动活动然后开始活动必须在之前完成 事件处理程序已安装。
这么多规格。我想没有人能分辨出这是否“适用于每个BPEL引擎”。据我所知,它适用于bpel-g,Orchestra和EasyBPEL,但不适用于Apache ODE或OpenESB。