Activiti7开发入门
一、 BPM
BPM,即业务流程管理,是一种以规范化的构造端到端的卓越业务流程为中心,以持续的提高组织业务绩效为目的的系统化方法,常见商业管理教育如EMBA、MBA等均将BPM包含在内。
通常,BPM也指针对流程管理的信息化系统,其特点是注重流程驱动为核心,实现端到端全流程信息化管理。
二、 BPMN
BPM有很多种建模语言,BPMN(Business Process Modeling Notation)就是其中的一种建模语言。
BPMN标准是听得比较多的工作流标准,此外还有XPDL,BPML等。甚至他们的出现时间比BPMN更早,只是因为一些技术和非技术原因,BPMN2.0最终被普遍使用。。。
三、 工作流与BPMN
3.1什么是工作流引擎
工作流引擎是一个用于管理和调度流程的应用程序,可以集成并作为程序框架使用,包括流程定义的存储,流程的节点与流程条件判断和调度、流向管理、流程实例管理等功能。
3.2工作流引擎与BPMN有什么关系
通过BPMN(业务流程建模语言)来进行BPM(业务流程建模)得到的结果就是业务流程的定义,它规定了业务的流转过程由谁参与等等。而协调并执行这个流程,记录流程的执行过程和结果就是工作流引擎的职责范围了。
3.3工作流引擎的比较
我们选取了Java领域业界相对主流的工作流引擎进行对比分析
JBPM(Java Business Process Management)
由JBoss公司开发,目前最高版本JPBM7,不过从JBPM5开始已经跟之前不是同一个产品了,JBPM5的代码基础不是JBPM4,而是从Drools Flow重新开始。下面要涉及的很多产品都是以JBPM4的代码为起点进行开发的。
Activiti
Alfresco软件开发,基于JBPM4,后并入OMG,目前最高版本activiti 7。Activiti5版本的时候,核心团队发生了比较大的变动(离职),activiti6的开发团队在新版本中去除了PVM,纳入了DMN,重构XML解析,BUG较多,目前主要团队致力于activiti7,5&6已经官宣不维护。
Flowable
基于activiti6,最新的开源版本是flowable6,开发团队是从activiti中分裂出来的,修复了一众activiti6的bug,并在其基础上研发了DMN支持,BPEL支持等等。相对开源版,其商业版的功能会更强大。
Camunda
基于activiti5,所以其保留了PVM,最新版本Camunda7,开发团队也是从activiti中分裂出来的,发展轨迹与flowable相似,同时也提供了商业版。
JFlow
前身ccFlow,国产的工作流引擎,由济南驰骋公司开发维护,主打中国式的业务流程,由于是国产的软件,中文化程度比较深,业务开发也对用户比较友好。国产的开源工作流引擎还是挺多的,JFlow是其中功能比较完善的一个,同时对比activiti,流程上更加中国化,支持自定义流程跳转,加签等。其他国产工作流就不列举了。
Osworkflow
完全用java语言编写的开放源代码的工作流引擎,具有显著的灵活性及完全面向有技术背景的用户的特点。由opensymphony组织维护,其不遵守XPDL等业务规范,完全使用XML编排业务。面向开发人员。
Shark
靠山是Enhydra。是一个可扩展的工作流引擎框架,它包括一个完全基于 WFMC 规范的标准实现,它使用XPDL(没有任何自己新的扩展)作为自身的工作流流程定义格式。其持久层和设计器都是自己公司研发的,持久层实现采用的标准是轻量级的Enhydra DODS O/R mapping 工具,设计器可以用Enhydra JaWE 图形XPDL编辑器。
Apache ODE
轻型的、可嵌入的组件,利用组件组装成一个完整的BPM系统。关键模块包括ODE BPEL编译器、ODE BPEL运行时、ODE数据访问对象(DAOs)、ODE集成层(ILs)和用户工具。虽然挂在Apache下面,但已经年久失修。
还有很多工作流,比如ProcessMaker,SWF,oracle,Bonita,openwebflow,snaker等,不过做BPM的话,相对于上面列举的产品还是有些缺陷,比如流程过于简单,资料过少等。
四、 BPMN详解
https://www.cnblogs.com/zhaosq/p/10081329.html
五、 Activiti
Github:https://github.com/Activiti/Activiti
六、 K2设计器与Activiti的bpmn设计器
6.1流程图
6.2变量
K2变量是固定的。Activiti变量可以随时添加(启动流程时,审批时…)
6.3线路走向条件
6.4源码比较
从下面能看出很大不同,activiti 不包括Java代码。发布的时候业务监听代码是不一起发布的。K2发布是和C#代码打包发布的,所以不存在版本问题。
七、 开发环境
7.1 IDE
Eclipse,IntelliJ IDEA等
7.2 JDK
我这里用的是11
7.3 数据库
Activiti支持数据库h2, mysql, oracle, postgres, mssql, db2等。
7.4 BPMN2.0插件
按照如下安装
7.4.1 打开 Help -> Install New
Software. 在如下面板中:
7.4.2 在如下Install界面板中,点击Add按钮:
配置新装插件的地址和名称
7.4.3 然后填入下列字段
Name: Activiti BPMN 2.0 designer
Location: http://activiti.org/designer/update/
7.4.4 回到Install界面,在面板正中列表中把所有展示出来的项目都勾上:
7.4.5 点击复选框
在Detail部分记得选中
“Contact all updates sites..” , 因为它会检查所有当前安装所需要的插件并可以被Eclipse下载.
7.4.6 安装完以后,点击新建工程new->Other…打开面板,如果看到下图内容:
7.5 结合springboot
7.5.1 安装springboot的插件
7.5.2 maven需要的activiti相关依赖
将下面activiti相关依赖写入pom.xml文件
<dependency> <groupId>org.activiti</groupId> <artifactId>activiti-engine</artifactId> <version>${activiti.version}</version> </dependency> <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-spring</artifactId> <version>${activiti.version}</version> </dependency> <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-bpmn-model</artifactId> <version>${activiti.version}</version> </dependency> <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-bpmn-converter</artifactId> <version>${activiti.version}</version> </dependency> <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-json-converter</artifactId> <version>${activiti.version}</version> </dependency> <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-bpmn-layout</artifactId> <version>${activiti.version}</version> </dependency> <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-image-generator</artifactId> <version>${activiti.version}</version> </dependency>
7.5.3 activiti.cfg.xml
新增activiti.cfg.xml文件,并写入下方内容
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns="http://www.springframework.org/schema/beans" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- 配置数据源 --> <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource"> <!-- <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/> <property name="url" value="jdbc:mysql://127.0.0.1:3306/activiti?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true"/> <property name="username" value="root"/> <property name="password" value="123456"/> <property name="maxIdle" value="1"/> --> <property name="driverClassName" value="com.microsoft.sqlserver.jdbc.SQLServerDriver" /> <property name="url" value="jdbc:sqlserver://10.6.30.61:1433;databaseName=activiti" /> <property name="username" value="SZEContract" /> <property name="password" value="abc.1234567" /> </bean> <!-- Activiti单独运行的ProcessEngine配置 --> <bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneInMemProcessEngineConfiguration"> <!-- 数据源 --> <property name="dataSource" ref="dataSource" /> <property name="databaseSchemaUpdate" value="true" /> <property name="mailServerHost" value="cesp-cas02.**.com.cn" /> <property name="mailServerPort" value="25" /> <property name="mailServerDefaultFrom" value="***@**.com.cn" /> <property name="mailServerUsername" value="***@**.com.cn" /> <property name="mailServerPassword" value="***" /> </bean> </beans>
接下来就是各种activiti包的使用了
八、 Activiti详解
8.1 Activiti数据库表
如下共25张表
数据库表的命名规则
ACT_EVT_*:' EVT'表示 event,此前缀的表为事件日志。
ACT_GE_*:' GE'表示 general,此前缀的表为通用数据,用于不同场景中。
ACT_HI_*:'HI'表示 history,此前缀的表包含历史数据,如历史(结束)流程实例,变量,任务等等。
ACT_PROCEDF_*:'PROCED'表示 processdefine,此前缀的表为记录流程定义信息。
ACT_RE_*:'RE'表示 repository,此前缀的表包含了流程定义和流程静态资源(图片,规则等等)。
ACT _RU_*:'RU'表示 runtime,此前缀的表是记录运行时的数据,包含流程实例,任务,变量,异步任务等运行中的数据。Activiti只在流程实例执行过程中保存这些数据,在流程结束时就会删除这些记录。
表名 |
表注释 |
ACT_EVT_LOG |
流程引擎的通用事件日志记录表 |
ACT_GE_BYTEARRAY |
二进制数据表,存储通用的流程定义和流程资源。 |
ACT_GE_PROPERTY |
系统相关属性,属性数据表存储整个流程引擎级别的数据,初始化表结构时,会默认插入三条记录。 |
ACT_HI_ACTINST |
历史节点表 |
ACT_HI_ATTACHMENT |
历史附件表 |
ACT_HI_COMMENT |
历史意见表 |
ACT_HI_DETAIL |
历史详情表,提供历史变量的查询 |
ACT_HI_IDENTITYLINK |
历史流程用户信息表 |
ACT_HI_PROCINST |
历史流程实例表 |
ACT_HI_TASKINST |
历史任务实例表 |
ACT_HI_VARINST |
历史变量表 |
ACT_PROCDEF_INFO |
流程定义的动态变更信息 |
ACT_RE_DEPLOYMENT |
部署信息表 |
ACT_RE_MODEL |
流程设计模型部署表 |
ACT_RE_PROCDEF |
流程定义数据表 |
ACT_RU_DEADLETTER_JOB |
作业死亡信息表,作业失败超过重试次数 |
ACT_RU_EVENT_SUBSCR |
运行时事件表 |
ACT_RU_EXECUTION |
运行时流程执行实例表 |
ACT_RU_IDENTITYLINK |
运行时用户信息表 |
ACT_RU_INTEGRATION |
运行时积分表 |
ACT_RU_JOB |
运行时作业信息表 |
ACT_RU_SUSPENDED_JOB |
运行时作业暂停表 |
ACT_RU_TASK |
运行时任务信息表 |
ACT_RU_TIMER_JOB |
运行时定时器作业表 |
ACT_RU_VARIABLE |
运行时变量信息表 |
8.2 Activiti引擎的8大Service接口
RepositoryService: 流程仓库Service,用于管理流程仓库,例如:部署,删除,读取流程资源(bpm信息)
DynamicBpmnService:动态bpmn Service,提供对流程定义和部署存储库的访问的服务。用于动态修改流程中的一些参数信息等,是引擎中的一个辅助的服务。可用于更改流程定义的一部分,而无需重新部署它,例如,你可以在流程定义中更改用户任务的受让人定义,或更改服务任务的类名。
RuntimeService:运行时Service,可以处理所有正在运行状态的流程实例,任务等(发起流程就要用到)
TaskService:任务Service,用于管理,查询任务,例如:签收,办理,指派等
HistoryService:历史Service,可以查询所有历史数据,例如:流程实例,任务,活动,变量,附件等
FormService:表单Service,用于读取和流程,任务相关的表单数据(Activiti7移除)
ManagementService:引擎管理Service,和具体业务无关,主要是可以查询引擎配置,数据库,作业等(跳转节点就要用到)
IdentityService:身份Service,可以管理,查询用户,组之间的关系(Activiti7移除)
8.3 接口使用
8.3.1 activiti接口服务类获取
ProcessEngineConfiguration configuration = ProcessEngineConfiguration .createProcessEngineConfigurationFromResource("activiti.cfg.xml"); ProcessEngine processEngine = configuration.buildProcessEngine(); RepositoryService repositoryService = processEngine.getRepositoryService(); TaskService taskService = processEngine.getTaskService(); RuntimeService runtimeService = processEngine.getRuntimeService(); HistoryService historyService = processEngine.getHistoryService(); ManagementService managementService = processEngine.getManagementService(); DynamicBpmnService dyncBpmnService = processEngine.getDynamicBpmnService();
8.3.2 部署
// 进行部署 Deployment deployment = repositoryService.createDeployment() .addClasspathResource("bpmn/**.bpmn") // 添加bpmn资源 .addClasspathResource("bpmn/**.png").name(pName).deploy(); // 部署
8.3.3 发起流程
// 发起流程 req.variables.put(ComVariableConst.bizId, req.businessKey); var processInstance = runtimeService .startProcessInstanceByKey(req.procDefKey, req.businessKey, req.variables);
8.3.4 设置审批人
DelegateTask 接口中有审批人设置的方法
// 多个人 delegateTask.addCandidateUser(item.account); // 单人 delegateTask.setAssignee(item.account); // 组 delegateTask.addCandidateGroup("软件组");
8.3.5 待办获取
// 任务负责人 String account = req.account; String folder = req.folder; // 查询任务列表,根据流程定义的key和任务负责人 TaskQuery query = taskService.createTaskQuery().processDefinitionKeyLike(folder + "%"); List<Task> taskList = query.taskCandidateUser(account).list(); // 遍历任务列表 for(Task task : taskList) { System.out.println("----------------------------"); System.out.println("流程定义id = " +task.getProcessDefinitionId()); System.out.println("流程实例id = " + task.getProcessInstanceId()); System.out.println("业务id= " + task.getBusinessKey()); System.out.println("任务id = " + task.getId()); System.out.println("任务名称 = " + task.getName()); System.out.println("----------------------------"); }
8.3.6 审批
// 通过 taskService.complete(req.taskId, req.variables);
九、 Demo 展示
Demo展示ing….
9.1斗地主并行流程
9.2 自动发消息自动通过流程
9.3 维修报故障流程
十、 结束
一个与众不同的结束^_^…..