flowable工作流相关概念和ui图的使用:

flowable工作流里面有几个比较重要的概念. 其中就是一个使用processEngine对象, processEngine对象可以调用flowable对象的service方法:

1、RepositoryService很可能是使用Flowable引擎要用的第一个服务。这个服务提供了管理与控制部署(deployments)与流程定义(process
definitions)的操作。管理静态信息,

2、RuntimeService用于启动流程定义的新流程实例。

3、IdentityService很简单。它用于管理(创建,更新,删除,查询……)组与用户。

4、FormService是可选服务。也就是说Flowable没有它也能很好地运行,而不必牺牲任何功能。

5、HistoryService暴露Flowable引擎收集的所有历史数据。要提供查询历史数据的能力。

6、ManagementService通常在用Flowable编写用户应用时不需要使用。它可以读取数据库表与表原始数据的信息,也提供了对作业(job)的查询与管理操作。

7、DynamicBpmnService可用于修改流程定义中的部分内容,而不需要重新部署它。例如可以修改流程定义中一个用户任务的办理人设置,或者修改一个服务任务中的类名。

这几个Service类调用的方法可以决定这个工作流所有的对象,信息,变量参数.所有对flowable在再包装的框架都是上面service的调用,对自动生成的32个表的增删改查, 这个就是本质了.

结合一下官方文档的demo,演示一下

1:画图, 使用flowableui或者网上提供现成的画图网站

这个图画完之后,下载下来就是一个xml文件, 把这个文件放到resource目录下,就能自动识别了

xml内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:xsd="http://www.w3.org/2001/XMLSchema"xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI"xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC"xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI"xmlns:flowable="http://flowable.org/bpmn"typeLanguage="http://www.w3.org/2001/XMLSchema"expressionLanguage="http://www.w3.org/1999/XPath"targetNamespace="http://www.flowable.org/processdef"><process id="holidayRequest" name="Holiday Request" isExecutable="true"><startEvent id="startEvent"/><sequenceFlow sourceRef="startEvent" targetRef="approveTask"/><userTask id="approveTask" name="Approve or reject request"/><sequenceFlow sourceRef="approveTask" targetRef="decision"/><exclusiveGateway id="decision"/><sequenceFlow sourceRef="decision" targetRef="externalSystemCall"><conditionExpression xsi:type="tFormalExpression"><![CDATA[${approved}]]></conditionExpression></sequenceFlow><sequenceFlow  sourceRef="decision" targetRef="sendRejectionMail"><conditionExpression xsi:type="tFormalExpression"><![CDATA[${!approved}]]></conditionExpression></sequenceFlow><serviceTask id="externalSystemCall" name="Enter holidays in external system"flowable:class="org.flowable.CallExternalSystemDelegate"/><sequenceFlow sourceRef="externalSystemCall" targetRef="holidayApprovedTask"/><userTask id="holidayApprovedTask" name="Holiday approved"/><sequenceFlow sourceRef="holidayApprovedTask" targetRef="approveEnd"/><serviceTask id="sendRejectionMail" name="Send out rejection email"flowable:class="org.flowable.SendRejectionMail"/><sequenceFlow sourceRef="sendRejectionMail" targetRef="rejectEnd"/><endEvent id="approveEnd"/><endEvent id="rejectEnd"/></process></definitions>

启动一个maven工程,导入依赖,


<dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.7.21</version>
</dependency>
<dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>1.7.21</version>
</dependency>

建立一个启动类, 需要将它部署(deploy)到引擎中。部署一个流程定义意味着:

  • 流程引擎会将XML文件存储在数据库中,这样可以在需要的时候获取它。

  • 流程定义转换为内部的、可执行的对象模型,这样使用它就可以启动流程实例

将流程定义部署至Flowable引擎,需要使用RepositoryService,其可以从ProcessEngine对象获取。使用RepositoryService,可以通过XML文件的路径创建一个新的部署(Deployment),并调用deploy()方法实际执行:

1 2 3 4

RepositoryService repositoryService = processEngine.getRepositoryService(); Deployment deployment = repositoryService.createDeployment() .addClasspathResource("holiday-request.bpmn20.xml") .deploy();

我们现在可以通过API查询验证流程定义已经部署在引擎中(并学习一些API)。通过RepositoryService创建的ProcessDefinitionQuery对象实现。

