Activiti 教程详解完整教程 1. Activiti 介绍 Activiti 是由 Alfresco 软件在 2010 年 5 月 17 日发布的业务流程管理(BPM)框架,它是覆盖 了业务流程管理,工作流,服务协作等领域的一个开源,灵活的,易扩展的可执行流程语言 框架。 Activiti 基于 Apache 许可的开源 BPM 平台, 创始人 Tom Baeyens 是 JBoss JBPM 的项目架构师, 它的特色是提供了 eclipse 插件,开发人员可以通过插件直接绘画出业务流程图。 1.1 工作流引擎 ProcessEngine 对象,这是 Activiti 工作的核心。负责生成流程运行时的各种实例及数据,监 控和管理流程的运行。 1.2 BPMN 业务流程建模与标注(Business Process Model and Notation,BPMN) ,描述流程的基本符号, 包括这些图元如何组合成一个业务流程图(Business Process Diagram) 2. 准备环境 2.1 Activiti 软件环境 1) 2) 3) 4) JDK1.6 或者更高版本 支持的数据库有:h2,mysql,oracle,mysql,db2 等 支持 Activiti 运行的 jar 包,可以通过 maven 依赖引入 开发环境为 Eclipse3.7 或者以上版本,myeclipse 为 8.6 版本 2.2 安装流程设计器(eclipse 插件) 1)打开 Help ?Install New Software ?Add 输入 Name: Activiti Designer Location: http://Activiti.org/designer/update/ 输入完成后,单击 OK 按钮等待下载完成后安装。 安装完成后在菜单选项中会出现 Activiti 的目录选项 2.3 设置 eclipse activit 插件的画流程图 选项 打开菜单 Windows --> Preferences --> Activiti -->Save 下流程图片的生成方式 勾选上 Create process definition image when saving the diagram 操作,勾选上这个操作后在 画流程图后保存 eclipse 会自动生成对应的流程图片。 2.4 准备开发环境 2.4.1 创建 maven web 项目,在 maven 中添加 Activiti 依赖 在 eclipse 左边工作栏右键 New 选择创建 Maven Project 项目, 创建一个名为 ActivitiTest 的项 目 点击 Finish 完成。 右键项目选择 Properties,选择 Project Facets 勾选上图中的选项,点击 Apply,再点击 OK 然后将项目转换成 web 项目,右键项目选择 Properties,在 Project Facets 中做如下勾选,然后点 击 Appy 应用和 OK 确定 然后右键项目 Properties , 选择 Deployment Assembly,将 test 相关目录 Remove 掉之保留 main 下面需要发布的内容,如下图 然后点击 Appply 和 OK 然后在 pom.xml 文件中添加以下依赖 org.Activiti Activiti-engine 5.21.0 org.Activiti Activiti-spring 5.21.0 org.codehaus.groovy groovy-all 2.4.3 org.slf4j slf4j-api 1.7.6 org.slf4j slf4j-jdk14 1.7.6 junit junit 3.8.1 test mysql mysql-connector-java 5.1.38 然后在命令行下 mvn compile 编译当前项目,将需要的包下载到本地仓库 2.4.2 初始化数据库 1)src/main/resource 目录下创建 Activiti.cfg.xml 文件,内容如下 jdbcUrl 为你电脑数据库的 url jdbcUsername 为数据库用户名 jdbcPassword 为数据库密码 2)在 main/java 目录下创建任意目录和类 编写创建 Activiti 数据表方法 public class CreateTable { /**** * 创建流程表 * */ @Test public void createTable() { ProcessEngine processEngine = ProcessEngineConfiguration.createProcessEngineConfigurationFro mResource("Activiti.cfg.xml") .buildProcessEngine(); System.out.println("------processEngine:" + processEngine); } } 然后运行该测试方法,如果运行成功,在数据库中应该会产生 25 张 Activiti 的相关数据表 2.4.3 Activiti 表说明 下面是概括了几个常用的数据表 流程部署相关表 act_re_deployement 部署对象表 act_rep_procdef 流程定义表 act_ge_bytearray 资源文件表 act_ge_prperty 主键生成策略表(对于部署对象表的主键 ID) 流程实例相关表 act_ru_execution 正在执行的执行对象表 (包含执行对象 ID 和流程实例 ID, 如果有多个线程 可能流程实例 ID 不一样) act_hi_procinst 流程实例历史表 act_hi_actinst 存放历史所有完成的任务 Task 任务相关表 act_ru_task 代办任务表 (只对应节点是 UserTask 的) act_hi_taskinst 代办任务历史表 (只对应节点是 UserTask 的) act_hi_actinst 所有节点活动历史表 (对应流程的所有节点的活动历史,从开始节点一直 到结束节点中间的所有节点的活动都会被记录) 流程变量表 act_ru_variable 正在执行的流程变量表 act_hi_variable 流程变量历史表 3.核心 API 3.1 ProcessEngine 说明: 1) 在 Activiti 中最核心的类,其他的类都是由他而来。 2) 产生方式 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); 3)可以产生 RepositoryService RepositoryService repositoryService =processEngine.getRepositoryService(); 4) 可以产生 RuntimeService RuntimeService runtimeService = processEngine.getRuntimeService(); 5) 可以产生 TaskService TaskService taskService =processEngine.getTaskService(); 各个 Service 的作用 RepositoryService RuntimeService TaskService 管理流程定义 执行管理,包括启动,推进,删除流程实例 等操作 任务管理 3.2 RepositoryService Activiti 的仓库服务类。所谓的仓库指流程定义文档的两个文件:bpmn 文件和流程图片 该 service 可以用来删除部署的流程定义。 3.3 RuntimeService 是 Activiti 的流程执行服务类,可以从这个服务类中获取很多关于流程执行的相关的信息。 3.4 TaskService 是 Activiti 的任务服务类。可以从这个类中获取任务的相关信息,如当前正在执行的个人待 办和用户组待办任务。 3.5 HistoryService 是 Activiti 的查询历史信息的类,在一个流程执行完成后,这个对象为我们提供查询历史信 息,可以跟踪流程实例对应所有待办节点的运行情况。 3.6 ProcessDefinition 流程定义类,可以从这里获得资源文件等。 3.7 ProcessInstance 代表流程定义的执行实例,当一个部署的流程图启动后,该流程只有一条流程实例数据,但 是它的流程任务可以有多个,每个任务对应流程图中相应的流程节点。 4.入门 HelloWorld 程序 4.1 创建流程图方法 点击 ActivitiTest 项目,在 src/main/java 目录下创建一个 diagrams 目录用来存放流程图 在当前项目右键选择 Activiti Diagram 流程图输入流程图名称 HelloWorld,然后点击 OK, 在控制面板的右边栏有相关的画图图标操作 其中一个流程必须包含一个开始节点和一个结束节点,结束节点可以有多个。 然 后 使 用 StartEvent, UserTask,EndEvent 画 出 下 面的 流 程 图 , 然 后用 Connection 中 的 SequenceFlow 连线连接起来。 4.2 创建流程图,如下图 4.3 指定流程图名称,ID 和 UserTask 的处理人 1)选中第一个节点,在 General 中的 name 属性中输入当前节点的名称,在 Main config 中的 Assignee 中输入该节点的处理人,然后以此类推将 3 个节点的值设置完成。 , 2)然后在流程图旁边的空白出点击一下,输入流程的 ID 和 Name 值,然后保存 4.4 将流程图部署到 Activiti 的数据表中 启动完成后在 act_re_deployment 流程部署表和 act_re_procdef 流程定义表中会有对应的数 据信息. 4.5 启动流程实例 其中 runtimeService.startProcessInstanceByKey("HelloWorldKey");中的 HelloWorldKey 对应流程 图中的 ID 值,在数据表中对应 act_re_procdef 流程定义表中的 key 字段 启动完流程后在 act_ru_execution 表中会产生一条数据,这条数据为当前流程正在执行的任 务,其中 act_id_字段的值对应流程图节点的 ID 值 在 act_ru_task 表 中 会 产 生 一 条 任 务 数 据 ,execution_id_ 对 应 act_ru_execution 主 键 , proc_inst_id_为流程实例 ID,name_值为流程节点名称,assignee_字段为该待办当前的处理 人 4.6 查询待办任务 指定查询张三的待办,可以查询出待办为第一个节点的处理任务。 4.7 完成待办任务 其中 taskId 对应 act_ru_task 表的主键 ID,因为当前待办任务为第一个节点提交申请,当执 行完这个待办后下一条待办数据将会流转到审批【部门经理】那,然后以此类推可以将部门 经理和总经理的待办任务全部查询和执行完成。 5.查询和删除流程定义 1)查询流程定义 2) 删除流程定义 6.流程变量操作 6.1 设置流程变量 1)设置流程变量有多种方式,可以在流程启动,和任务执行的时候设置 a.启动流程的时候设置 b. 通过 taskService 或者 runtimeService 设置 提示:如果设置的流程变量值是一个对象类型,这个对象必须实现序列化 Serializable 操作,并且要为该对象类指定一个 版本 ID 6.2 获取流程变量 见工程操作 7.流程连线 在画流程图的时候可以对流程的连线设置表达式, 然后在执行的时候设置流程变量值, 然后 Activiti 会根据对应的值走对应的节点 点击一条连线,在 Main config 中的 Condition 属性值中设置${message=='同意'},另外一条线 设置为${message=='不同意'},然后在代码中设置对应流程变量值。 见工程操作 8.排他网关 如下图,其中黑色的叉叉对应 eclipse 画流程图图标中的 ExclusiveGateWay 图标 然后对每条线的 Condition 属性指定对应的表达式, 然后在执行任务时候设置对应的流程变 量 Activiti 会根据变量的值来判断对应连线中的表达式走对应的流程节点路线。 见工程操作 9.并行网关 十字图标对应图标中的 ParallelGateway 并行网关不需要指定连线的表达式, 当流程流转到并行任务时会出发多个任务, 当多个任务 完成后在会将流程流转到下一个节点 见工程操作 10.个人任务的三种指定方式 10.1 在 Assignee 中指定任务具体的处理人 10.2 在 Assignee 中指定任务的处理人或角色变量 当指定 Assignee 为一个变量值后需要在代码中设置对应的处理人,比如在启动的时候设置 userId 的值 在工程中可以将起草人的处理变量设置为 userId,审批人的处理变量设置为 appUserId,然 后通过业务模块和登录人来获取对应模块的审批人。 10.3 为任务节点设置一个监听类来设置当前节点的处理人 如果设置了监听类就不需要在设置 Assignee 的值 1)创建一个监听器类,需要实现 TaskListener 接口 2) 点击任务节点,选择 Listener 选项卡,点击 New ,将 Event 的值改为 create 然后选择创建的 TaskListenerImpl 实现类 然后当任务到达该节点后 Activiti 会触发监听实现类的 notify 方法 11.组任务的三种指定方式 11.1 在任务节点中设置 Candidate user 候选人 设置的候选处理人用英文输入法的逗号隔开, 当任务到达该节点后, 设置的候选人其中任何 一个人都可以处理当前待办,处理完成后待办结束。 11.2 在 Candidate user 中设置一个变量作为处理人 然后通过启动或者执行流程向下传递的时候设置该流程变量值 11.3 通过监听类来设置待办处理人 如果设置了监听类就不需要在设置 Assignee 的值 和个人任务的监听类一样实现 TaskListener 接口,然后设置 CandidateUser 的值