《Activiti工作流详解完整教程.pdf》由会员分享,可在线阅读,更多相关《Activiti工作流详解完整教程.pdf(47页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、ActivitiActiviti 工作流详解完整教程工作流详解完整教程ActivitiActiviti 教程详解完整教程教程详解完整教程1.1.ActivitiActiviti 介绍介绍ActivitiActiviti 是由是由 AlfrescoAlfresco 软件在软件在 20102010 年年 5 5 月月1717 日发布的业务流程管理日发布的业务流程管理(BPM)(BPM)框架框架,它是覆盖它是覆盖了业务流程管理,了业务流程管理,工作流,工作流,服务协作等领域的一服务协作等领域的一个开源,个开源,灵活的,灵活的,易扩展的可执行流程语言框架。易扩展的可执行流程语言框架。ActivitiA
2、ctiviti 基于基于 ApacheApache 许可的开源许可的开源 BPMBPM 平台,创平台,创始人始人 TomTom BaeyensBaeyens 是是 JBossJBoss JBPMJBPM 的项目架构师,的项目架构师,它的特色是提供了它的特色是提供了 eclipseeclipse 插件,插件,开发人员可以开发人员可以通过插件直接绘画出业务流程图。通过插件直接绘画出业务流程图。1.11.1 工作流引擎工作流引擎ProcessEngineProcessEngine 对象,这是对象,这是 ActivitiActiviti 工作的核工作的核心。心。负责生成流程运行时的各种实例及数据,负责
3、生成流程运行时的各种实例及数据,监监控和管理流程的运行。控和管理流程的运行。1.21.2 BPMNBPMN业务流程建模与标注(业务流程建模与标注(BusinessBusiness ProcessProcess ModelModelandand Notation,BPMNNotation,BPMN),描述流程的基本符号,包,描述流程的基本符号,包括括 这这 些些 图图 元元 如如 何何 组组 合合 成成 一一 个个 业业 务务 流流 程程 图图(Business Process Diagram)(Business Process Diagram)2.2.准备环境准备环境2.12.1 Activi
4、tiActiviti软件环境软件环境1)1)JDK1.6JDK1.6 或者更高版本或者更高版本2)2)支支持持的的数数据据库库有有:h2,mysql,oracle,mysql,db2:h2,mysql,oracle,mysql,db2 等等3)3)支持支持 ActivitiActiviti 运行的运行的 jarjar 包,可以通过包,可以通过mavenmaven 依赖引入依赖引入4)4)开发环境为开发环境为Eclipse3.7Eclipse3.7 或者以上版本,或者以上版本,myeclipsemyeclipse 为为 8.68.6 版本版本2.22.2 安装流程设计器安装流程设计器(eclip
5、se(eclipse 插件插件)1 1)打开)打开 HelpHelp Install New SoftwareInstall New Software AddAdd输入输入 Name:Activiti Designer Name:Activiti Designer Location:Location:http:/Activiti.org/designer/update/http:/Activiti.org/designer/update/输入完成后,输入完成后,单击单击 OKOK 按钮等待下载完成后安装。按钮等待下载完成后安装。安装完成后在菜单选项中会出现安装完成后在菜单选项中会出现 Acti
6、vitiActiviti 的目的目录选项录选项2.32.3 设置设置 eclipseactiviteclipseactivit 插件的画流程图插件的画流程图 选项选项打打 开开 菜菜 单单WindowsWindows-PreferencesPreferences-Activiti-SaveActiviti-Save 下流程图片的生成方式下流程图片的生成方式勾选上勾选上 CreateCreate processprocess definitiondefinition imageimage whenwhensaving the diagramsaving the diagram 操作,勾选上这个操
7、作后操作,勾选上这个操作后在画流程图后保存在画流程图后保存 eclipseeclipse 会自动生成对应的会自动生成对应的流程图片。流程图片。2.42.4 准备开发环境准备开发环境2.4.12.4.1 创建创建 maven webmaven web 项目,在项目,在 mavenmaven 中添加中添加 ActivitiActiviti 依依赖赖在在 eclipseeclipse 左边工作栏右键左边工作栏右键 NewNew 选择创建选择创建 MavenMavenProjectProject 项目,创建一个名为项目,创建一个名为 ActivitiTestActivitiTest 的的项目项目点击点
8、击 FinishFinish 完成。完成。右键项目选择右键项目选择 PropertiesProperties,选择选择ProjectProject FacetsFacets勾选上图中的选项,点击勾选上图中的选项,点击 ApplyApply,再点击,再点击 OKOK然后将项目转换成然后将项目转换成webweb 项目项目,右键项目选择右键项目选择Properties,Properties,在在 Project FacetsProject Facets 中做如下勾选中做如下勾选,然后点击然后点击 AppyAppy 应用和应用和 OKOK 确定确定然后右键项目然后右键项目 PropertiesProp
9、erties,选择,选择 DeploymentDeploymentAssembly,Assembly,将将 testtest 相关目录相关目录 RemoveRemove 掉之保留掉之保留mainmain 下面需要发布的内容,如下图下面需要发布的内容,如下图然后点击然后点击 AppplyAppply 和和 OKOK然后在然后在 pom.xmlpom.xml 文件中添加以下依赖文件中添加以下依赖 org.Activitiorg.Activiti/Activiti-engineActiviti-engine/5.21.05.21.0/org.Activitiorg.Activiti/Activiti
10、-springActiviti-spring/5.21.05.21.0/org.codehaus.groovyorg.codehaus.groovy/groovy-allgroovy-all/2.4.32.4.3/org.slf4jorg.slf4j/slf4j-apislf4j-api/1.7.61.7.6/org.slf4jorg.slf4j/slf4j-jdk14slf4j-jdk14/1.7.61.7.6/junitjunit/junitjunit/3.8.13.8.1/testtest/mysqlmysql/mysql-connector-javamysql-connector-ja
11、va/5.1.385.1.38/然后在命令行下然后在命令行下 mvn compilemvn compile 编译当前项目,编译当前项目,将需要的包下载到本地仓库将需要的包下载到本地仓库2.4.22.4.2 初始化数据库初始化数据库1 1)src/main/resourcesrc/main/resource 目录下创建目录下创建Activiti.cfg.xmlActiviti.cfg.xml文件文件,内容如下内容如下?/jdbcUrljdbcUrl 为你电脑数据库的为你电脑数据库的 urlurljdbcUsernamejdbcUsername 为数据库用户名为数据库用户名jdbcPassword
12、jdbcPassword 为数据库密码为数据库密码2)2)在在 main/javamain/java 目录下创建任意目录和类目录下创建任意目录和类编写创建编写创建 ActivitiActiviti 数据表方法数据表方法publicpublic classclass CreateTable CreateTable/*/*创建流程表创建流程表*/*/TestTestpublicpublic voidvoid createTable()createTable()ProcessEngineProcessEngine processEngineprocessEngine=ProcessEngineCon
13、figuration.ProcessEngineConfiguration.createProcessEngineConfigurationFrocreateProcessEngineConfigurationFromResourcemResource(Activiti.cfg.xmlActiviti.cfg.xml).buildProcessEngine();.buildProcessEngine();System.System.outout.println(.println(-processEngine:-processEngine:+processEngineprocessEngine)
14、;);然后运行该测试方法,如果运行成功,在数据库中应该会产生然后运行该测试方法,如果运行成功,在数据库中应该会产生 2525 张张 ActivitiActiviti的相关数据表的相关数据表2.4.3 Activiti2.4.3 Activiti 表说明表说明下面是概括了几个常用的数据表下面是概括了几个常用的数据表流程部署相关表流程部署相关表act_re_deployementact_re_deployement 部署对象表部署对象表act_rep_procdefact_rep_procdef流程定义表流程定义表act_ge_bytearrayact_ge_bytearray 资源文件表资源文件
15、表act_ge_prpertyact_ge_prperty主键生成策略表主键生成策略表(对于部署对(对于部署对象表的主键象表的主键 IDID)流程实例相关表流程实例相关表act_ru_executionact_ru_execution 正在执行的执行对象表(包正在执行的执行对象表(包含执行对象含执行对象 IDID 和流程实例和流程实例 IDID,如果有多个线程,如果有多个线程可能流程实例可能流程实例 IDID 不一样)不一样)act_hi_procinstact_hi_procinst 流程实例历史表流程实例历史表act_hi_actinstact_hi_actinst 存放历史所有完成的任务
16、存放历史所有完成的任务TaskTask 任务相关表任务相关表act_ru_taskact_ru_task 代代办办任任务务表表(只只对对应应节节点点是是UserTaskUserTask 的)的)act_hi_taskinstact_hi_taskinst 代办任务历史表代办任务历史表(只对应节(只对应节点是点是 UserTaskUserTask 的)的)act_hi_actinstact_hi_actinst所有节点活动历史表所有节点活动历史表(对应(对应流程的所有节点的活动历史,流程的所有节点的活动历史,从开始节点一直到从开始节点一直到结束节点中间的所有节点的活动都会被记录)结束节点中间的所
17、有节点的活动都会被记录)流程变量表流程变量表act_ru_variableact_ru_variable 正在执行的流程变量表正在执行的流程变量表act_hi_variableact_hi_variable 流程变量历史表流程变量历史表3.3.核心核心 APIAPI3.1 ProcessEngine3.1 ProcessEngine说明说明:1)1)在在 ActivitiActiviti 中最核心的类,中最核心的类,其他的类都是由其他的类都是由他而来。他而来。2)2)产生方式产生方式ProcessEngineProcessEngine3 3)可以产生)可以产生 RepositoryServic
18、eRepositoryServiceRepositoryServiceRepositoryService4)4)可以产生可以产生 RuntimeService RuntimeServiceRuntimeServiceRuntimeServiceruntimeServiceruntimeService=repositoryServicerepositoryService=processEngineprocessEngine.getRepositoryService();.getRepositoryService();processEngineprocessEngine=ProcessEngine
19、s.ProcessEngines.getDefaultProcessEnginegetDefaultProcessEngine();();processEngineprocessEngine.getRuntimeService();.getRuntimeService();5)5)可以产生可以产生 TaskServiceTaskServiceTaskServiceTaskService各个各个 ServiceService 的作用的作用RepositoryServiceRepositoryServiceRuntimeServiceRuntimeService管理流程定义管理流程定义执行管理,包
20、括启动,执行管理,包括启动,推进,删除流程实例等推进,删除流程实例等操作操作TaskServiceTaskService3.2RepositoryService3.2RepositoryServicetaskServicetaskService=processEngineprocessEngine.getTaskService();.getTaskService();任务管理任务管理ActivitiActiviti 的仓库服务类。所谓的仓库指流程定的仓库服务类。所谓的仓库指流程定义文档的两个文件:义文档的两个文件:bpmnbpmn 文件和流程图片文件和流程图片该该 serviceservice
21、 可以用来删除部署的流程定义。可以用来删除部署的流程定义。3.3RuntimeService3.3RuntimeService是是 ActivitiActiviti 的流程执行服务类,可以从这个服的流程执行服务类,可以从这个服务类中获取很多关于流程执行的相关的信息。务类中获取很多关于流程执行的相关的信息。3.4TaskService3.4TaskService是是 ActivitiActiviti 的任务服务类。可以从这个类中获的任务服务类。可以从这个类中获取任务的相关信息,取任务的相关信息,如当前正在执行的个人待办如当前正在执行的个人待办和用户组待办任务。和用户组待办任务。3.5Histor
22、yService3.5HistoryService是是 ActivitiActiviti 的查询历史信息的类,在一个流程的查询历史信息的类,在一个流程执行完成后,这个对象为我们提供查询历史信执行完成后,这个对象为我们提供查询历史信息,息,可以跟踪流程实例对应所有待办节点的运行可以跟踪流程实例对应所有待办节点的运行情况。情况。3.6ProcessDefinition3.6ProcessDefinition流程定义类,可以从这里获得资源文件等。流程定义类,可以从这里获得资源文件等。3.7ProcessInstance3.7ProcessInstance代表流程定义的执行实例,代表流程定义的执行实例
23、,当一个部署的流程图当一个部署的流程图启动后,启动后,该流程只有一条流程实例数据,该流程只有一条流程实例数据,但是它但是它的流程任务可以有多个,的流程任务可以有多个,每个任务对应流程图中每个任务对应流程图中相应的流程节点。相应的流程节点。4.4.入门入门 HelloWorldHelloWorld 程序程序4.14.1 创建流程图方法创建流程图方法点击点击 ActivitiTestActivitiTest 项目,在项目,在 src/main/javasrc/main/java 目目录下创建一个录下创建一个 diagramsdiagrams 目录用来存放流程图目录用来存放流程图在当前项目右键选择在
24、当前项目右键选择 Activiti DiagramActiviti Diagram 流程图流程图输入流程图名称输入流程图名称 HelloWorldHelloWorld,然后点击,然后点击 OKOK,在控制面板的右边栏有相关的画图图标操作在控制面板的右边栏有相关的画图图标操作其中一个流程必须包含一个开始节点和一个结其中一个流程必须包含一个开始节点和一个结束节点,结束节点可以有多个。束节点,结束节点可以有多个。然后使用然后使用StartEvent,StartEvent,UserTask,EndEventUserTask,EndEvent 画出画出下下 面面 的的 流流 程程 图图,然然 后后 用用
25、 ConnectionConnection 中中 的的SequenceFlowSequenceFlow 连线连接起来。连线连接起来。4.24.2 创建流程图,如下图创建流程图,如下图4.34.3 指定流程图名称,指定流程图名称,IDID 和和 UserTaskUserTask 的处理人的处理人1 1)选中第一个节点,在)选中第一个节点,在 General General 中的中的 namename 属属性中输入当前节点的名称性中输入当前节点的名称,在在 Main configMain config 中的中的AssigneeAssignee 中输入该节点的处理人,然后以此类中输入该节点的处理人,
26、然后以此类推将推将 3 3 个节点的值设置完成。个节点的值设置完成。,2 2)然后在流程图旁边的空白出点击一下,输入)然后在流程图旁边的空白出点击一下,输入流程的流程的 IDID 和和 NameName 值,然后保存值,然后保存4.44.4 将流程图部署到将流程图部署到 ActivitiActiviti 的数据表中的数据表中启动完成后在启动完成后在 act_re_deploymentact_re_deployment 流程部署表流程部署表和和 act_re_procdefact_re_procdef 流程定义表中会有对应的数流程定义表中会有对应的数据信息据信息.4.54.5 启动流程实例启动流
27、程实例其其中中runtimeServiceruntimeService.startProcessInstanceByKey(.startProcessInstanceByKey(HelloWorldKeyHelloWorldKey););中的中的 HelloWorldKeyHelloWorldKey 对应流对应流程程 图图 中中 的的IDID值值,在在 数数 据据 表表 中中 对对 应应act_re_procdefact_re_procdef 流程定义表中的流程定义表中的 keykey 字段字段启动完流程后在启动完流程后在 act_ru_executionact_ru_execution 表中
28、会产生表中会产生一条数据,这条数据为当前流程正在执行的任一条数据,这条数据为当前流程正在执行的任务,务,其中其中 act_id_act_id_字段的值对应流程图节点的字段的值对应流程图节点的 IDID值值在在 act_ru_taskact_ru_task表表 中中 会会 产产 生生 一一 条条 任任 务务 数数据据,execution_id_,execution_id_对对应应 act_ru_executionact_ru_execution 主主键,键,proc_inst_id_proc_inst_id_为流程实例为流程实例 IDID,name_name_值为值为流程节点名称,流程节点名称,
29、assignee_assignee_字段为该待办当前的字段为该待办当前的处理人处理人4.64.6 查询待办任务查询待办任务指定查询张三的待办,指定查询张三的待办,可以查询出待办为第一个可以查询出待办为第一个节点的处理任务。节点的处理任务。4.74.7 完成待办任务完成待办任务其中其中 taskIdtaskId 对应对应 act_ru_taskact_ru_task 表的主键表的主键 IDID,因,因为当前待办任务为第一个节点提交申请,为当前待办任务为第一个节点提交申请,当执行当执行完这个待办后下一条待办数据将会流转到审批完这个待办后下一条待办数据将会流转到审批【部门经理】【部门经理】那,那,然
30、后以此类推可以将部门经理然后以此类推可以将部门经理和总经理的待办任务全部查询和执行完成。和总经理的待办任务全部查询和执行完成。5.5.查询和删除流程定义查询和删除流程定义1 1)查询流程定义)查询流程定义2)2)删除流程定义删除流程定义6.6.流程变量操作流程变量操作6.16.1 设置流程变量设置流程变量1 1)设置流程变量有多种方式,设置流程变量有多种方式,可以在流程启动,可以在流程启动,和任务执行的时候设置和任务执行的时候设置a.a.启动流程的时候设置启动流程的时候设置b.b.通过通过taskServicetaskService或者或者runtimeServiceruntimeServic
31、e 设置设置提示:如果设置的流程变量值是一个对象类型,提示:如果设置的流程变量值是一个对象类型,这个对象必须实现序列化这个对象必须实现序列化SerializableSerializable操作操作,并且要并且要为该对象类指定一个为该对象类指定一个 版本版本 IDID6.26.2 获取流程变量获取流程变量见工程操作见工程操作7.7.流程连线流程连线在画流程图的时候可以对流程的连线设置表达在画流程图的时候可以对流程的连线设置表达式,然后在执行的时候设置流程变量值,然后式,然后在执行的时候设置流程变量值,然后ActivitiActiviti 会根据对应的值走对应的节点会根据对应的值走对应的节点点击一
32、条连线,在点击一条连线,在 Main configMain config中的中的 ConditionCondition属性值中设置属性值中设置$message=$message=同意同意,另外一条线另外一条线设置为设置为$message=$message=不同意不同意,然后在代码中设然后在代码中设置对应流程变量值。置对应流程变量值。见工程操作见工程操作8.8.排他网关排他网关如下图如下图,其中黑色的叉叉对应其中黑色的叉叉对应 eclipseeclipse 画流程图画流程图图标中的图标中的 ExclusiveGateWayExclusiveGateWay 图标图标然后对每条线的然后对每条线的 C
33、onditionCondition 属性指定对应的表属性指定对应的表达式,达式,然后在执行任务时候设置对应的流程变量然后在执行任务时候设置对应的流程变量ActivitiActiviti 会根据变量的值来判断对应连线中的会根据变量的值来判断对应连线中的表达式走对应的流程节点路线。表达式走对应的流程节点路线。见工程操作见工程操作9.9.并行网关并行网关十字图标对应图标中的十字图标对应图标中的 ParallelGatewayParallelGateway并行网关不需要指定连线的表达式,并行网关不需要指定连线的表达式,当流程流转当流程流转到并行任务时会出发多个任务,到并行任务时会出发多个任务,当多个任
34、务完成当多个任务完成后在会将流程流转到下一个节点后在会将流程流转到下一个节点见工程操作见工程操作10.10.个人任务的三种指定方式个人任务的三种指定方式10.110.1 在在 AssigneeAssignee 中指定任务具体的处理人中指定任务具体的处理人10.210.2 在在 AssigneeAssignee 中指定任务的处理人或角色变量中指定任务的处理人或角色变量当指定当指定 AssigneeAssignee 为一个变量值后需要在代码中为一个变量值后需要在代码中设置对应的处理人,比如在启动的时候设置设置对应的处理人,比如在启动的时候设置userIduserId 的值的值在在工工程程中中可可以
35、以将将起起草草人人的的处处理理变变量量设设置置为为userIduserId,审批人的处理变量设置为,审批人的处理变量设置为 appUserIdappUserId,然后通过业务模块和登录人来获取对应模块的然后通过业务模块和登录人来获取对应模块的审批人。审批人。10.310.3 为任务节点设置一个监听类来设置当前节点的处理人为任务节点设置一个监听类来设置当前节点的处理人如果设置了监听类就不需要在设置如果设置了监听类就不需要在设置 AssigneeAssignee 的的值值1 1)创建一个监听器类,需要实现)创建一个监听器类,需要实现TaskListenerTaskListener接口接口2)2)点
36、击任务节点,点击任务节点,选择选择 ListenerListener 选项卡,选项卡,点击点击NewNew,将,将 EventEvent 的值改为的值改为 createcreate然后选择创建的然后选择创建的 TaskListenerImplTaskListenerImpl 实现类实现类然后当任务到达该节点后然后当任务到达该节点后 ActivitiActiviti 会触发监听会触发监听实现类的实现类的 notifynotify 方法方法11.11.组任务的三种指定方式组任务的三种指定方式11.111.1 在任务节点中设置在任务节点中设置 CandidateuserCandidateuser 候选人候选人设置的候选处理人用英文输入法的逗号隔开,设置的候选处理人用英文输入法的逗号隔开,当当任务到达该节点后,任务到达该节点后,设置的候选人其中任何一个设置的候选人其中任何一个人都可以处理当前待办,处理完成后待办结束。人都可以处理当前待办,处理完成后待办结束。11.211.2 在在 CandidateuserCandidateuser 中设置一个变量作为处理人中设置一个变量作为处理人然后通过启动或者执行流程向下传递的时候设然后通过启动或者执行流程向下传递的时候设置该流程变量值置该流程变量值