1 2 3 4

ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery() .deploymentId(deployment.getId()) .singleResult(); System.out.println("Found process definition : " + processDefinition.getName());

启动流程实例

现在已经在流程引擎中部署了流程定义,因此可以使用这个流程定义作为“蓝图”启动流程实例

要启动流程实例,需要提供一些初始化流程变量。一般来说,可以通过呈现给用户的表单,或者在流程由其他系统自动触发时通过REST API,来获取这些变量。在这个例子里,我们简化为使用java.util.Scanner类在命令行输入一些数据:

1 2 3 4 5 6 7 8 9 10

Scanner scanner= new Scanner(System.in); System.out.println("Who are you?"); String employee = scanner.nextLine(); System.out.println("How many holidays do you want to request?"); Integer nrOfHolidays = Integer.valueOf(scanner.nextLine()); System.out.println("Why do you need them?"); String description = scanner.nextLine();

截下来,我们使用RuntimeService启动一个流程实例。收集的数据作为一个java.util.Map实例传递,其中的键就是之后用于获取变量的标识符。这个流程实例使用key启动。这个key就是BPMN 2.0 XML文件中设置的id属性,在这个例子里是holidayRequest

(请注意:除了使用key之外,在后面你还会看到有很多其他方式启动一个流程实例)

要获得实际的任务列表,需要通过TaskService创建一个TaskQuery。我们配置这个查询只返回’managers’组的任务:

1 2 3 4 5 6

TaskService taskService = processEngine.getTaskService(); List<Task> tasks = taskService.createTaskQuery().taskCandidateGroup("managers").list(); System.out.println("You have " + tasks.size() + " tasks:"); for (int i=0; i<tasks.size(); i++) { System.out.println((i+1) + ") " + tasks.get(i).getName()); }

可以使用任务Id获取特定流程实例的变量,并在屏幕上显示实际的申请:

1 2 3 4 5 6

System.out.println("Which task would you like to complete?"); int taskIndex = Integer.valueOf(scanner.nextLine()); Task task = tasks.get(taskIndex - 1); Map<String, Object> processVariables = taskService.getVariables(task.getId()); System.out.println(processVariables.get("employee") + " wants " + processVariables.get("nrOfHolidays") + " of holidays. Do you approve this?");

运行结果像下面这样:

经理现在就可以完成任务了。在现实中,这通常意味着由用户提交一个表单。表单中的数据作为流程变量传递。在这里,我们在完成任务时传递带有’approved’变量(这个名字很重要,因为之后会在顺序流的条件中使用!)的map来模拟:

1 2 3 4

boolean approved = scanner.nextLine().toLowerCase().equals("y"); variables = new HashMap<String, Object>(); variables.put("approved", approved); taskService.complete(task.getId(), variables);

现在任务完成,并会在离开排他网关的两条路径中,基于’approved’流程变量选择一条。

2.3.6. 实现JavaDelegate

拼图还缺了一块:我们还没有实现申请通过后执行的自动逻辑。在BPMN 2.0 XML中,这是一个服务任务(service task)

<serviceTask id="externalSystemCall" name="Enter holidays in external system"flowable:class="org.flowable.CallExternalSystemDelegate"/>

在现实中,这个逻辑可以做任何事情:向某个系统发起一个HTTP REST服务调用,或调用某个使用了好几十年的系统中的遗留代码。我们不会在这里实现实际的逻辑,而只是简单的日志记录流程

创建一个新的类(在Eclipse里File → New → Class),填入org.flowable作为包名,CallExternalSystemDelegate作为类名。让这个类实现org.flowable.engine.delegate.JavaDelegate接口,并实现execute方法:

1 2 3 4 5 6 7 8 9 10 11 12 13

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中所引用的类。

现在执行这个例子的时候,就会显示出日志信息,说明已经执行了自定义逻辑:

