1、编写JavaDelegate
还有最后一块难题还没有完成:我们还没有实现自动逻辑,当请求被批准时,这些自动逻辑就会被执行。在BPMN 2.0 XML中,这是一个服务任务,它看起来像:
<serviceTask id="externalSystemCall" name="Enter holidays in external system"
flowable:class="org.flowable.CallExternalSystemDelegate"/>
实际上,这个逻辑可以是任何东西,从用HTTP REST调用一个服务到执行一些传统的代码调用到一个组织几十年来一直使用的系统。我们不会在这里实现实际的逻辑,只是记录处理。
创建一个新的类(文件→新建→在Eclipse中的类),填写org.flowable作为包名称和CallExternalSystemDelegate类名称。使该类实现org.flowable.engine.delegate.JavaDelegate接口并实现execute方法:
package org.flowable;
import org.flowable.engine.delegate.DelegateExecution;
import org.flowable.engine.delegate.JavaDelegate;
public class CallExternalSystemDelegate implements JavaDelegate {
public void execute(DelegateExecution execution) {
System.out.println("Calling the external system for employee " + execution.getVariable("employee"));
}
}
当执行到达服务任务时,实例化并调用在BPMN 2.0 XML中引用的类。
现在运行示例时,将显示日志消息,显示确实执行了自定义逻辑:
2、使用历史数据
选择使用流程引擎(如Flowable)的众多原因之一是因为它会自动存储所有流程实例的审计数据或历史数据。通过这些数据,您可以创建丰富的报告,深入了解组织的工作方式,瓶颈位置等。
例如,假设我们想要显示迄今为止执行的流程实例的持续时间。为此,我们 从ProcessEngine获取HistoryService,并为历史活动创建一个查询。在下面的代码片段中,您可以看到我们添加了一些额外的过滤:
- 只有一个特定流程实例的活动
- 只有已完成的活动
结果也按结束时间排序,这意味着我们将按执行顺序进行排序。
HistoryService historyService = processEngine.getHistoryService();
List<HistoricActivityInstance> activities =
historyService.createHistoricActivityInstanceQuery()
.processInstanceId(processInstance.getId())
.finished()
.orderByHistoricActivityInstanceEndTime().asc()
.list();
for (HistoricActivityInstance activity : activities) {
System.out.println(activity.getActivityId() + " took "
+ activity.getDurationInMillis() + " milliseconds");
}
再次运行示例,我们现在在控制台中看到类似这样的内容:
startEvent花了1毫秒
approveTask耗时2638毫秒
决定花了3毫秒
externalSystemCall花了1毫秒
3、总结
本教程介绍了各种Flowable和BPMN 2.0的概念和术语,同时还演示了如何以编程方式使用Flowable API。
当然,这只是旅程的开始。以下部分将深入探讨Flowable引擎支持的许多选项和功能。其他章节将介绍Flowable引擎可以设置和使用的各种方式,并详细描述所有可能的BPMN 2.0构造。
上面文章来自盘古BPM研究院:http://vue.pangubpm.com/
文章翻译提交:https://github.com/qiudaoke/flowable-userguide
了解更多文章可以关注微信公众号: