如何在运行时向JBPM RuntimeManager添加流程定义?

时间:2014-08-21 10:18:45

标签: jbpm apache-storm

我们正在开发一个应用程序,用户可以在其中设计自己的工作流程(在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,并为每个提交的工作流程提供一个新的会话。但是使用这种方法,我们不知道如何在运行时添加流程定义。

此外,文档倾向于使用运行时管理器,我们真的不知道不通过该路由的优点/缺点以及添加流程定义的问题。

任何澄清都将受到高度赞赏。

2 个答案:

答案 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提供的应用程序相同。

此致