通过REST API调用执行Flowable工作流程并获取结果

发布于 2025-01-19 22:23:09 字数 3125 浏览 0 评论 0原文

我正在使用REST API调用开始并完成可流动过程。 那么,如何等待并获得最终的“ ServicEtask”结果将其发送回呼叫者呢?

basic-process.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>

REST API呼叫:

@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());

        // How can I invoke the result of FirstServiceTask to return as a response value     
        // result = "FirstServiceTask has been executed";
        return "FirstServiceTask has been executed"
    }

}

ServicEtask:

public class FirstServiceTask implements JavaDelegate{

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

        // Need to invoke this result vale from REST API call for passing to caller as result
        String result = "FirstServiceTask has been executed";
    }

}

I am starting and completing the Flowable process using a REST API call.
Then how can wait and get the final "ServiceTask" result send it back back to the caller?

basic-process.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>

REST API call:

@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());

        // How can I invoke the result of FirstServiceTask to return as a response value     
        // result = "FirstServiceTask has been executed";
        return "FirstServiceTask has been executed"
    }

}

ServiceTask:

public class FirstServiceTask implements JavaDelegate{

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

        // Need to invoke this result vale from REST API call for passing to caller as result
        String result = "FirstServiceTask has been executed";
    }

}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

旧城空念 2025-01-26 22:23:09

一旦完成第一个任务,就没有等待阶段。因此,所有序列流和服务任务都在同一事务中执行。
在您的java委托中,您可以通过设置结果

execution.setVariable("varName", result);

,然后在您的休息服务中,一旦您的任务完成,您可以从runtimeService中检索流程变量。

Once you complete the first task, there is no wait phase. Hence all sequence flows and service tasks are executed in same transaction.
In your java delegate, you can set the result via

execution.setVariable("varName", result);

And then in your rest service, once your task is complete, you can retrieve the process variables from the runtimeService.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文