我的应用程序基于jBPM 5,由于一些群集问题,我正在测试jBPM 6来替换旧版本。我使用了以下示例:https://github.com/jsvitak/jbpm-6-examples/tree/master/rewards-basic
不幸的是,据我测试过,它仍然存在与多个节点共享相同KSession的问题。
RuntimeManager设置为使用单例策略。
RuntimeEnvironment environment = RuntimeEnvironmentBuilder.Factory.get()
.newDefaultBuilder()
.entityManagerFactory(emf)
.addAsset(ResourceFactory.newClassPathResource("rewards-basic.bpmn"), ResourceType.BPMN2)
.get();
environment.getEnvironment().set(EnvironmentName.USE_PESSIMISTIC_LOCKING, true);
singletonManager = RuntimeManagerFactory.Factory.get().newSingletonRuntimeManager(environment);
RuntimeEngine runtime = singletonManager.getRuntimeEngine(new Context() {
@Override
public Object getContextId() {
return singletonManager.getIdentifier();
}
});
KieSession ksession = runtime.getKieSession();
Map<String, Object> params = new HashMap<String, Object>();
params.put("recipient", recipient);
ProcessInstance processInstance = ksession.startProcess(
"com.sample.rewards-basic", params);
测试很简单:
在第二步之后,我总是遇到与jBPM 5相同的Hibernate异常:
引起:org.hibernate.StaleObjectStateException:Row被另一个事务更新或删除(或unsaved-value映射不正确):[org.drools.persistence.info.SessionInfo#1]
在jBPM 5上我从数据库重新加载KSession,但我将其称为解决方法。
我的应用程序要求登录到不同节点的不同用户必须可以访问相同的流程实例。流程具有人工任务,是有状态的,并且被认为是长期运行的(几天,几个月)。任务很快就完成了。
所以,我的问题是: