java flowable_Flowable流程引擎入门
Flowable是一个流行的轻量级的采用Java开发的业务流程引擎。通过Flowable流程引擎,我们可以部署BPMN2.0的流程定义(一般为XML文件),通过流程定义创建流程实例,查询和访问流程相关的实例与数据,等等。
Flowable可以灵活地添加到我们的服务、应用、架构中,可以通过引入Flowable jar包,或者直接使用Flowable的Rest API来进行业务流程引擎的操作。
Flowable是基于Activity5.0的一个分支开发的,因此内部的很多概念都相似。
使用
通过创建一个简单的命令行案例了解如何创建Flowable的流程引擎,我们采用假期请假流程。
员工(employee)发出请假的请求
管理者(manager)同意或拒绝请假请求
我们会模拟把请求注册到外部的系统,发送邮件来通知流程的结果
1 创建项目,添加maven依赖
org.flowable
flowable-engine
6.4.2
mysql
mysql-connector-java
8.0.17
com.h2database
h2
1.3.176
2 创建流程的配置文件,holiday-request.bpmn20.xml
流程对应的BPMN图像为:
getting.started.bpmn.process
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">
${approved}
]]>
${!approved}
]]>
flowable:class="me.aihe.jmxdemo.flowable.CallExternalSystemDelegate"/>
flowable:class="org.flowable.SendRejectionMail"/>
3 编写代码
import org.flowable.engine.*;
import org.flowable.engine.history.HistoricActivityInstance;
import org.flowable.engine.impl.cfg.StandaloneProcessEngineConfiguration;
import org.flowable.engine.repository.Deployment;
import org.flowable.engine.repository.ProcessDefinition;
import org.flowable.engine.runtime.ProcessInstance;
import org.flowable.task.api.Task;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
/**
* @author he.ai aihehe123@gmail.com
* 使用场景:
* 功能描述:
*/
public class HolidayRequest {
public static void main(String[] args) {
// 首先实例化ProcessEngine,线程安全对象,一般全局只有一个即可,从ProcessEngineConfiguration创建的话,可以调整一些
// 配置,通常我们会从XML中创建,至少要配置一个JDBC连接
// 如果是在Spring的配置中,使用SpringProcessEngineConfiguration
ProcessEngineConfiguration cfg = new StandaloneProcessEngineConfiguration()
// .setJdbcUrl("jdbc:h2:mem:flowable;DB_CLOSE_DELAY=-1")
// .setJdbcDriver("org.h2.Driver")
// .setJdbcUsername("sa")
.setJdbcPassword("")
.setJdbcUrl("jdbc:mysql://127.0.0.1:3306/flowable?autoReconnect=true&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8")
.setJdbcUsername("aihe")
.setJdbcPassword("123456")
.setJdbcDriver("com.mysql.jdbc.Driver")
// 如果数据表不存在的时候,自动创建数据表
.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);
// 执行完成后,就可以开始创建我们的流程了
ProcessEngine processEngine = cfg.buildProcessEngine();
// 使用BPMN 2.0定义process。存储为XML,同时也是可以可视化的。NPMN 2.0标准可以让技术人员与业务人员都
// 参与讨论业务流程中来
// 部署流程
RepositoryService repositoryService = processEngine.getRepositoryService();
Deployment deployment = repositoryService.createDeployment()
.addClasspathResource("holiday-request.bpmn20.xml")
.deploy();
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery()
.deploymentId(deployment.getId())
.singleResult();
System.out.println("Found process definition : " + processDefinition.getName());
// 启动process实例,需要一些初始化的变量,这里我们简单的从Scanner中获取,一般在线上会通过接口传递过来
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 runtimeService = processEngine.getRuntimeService();
Map variables = new HashMap();
variables.put("employee", employee);
variables.put("nrOfHolidays", nrOfHolidays);
variables.put("description", description);
// 当创建实例的时候,execution就被创建了,然后放在启动的事件中,这个事件可以从数据库中获取,
// 用户后续等待这个状态即可
ProcessInstance processInstance =
runtimeService.startProcessInstanceByKey("holidayRequest", variables);
// 在Flowable中数据库的事务对数据一致性起着关键性的作用。
// 查询和完成任务
TaskService taskService = processEngine.getTaskService();
List tasks = taskService.createTaskQuery().taskCandidateGroup("managers").list();
System.out.println("You have " + tasks.size() + " tasks:");
for (int i=0; i
System.out.println((i+1) + ") " + tasks.get(i).getName());
}
System.out.println("Which task would you like to complete?");
int taskIndex = Integer.valueOf(scanner.nextLine());
Task task = tasks.get(taskIndex - 1);
Map processVariables = taskService.getVariables(task.getId());
System.out.println(processVariables.get("employee") + " wants " +
processVariables.get("nrOfHolidays") + " of holidays. Do you approve this?");
boolean approved = scanner.nextLine().toLowerCase().equals("y");
variables = new HashMap();
variables.put("approved", approved);
taskService.complete(task.getId(), variables);
HistoryService historyService = processEngine.getHistoryService();
List activities =
historyService.createHistoricActivityInstanceQuery()
.processInstanceId(processInstance.getId())
.finished()
.orderByHistoricActivityInstanceEndTime().asc()
.list();
for (HistoricActivityInstance activity : activities) {
System.out.println(activity.getActivityId() + " took "
+ activity.getDurationInMillis() + " milliseconds");
}
}
}
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"));
}
}
4 创建数据库
create database flowable;
5 运行应用
image.png
Flowable API
刚才的代码中,我们涉及到了一些Flowable的API,在开发的时候经常需要与这些API打交道。
入口点为:ProcessEngine,我们有多种方式来创建它。
通过ProcessEngine,我们可以获取工作流的不同服务类型,ProcessEngine和服务都是线程安全的,因此我们可以用作单例对象来使用这些服务。
image.png
// 第一次会初始化和创建一个ProcessEngine,后续调用都会从缓存中直接返回,全局创建一次
// ProcessEngines.init()与ProcessEngines.destroy(). 初始化和消耗与ProcessEngines
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RuntimeService runtimeService = processEngine.getRuntimeService();
RepositoryService repositoryService = processEngine.getRepositoryService();
TaskService taskService = processEngine.getTaskService();
ManagementService managementService = processEngine.getManagementService();
IdentityService identityService = processEngine.getIdentityService();
HistoryService historyService = processEngine.getHistoryService();
FormService formService = processEngine.getFormService();
DynamicBpmnService dynamicBpmnService = processEngine.getDynamicBpmnService();
RepositoryService: 操作和管理流程的定义和部署,deployment(部署)是ProcessEngine的基本单元
RuntimeService:每一个流程都可以创建许多的运行实例,RuntimeService启动流程的实例,检索和存储实例的变量信息
IdentityService:管理组和用户的身份认证信息
FormService:可选的服务
HistoryService:检索ProcessEngine的历史数据
ManagementService:检索数据库的元数据和表的信息,在编程的时候一般用不到
DynamicBpmnService:动态的改变流程的定义,并且不需要重新部署,在生产环境很少使用
最后
本次主要运行了一个Flowable的简单应用,介绍了Flowable是什么,在Activiti之上fork的流程引擎。
参考:
java flowable_Flowable流程引擎入门相关推荐
- 四大国内外开源的java工作流程引擎,流程快速开发平台对比分析选型
为了更好的帮助大家找到适合自己的流程引擎,快速的完成流程引擎技术架构选型,快速的完成项目交付我们找到了4个开源的java工作流引擎,一些应用环境对比分析. 希望您能从中找到适合您自己的流程引擎. 工作 ...
- activity(流程引擎)从零入门到实战学习
activity(流程引擎)从零入门到实战学习 1.什么是流程引擎? 2.为什么需要学习流程引擎? 3.为什么选择activiti? 本编文章将详细介绍什么是流程引擎,为什么学习,以及为什么选择act ...
- activiti入门2流程引擎API和服务基础设施
RepositoryService : 管理和控制公布包和流程定义(包括了一个流程每一个环节的结构和行为)的操作 除此之外,服务能够 查询引擎中的公布包和流程定义. 暂停或激活公布包.相应所有和特定流 ...
- java fixflow流程设计_Fixflow引擎解析(一)(介绍) - Fixflow开源流程引擎介绍
简介 Fixflow是一款开源的基于BPMN2.0标准的工作流引擎,由Fixflow开源联盟组织(Fixflow OpenSource Union) 进行社区化管理,引擎底层直接支持BPMN2.0国际 ...
- java流程引擎实现_手写实现一套流程编排
转载自:https://blog.csdn.net/weixin_39631301/article/details/112082970 流程编排 随着业务的不断发展,业务流程迭代慢慢变得复杂了起来,全 ...
- java中自定义表单和流程_让驰骋工作流程引擎 ccbpm使用自定义表单来实现自己的业务逻辑....
1.1.1.1: SDK表单 概要说明:我们把流程引擎与表单引擎统称为ccbpm,但是有一些用户并不想使用表单引擎,而是用自己的表单,仅仅使用流程引擎,这样的方式就要采用ccbpm的sdk表单开发模式 ...
- java velocity是什么意思_基于 Java 的模板引擎Velocity快速入门
最近使用Velocity模板引擎,写一个maven项目Coding生成工具. 对基于Java的模板引擎Velocity的demo总结如下: Step1. 创建Maven项目,添加如下velocity的 ...
- java 前端模板_前端模板引擎入门
模板引擎 模板引擎 起到 数据和视图分离的作用, 模板对应视图, 关注如何展示数据, 在模板外头准备的数据, 关注那些数据可以被展示. 后端模板引擎 freemarker 如下介绍, java后台的 ...
- java 流程引擎_Activiti流程引擎对象及配置原理解析
流程引擎对象和其配置对象都是activiti的核心对象 一.activiti的简单使用流程 activiti在工作时,一般有以下几个步骤: 创建一个流程引擎配置对象ProcessEngineConfi ...
最新文章
- 桌面计算机休眠快捷键,如何快速建立Win 7桌面一键休眠快捷方式
- Apollo后台配置:关联公共Namespace(类似与继承父类配置)
- 亦云小组KTV点歌系统简介
- Django数据查询方法总结
- 移动端兼容性问题解决方案
- window下用主机名登录MySQL数据库出现报错解决方案
- “差不多先生”姚劲波和不再神奇的58同城
- 【bat】一个脚本文件,关闭IE,重置IE,配置IE,设置IE的ActionX等选项.并自动管理员身份运行
- stm32F103 模拟I2C mpu6050收到数据全为0,或者地址为209,104,0x68,0xD0的一些解决办法总结
- 腾讯与360继续争,受益的是谁?
- windows 7 数据执行保护 开启关闭方法
- AOSP、AOKP、CM ROM 究竟有哪些区别
- 老朋友,歌曲停了很久很久,确实不错
- Unity3D中制作全景图片
- 小游戏赛道如何加速流量增长?
- scikit-video读写视频
- Android 图片压缩、内存计算
- http://www.cnblogs.com/yungboy/archive/2010/05/28/1746376.html
- Esxi 6.7基于已有数据存储配置虚拟机(Windows类)间共享存储(非RDM)
- 安装VMware虚拟机