2

我在连接到 Postgresql 9 DB 的 WSO2 BPS 3.0.0 上的 bpel 进程中开发了一个池逻辑。它看起来像这样:

<bpel:repeatUntil name="RepeatUntilIncidentCompleted">
<bpel:sequence name="CheckIncidentStatus">
    <bpel:wait name="Wait">
        <bpel:for expressionLanguage="urn:oasis:names:tc:wsbpel:2.0:sublang:xpath1.0"><![CDATA['PT1M']]></bpel:for>
    </bpel:wait>
    <!-- invoke a service, copy status to a vStatus variable -->
</bpel:sequence>
<bpel:condition expressionLanguage="urn:oasis:names:tc:wsbpel:2.0:sublang:xpath1.0"><![CDATA[$vStatus=36]]></bpel:condition>

我创建了一个流程实例,这个循环运行良好。后来我重新启动了 WSO2 BPS 服务器。在重新启动的那一刻,流程实例处于循环中,但重新启动后循环不再运行。该过程在碳控制台中被标记为活动。

我在 deploy.xml 中添加了 in-memory=false 属性,但没有帮助。

我可能错过了一些配置,但这样的循环也可能存在持久性问题(可能在 Apache ODE 中)。

有谁知道这个问题的解决方案?提前谢谢。

4

1 回答 1

0

我发现:
1. 您放入 wso2 bpel 进程的所有睡眠操作都在 ode_job 表中表示。属性 ts 包含唤醒时间。
2. bps 服务器重启后,所有延迟的睡眠操作都不再继续(当唤醒时间 < 当前时间 - 偏移量时,睡眠操作被延迟)。
3. 重启 bps 服务器后,所有非延迟睡眠操作都正常继续。

现在让我们这样说:
- 您有一个在等待操作中等待的 bpel 流程实例。唤醒时间是 X。
- 您停止 bps 服务器,并在 X 之后重新启动它。
因为 2. 重新启动后流程实例将不会继续。这包括我之前描述的循环。

我对这个问题的解决方法:
每次重新启动 wso2 bps 服务器时,我都会在数据库上执行一个 sql 脚本,更新睡眠操作的唤醒属性(ode_job 表中的 ts 列)。起床时间设置在不久的将来。

我不知道你是否可以通过配置更改 2. / 3. 行为。我找不到任何关于它的文档。这里需要一些代码分析。更糟糕的是,wso2 使用它自己的 apache ode 分支,因此您不能只更新 apache ode 库。

我怀疑 2. 中描述的行为可能有两个原因:
- 延迟睡眠操作被删除
- 延迟睡眠操作在重新启动后立即执行,但尚未加载进程定义。

于 2013-03-14T07:51:32.510 回答