我们正在开发一个应用程序,用户可以在其中设计自己的工作流程(在web-ui中),然后将其提交以供执行。我们选择jBPM作为执行和工作流管理器引擎。用户提交的工作流程将转换为jBPM(bpmn2)工作流程。我们正在使用版本6.1.0.Final。由于这是一个多用户应用程序,因此支持并发工作流程执行是首要要求。为了方便我们在风暴之上建立jBPM,例如,每个提交的工作流程(由喷口供给)将在一个单独的螺栓中执行。
在再次浏览文档后,我们发现使用每个流程实例指示运行时管理器维护kie会话和流程实例之间的严格关系是有意义的。虽然在查看了几个更多示例和代码片段后,我们对获取 KieSession 实例的正确方法感到困惑。到目前为止,我们已经看到了两种方法:
1
# Get a new KieBase and KieSession for every workflow submitted.
KieHelper kieHelper = new KieHelper();
KieBase kieBase = kieHelper
.addResource(ResourceFactory.newClassPathResource("MyProcess.bpmn"))
.build();
KieSession ksessionFromBase = kbase.newKieSession();
2
# using same manager instance for all workflows; get a new session
manager = (RuntimeManager) applicationContext.getBean("runtimeManager"); # per process instance runtime manager
RuntimeEngine engine = manager.getRuntimeEngine(ProcessInstanceIdContext.get());
KieSession ksessionFromEngine = engine.getKieSession();
在第一种方法中,我们需要为每个提交的工作流程创建新的 KieBase 和 KieSession 。此方法也不使用运行时环境或运行时管理器或运行时引擎。在第二种方法中,我们创建了一个per-process-runtime-manager,并为每个提交的工作流程提供一个新的会话。但是使用这种方法,我们不知道如何在运行时添加流程定义。
此外,文档倾向于使用运行时管理器,我们真的不知道不通过该路由的优点/缺点以及添加流程定义的问题。
任何澄清都将受到高度赞赏。
答案 0 :(得分:1)
最近我遇到了同样的问题,每次添加新的流程定义时,我都使用KnowledgeBuilder方法从构建器创建新的KieBase:
样品:
static {
//TODO remove when fixed: https://issues.jboss.org/browse/JBPM-4378
ProcessNodeBuilderRegistry.INSTANCE.register(ActionNode.class, null );
}
private final KnowledgeBuilderImpl knowledgeBuilder = (KnowledgeBuilderImpl) KnowledgeBuilderFactory.newKnowledgeBuilder();
private volatile KieBase kieBase = knowledgeBuilder.newKnowledgeBase();
public synchronized void addBpmnProcess(WorkflowProcess process){
//TODO remove when fixed: https://issues.jboss.org/browse/JBPM-4378
new ProcessBuilderImpl(knowledgeBuilder).buildProcess(process, null);
kieBase = knowledgeBuilder.newKnowledgeBase();
// or when adding only processes as Process object
//((KnowledgeBaseImpl)kieBase).addProcess(process);
}
protected synchronized void addBpmnProcess(Resource resource) {
knowledgeBuilder.add(resource, ResourceType.BPMN2);
kieBase = knowledgeBuilder.newKnowledgeBase();
}
public void addBpmnProcess(InputStream bpmnProcessDefinition) {
addBpmnProcess(ResourceFactory.newInputStreamResource(bpmnProcessDefinition, StandardCharsets.UTF_8.toString()));
}
PS。这只是一个示例,尤其与同步相关:)
答案 1 :(得分:0)
建议使用Runtime Manager,因为它设置了您可能需要使用业务流程的所有服务。因此,正如文档所述,使用运行时管理器。我想建议你看看jbpm-kie-services项目,它基本上是提供jBPM工具的层,你应该把它看作是如何创建自己的应用程序的蓝图,因为你描述的目标您的应用程序几乎与jBPM Console NG提供的应用程序相同。
此致