Flowable-简单应用
Flowable简单的应用终于写好了,对于大致的功能也有了一定的了解,虽然在真实的项目应用中使用的话
还需要进行改进,但是这里还是先写个总结记录一下大致的流程,不足之处后期再来填坑吧。
一.前期准备工作
- Flowable提供的流程绘制服务
-
需要在tomcat下运行,提前下载好tomcat,我这里用的是tomcat8
-
下载Flowable-web的zip包,地址:https://github.com/flowable/flowable-engine/releases/download/flowable-6.4.0/flowable-6.4.0.zip
-
下载完成后把zip包解压,并把目录\flowable-6.4.0\wars目录下的war包复制到tomcat的webapp目录下
-
启动tomcat
1.进入cmd并进入目录下,启动
出现如下信息则启动成功:
访问地址:http://localhost:8080/flowable-modeler/
默认用户名:admin
默认密码:test
绘制流程有不懂的可以参考中文文档:https://tkjohn.github.io/flowable-userguide/#bpmn20
和我的上一篇文档:https://www.cnblogs.com/MissWX/p/13964411.html
二.使用Flowable
我这里使用的是springboot,先创建好一个springboot的项目,再引入依赖即可
1.引入依赖
2.在项目的resouces目录下创建processes文件夹,用于存放我们创建的流程文件,processEngin回去扫描加载这些配置:
-
3.在flowable的流程化绘制服务内绘制流程图,我简单绘制了一个,如下所示:
然后把绘制到的流程下载到本地,并放到processes文件夹下,下面简单说一下这个文件:
- process 对应的是这个流程整体,id一般在查询的时候作为taskKey使用,name并不是属于flowable的属性,
主要是为了展示使用的 - startEvent 这是使用了一个空的开始,还有一些定时的开始,大家有需要可以去了解一下
- userTask 用户任务,第一个usertask的flowable:assignee是用来接收我们传入的参数的,这里第二个usertask
添加了一个listener,是在开始执行这个模块的时候触发的,大家可以根据自己的需求去设置执行的时机。listener
的类必须实现ExecutionListener,主要是针对流程的监听。还有一个TaskListener接口,主要是针对task的监听,
大家有需要的也可以去了解一下。 - sequenceFlow 连线,连接两个步骤,sourceRef开始,targetRef目标,conditionExpression执行的判断的表达式
- exclusiveGateway 排他网关
- endEvent 结束
4.简单的操作
创建流程
void createTask(){
HashMap<String,Object> map=new HashMap<>();
map.put("beginTaskID","张三");
runtimeService.startProcessInstanceByKey("holiday-request",map);
}
查看流程,这里我是通过入参查询的,还有许多别的查询办法,大家可以自行去探索:
void selectTask(){
List<Task> beginTaskID1 = taskService.createTaskQuery().processVariableValueEquals("beginTaskID", "张三").list();
System.out.println(beginTaskID1.size());
}
完成流程
void completeTask(){
List<Task> beginTaskID1 = taskService.createTaskQuery().processVariableValueEquals("beginTaskID", "张三").list();
String taskId = beginTaskID1.get(0).getId();
HashMap<String,Object> param=new HashMap<>();
param.put("checkResult","通过");
taskService.complete(taskId,param);
}
查看流程图
public void getProcessDiagram(HttpServletResponse httpServletResponse, String processId) throws Exception {
ProcessInstance pi = runtimeService.createProcessInstanceQuery().processInstanceId(processId).singleResult();
//流程走完的不显示图
if (pi == null) {
return;
}
Task task = taskService.createTaskQuery().processInstanceId(pi.getId()).singleResult();
//使用流程实例ID,查询正在执行的执行对象表,返回流程实例对象
String InstanceId = task.getProcessInstanceId();
List<Execution> executions = runtimeService
.createExecutionQuery()
.processInstanceId(InstanceId)
.list();
//得到正在执行的Activity的Id
List<String> activityIds = new ArrayList<>();
List<String> flows = new ArrayList<>();
for (Execution exe : executions) {
List<String> ids = runtimeService.getActiveActivityIds(exe.getId());
activityIds.addAll(ids);
}
//获取流程图
BpmnModel bpmnModel = repositoryService.getBpmnModel(pi.getProcessDefinitionId());
ProcessEngineConfiguration engconf = processEngine.getProcessEngineConfiguration();
ProcessDiagramGenerator diagramGenerator = engconf.getProcessDiagramGenerator();
InputStream in = diagramGenerator.generateDiagram(bpmnModel, "png", activityIds, flows, engconf.getActivityFontName(), engconf.getLabelFontName(), engconf.getAnnotationFontName(), engconf.getClassLoader(), 1.0);
OutputStream out = null;
byte[] buf = new byte[1024];
int legth = 0;
try {
out = httpServletResponse.getOutputStream();
while ((legth = in.read(buf)) != -1) {
out.write(buf, 0, legth);
}
} finally {
if (in != null) {
in.close();
}
if (out != null) {
out.close();
}
}
}
删除流程
void deleteTask(){
List<Task> beginTaskID1 = taskService.createTaskQuery().processVariableValueEquals("beginTaskID", "张三").list();
String processId = beginTaskID1.get(0).getProcessInstanceId();
runtimeService.deleteProcessInstance(processId,"删除的原因");
}
三.总结
这里只是简单的给大家介绍了一下,大家感兴趣的话可以移步到我的github,里面有关于flowable的简单实现,有页面,
可以进行简单的操作,会比纯看代码直观很多。
github地址:https://github.com/WX59991/flowable