如何在运行时向jbpm runtimemanager添加进程定义?

jfewjypa  于 2021-06-21  发布在  Storm
关注(0)|答案(2)|浏览(327)

我们正在开发一个应用程序,用户可以在其中设计自己的工作流(在webui中),然后提交执行。我们选择jbpm作为我们的执行和工作流管理器引擎。用户提交的工作流将转换为jbpm(bpmn2)工作流。我们正在使用版本6.1.0.final。由于这是一个多用户应用程序,因此支持并发工作流执行是一个主要需求。为了方便起见,我们正在storm之上构建jbpm,例如,在这里,每个提交的工作流(由喷口提供)将在一个单独的bolt中执行。
在再次阅读文档之后,我们发现使用每个流程示例来指示运行时管理器在kie会话和流程示例之间保持严格的关系是有意义的。尽管在看了更多的示例和代码片段之后,我们对获取会话示例的正确方法感到困惑。到目前为止,我们已经看到了两种方法:
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();

# 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。此外,这种方法不使用运行时环境、运行时管理器或运行时引擎。在第二种方法中,我们创建一个每进程运行时管理器,并为每个提交的工作流从中获取一个新会话。但是使用这种方法,我们不知道如何在运行时添加进程定义。
此外,文档倾向于使用运行时管理器,我们不知道不使用该方法的优点/缺点以及添加流程定义的问题。
如有任何澄清,将不胜感激。

kxeu7u2r

kxeu7u2r1#

推荐使用运行时管理器,因为它设置了处理业务流程可能需要的所有服务。因此,如文档所述,使用运行时管理器。我想建议您看看jbpm kie services项目,它基本上是提供jbpm工具的层,您应该考虑将其作为如何创建自己的应用程序的蓝图,因为您为应用程序描述的目标与jbpm控制台ng提供的目标几乎相同。
当做

rkttyhzu

rkttyhzu2#

最近我也遇到了同样的问题,每次添加新的流程定义时,我都会使用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()));
}

注意:这只是一个示例,特别是与同步相关的:)

相关问题