flowable工作流的使用相关推荐

  1. Flowable工作流入门

    Flowable工作流入门 本文链接:https://blog.csdn.net/qq_37059838/article/details/83576097 原作者:吕小小布 下载地址:Flowable ...

  2. Flowable工作流引擎

    Flowable工作流引擎 Flowable-基础篇(根据BV1Pb4y1p7Ku整理) 一.简介 Flowable是BPMN的一个基于java的软件实现,不过Flowable不仅仅包括BPMN,还有 ...

  3. 初识flowable工作流-实现简单请假流程SpringBoot+VUE

    一.前言 大家好,因为目前手里需要用到flowable工作流,之前没有接触过,所以在这里记录一下学习的进度,开始后台使用SpringCloud分布式框架和前端Vue框架实现一个简单的请假流程. 二.代 ...

  4. SpringBoot整合Flowable工作流引擎框架

    Flowable工作流引擎框架介绍 一个Java编写的轻量级业务流程引擎,为开发人员.系统管理员和业务用户提供工作流和业务流程管理(BPM)平台. 不仅包括BPMN,还有DMN决策表和CMMN Cas ...

  5. flowable工作流技术学习

    一.flowable工作流引擎中文文档 Flowable BPMN 用户手册 (v 6.3.0) 这个文档内容太多,稍微看看就好,具体学习还得从demo里面去学习. 二.flowable项目下载地址与 ...

  6. 项目集成Flowable工作流

    企业级项目集成Flowable工作流,基于(师父)的开源项目的集成,此开源项目是师傅十几年的经验和实战总结而成,直接可以用于企业开发,旨为帮助更多需要帮助的人! 说明 链接 项目开原地址 https: ...

  7. 为什么要使用flowable工作流

    为什么使用flowable工作流 1.在使用工作流之前 通常我们的处理方式是状态驱动方式(数据库与中设置Status字段). 痛点: 一方面:整个流程定义不够清晰.业务流程是分散在各个业务阶段中的,从 ...

  8. flowable工作流子流程调用

    flowable工作流子流程介绍 工作流提供了子流程的调用,一种是内部子流程,可以让用户主要看主流程,保持业务清晰,另一种是引用外部子流程(call activity),复用外部流程功能. 工作中有用 ...

  9. Spring Boot +Vue + Flowable 工作流引擎

    Flowable 项目提供了一组核心的开源业务流程引擎,这些引擎紧凑且高效.它们为开发人员.系统管理员和业务用户提供了一个工作流和业务流程管理(BPM)平台.它的核心是一个非常快速且经过测试的动态 B ...

最新文章

  1. python-pcl官网 应用、特征、过滤Filter教程翻译
  2. Linux zip-tar.gz 压缩解压
  3. 干货丨2017年AI与深度学习要点大全
  4. php 插入 mysql_php插入mysql数据返回id的方法
  5. SPI初始化C语言编程,SD卡spi模式读写,初始化和复位都成功了
  6. php zval_copy_static_var(),深入理解 PHP7 中全新的 zval 容器和引用计数机制
  7. pip升级python版本_GEE学习笔记 六十八:【GEE之Python版教程二】配置Python开发环境...
  8. php mysql 创建数据表_PHP MySQL 创建数据表
  9. 限制textarea的输入字数
  10. XMarks 书签王者
  11. 面试官常问的线程池,你真的了解吗?
  12. win10系统安装+激活+去水印
  13. Java8流式操作-根据集合的某个属性值取交集
  14. mac卸载了xcode后,运行软件提示:xcode-select: error: invalid developer directory
  15. 压缩多张图片,解压后发现图片文件损坏的问题解决
  16. ubuntu 16.04 + linux 5.0
  17. NX二次开发-UF_DRF_ask_dim_info获得图纸尺寸属于哪个视图和图纸页
  18. 使用阿里云的短信服务发送短信
  19. USB媒体设备端口绑定(以海康会议摄像头为例)
  20. linux下压缩gz文件怎么打开,在Linux系统中打开或解压缩.gz文件及提取tar.gz文件的方法...

热门文章

  1. 数据挖掘入门实验(weka)
  2. php手机发卡,PHP最新金发卡企业级发卡平台整站源码(自适应手机端) 支付通道齐全 运营级自动发卡完整版源码 发卡网源码...
  3. flavor android build,Android build.gradle从另一个文件导入flavor
  4. 记录每天学习的新知识:MotionEvent
  5. 【BZOJ 2713】[Violet 2]愚蠢的副官【BZOJ1183】[Croatian2008]Umnozak——【数位DP】
  6. 如何使用新版万能地图下载器下载谷歌地球影像
  7. 计算机专业博士后排名,排名丨计算机专业领域TOP10,性价比超高!
  8. Word2016如何查看分隔符?
  9. 农学跨计算机考研难吗,农学跨专业考研难度如何
  10. Android获取手机相册图片