JBPM5.4 - 处理乐观锁定问题 - sessionInfo同时由两个调用持久化

时间:2014-02-10 03:23:02

标签: jbpm

我在网上搜索并看到很多人遇到类似的问题 - ksession正在获得乐观的锁定失败,但我从未能够实现解决方案。这就是我正在做的事情

我使用的是Jboss AS 7服务器。当第一个startProcess调用到来时,我将加载并缓存kbase将我将使用的所有工作流程(因为每次加载它们都会减慢系统...我有大约20个工作流程)。我将它存储在一个静态变量中。从现在开始,每次创建新会话(JPAKnowledgeService.newStatefulKnowledgeSession)或加载现有会话(JPAKnowledgeService.loadStatefulKnowledgeSession)时,它都会重用kbase。如果每件事都以序列化方式运行,那一切都很好。

我在工作流程中使用多个实例节点引入了并行处理。它工作,直到两个单独的调用几乎同时尝试在共同的ksession中完成他们的工作项,然后我乐观锁定失败。我试图在sessionInfo实体对象上实现一个悲观锁,但是没有用。

我无法实现重试机制(尝试了不同的cacthing异常方式)。请指导我使用重试机制的正确方法。如果我升级到JBPM6.x,我是否可以使用session per request方法解决这个问题?

1 个答案:

答案 0 :(得分:0)

如果两个会话具有相同的ID 并且尝试并行地保持其更改(或者从开始使用陈旧数据),则应该只获得乐观锁定异常。您需要确保不会发生这种情况,无论是通过跟踪现有会话(以及将同一ksession的请求路由到同一实例,不在不同实例中加载相同的会话数据),还是通过简单地使用不同的会话(对于例如,每个请求都有一个新请求,如果您不跨请求维护任何会话状态(规则数据,计时器),则可以这样做。

在jBPM6中,新的会话管理策略为您开箱即用,并且有一个新的重试拦截器可以在发生真正冲突时重试请求(这应该很少见,因此通常会隐藏此问题完全)。特别是每个请求策略(现在允许您为每个请求创建/部署会话但仍然支持长时间运行的计时器)可能在这里开箱即用。