我在连接到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中)。
有谁知道这个问题的解决方案? Thx提前。
答案 0 :(得分: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中描述的行为可能有两个原因:
- 延迟睡眠操作下降了
- 延迟睡眠操作在重新启动后立即执行,但尚未加载过程定义。