通过REST API调用执行Flowable工作流程并获取结果
我正在使用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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
一旦完成第一个任务,就没有等待阶段。因此,所有序列流和服务任务都在同一事务中执行。
在您的java委托中,您可以通过设置结果
,然后在您的休息服务中,一旦您的任务完成,您可以从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
And then in your rest service, once your task is complete, you can retrieve the process variables from the runtimeService.