4

我在 spring-boot 中使用 Flowable 6.4.1 来创建进程并从我的 java 代码运行,但要求是不使用任何 xml,因此我遇到了封锁。

我有一个用户任务,从用户那里获取输入,根据该输入,调用相应的服务任务。

下面是我要做的一个简短的例子:

基本流程.bpmn20.xml:

<process id="basicprocess" name="Basic Process" isExecutable="true">

    <startEvent id="startEvent"/>
    <sequenceFlow sourceRef="startEvent" targetRef="getInput"/>

    <userTask id="getInput" name="Get input from user" />
    <sequenceFlow sourceRef="getInput" targetRef="decision"/>

    <exclusiveGateway id="decision"/>
    <sequenceFlow sourceRef="decision" targetRef="firstServiceTask">
      <conditionExpression xsi:type="tFormalExpression">
        <![CDATA[
          ${number>100}
        ]]>
      </conditionExpression>
    </sequenceFlow>
    <sequenceFlow  sourceRef="decision" targetRef="secondServiceTask">
      <conditionExpression xsi:type="tFormalExpression">
        <![CDATA[
          ${number<=100}
        ]]>
      </conditionExpression>
    </sequenceFlow>

    <serviceTask id="firstServiceTask" name="Number is greater than predefined target"
        flowable:class="demo.service.tasks.FirstServiceTask"/>
    <sequenceFlow sourceRef="firstServiceTask" targetRef="greaterEnd"/>

    <serviceTask id="secondServiceTask" name="Number is less than predefined target"
        flowable:class="demo.service.tasks.SecondServiceTask"/>
    <sequenceFlow sourceRef="secondServiceTask" targetRef="lesserEnd"/>

    <endEvent id="greaterEnd"/>

    <endEvent id="lesserEnd"/>

  </process>

上面,XML 显示了这个过程,我正在使用 REST API 开始这个过程下面是控制器:

定义Controller.java:

@RestController
@SuppressWarnings("rawtypes")
public class DefinitionsController {

    @Autowired
    private RepositoryService mRepositoryService;

    @Autowired
    private RuntimeService mRuntimeService;

    @Autowired
    private TaskService mTaskService;

    @PostMapping("/start-service")
    public String startService(@RequestBody String input) {
        Integer request = Integer.parseInt(input);
        Map<String, Object> variables = new HashMap<String, Object>();
        variables.put("number", request);

        ProcessInstance instance = mRuntimeService.startProcessInstanceByKey("basicprocess", variables);

        Task userTask = mTaskService.createTaskQuery().processInstanceId(instance.getId()).taskDefinitionKey("getInput").singleResult();
        mTaskService.complete(userTask.getId());

        return "ProcessInstance id is "+instance.getProcessInstanceId();
    }

}

FirstServiceTask.java:

public class FirstServiceTask implements JavaDelegate{

    @Override
    public void execute(DelegateExecution execution) {
        System.err.println("Came in first service task");
    }

}

sysoutSecondServiceTask.java语句除外。

REST RESPONSE:我在控制台中打印了相应服务任务的 processInstance Id 和 sysout 语句。

从 xml 连接服务任务类非常容易,但是如果我不使用 XML,我将需要使用flowable-modelerFLOWABLE 的 api 创建相同的进程。

所以,基本上我想从我的 java 代码中控制这些服务任务,为了做到这一点,我如何连接使用flowable-modeler我的 java 代码创建的服务任务?

我已经浏览了文档,但只找到了 xml 方式。

4

1 回答 1

3

使用 Java 代码配置服务任务(使用 flowable-modeler 创建)可以通过此处显示的 4 种方式完成。

将要配置的委托表达式应该存在于类路径中,或者应该创建一个 spring-bean。

我使用主类中的方法创建了 bean,并将方法的名称放在 api 的delegate expression属性中flowable-modeler/process,这就是这样做所需要的。

附加的图像应该澄清一些事情,它显示了将服务任务(使用 flowable-modeler API 创建)与工作区中的 Java 类连接的方式。 在此处输入图像描述

firstServiceTask在突出显示的字段中是返回 FirstServiceTask bean 的方法

编辑:除了上述解决方案外,我们还可以单独在类字段中指定类名,并完成所有配置。外汇:我在包 org.flowable.learning 中有一个类TestClass.java,所以我只org.flowable.learning.TestClass字段中指定,它就在附加屏幕截图中突出显示的代表表达式字段的上方

于 2019-08-08T09:56:01.873 回答