Activiti入门案例
一、流程定义
Activiti-Designer 使用
Palette(画板)
在eclipse 或 idea 中安装activiti-designer 插件即可使用,画板中包括以下结点:
Connection—连接Event---事件Task---任务Gateway---网关Container—容器
Boundary event—边界事件Intermediate event- -中间事件
流程图设计完毕保存生成.bpmn 文件。
1、新建流程(IDEA 工具)
首先选中存放图形的目录(本次我们选择resources 下的bpmn 目录),点击菜单:New-BpmnFile,如下图所示:
2、创建hoilday.bpmn,绘制流程
3、生成流程图
①首先将.bpmn文件改为.xml文件
②然后右键该xml文件Diagrams--->show BPMN 2.0 Designer就能生成一张流程图,将流程图导出保存到项目对应目录即可
③然后将.xml改回.bpmn即可
注意:
流程图生成前须设置编码格式然后重启IDEA!!!
-Dfile.encoding=UTF-8
二、部署流程定义
部署流程定义就是要将上边绘制的图形即流程定义(.bpmn)部署在工作流引擎activiti中
1、使用ProcessEngine创建RepositoryService
package com.zn; import org.activiti.engine.ProcessEngine; import org.activiti.engine.ProcessEngines; import org.activiti.engine.RepositoryService; import org.activiti.engine.repository.Deployment; import org.junit.Test; public class ActivitiTest { /*流程部署 * `act_ge_bytearray` 流程定义的资源信息,包含bpmn和png流程文件信息 * `act_re_deployment` 流程部署信息 包含流程名称,ID,key等 * `act_re_procdef` 流程定义信息 * */ @Test public void deployment(){ //获取ProcessEngine对象 默认配置文件名称:activiti.cfg.xml 并且configuration的Bean实例ID为processEngineConfiguration ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //获取RepositoryService对象进行流程部署 RepositoryService repositoryService = processEngine.getRepositoryService(); //进行部署,将对应的流程定义文件生成到数据库当中,作为记录进行保存 Deployment deployment = repositoryService.createDeployment() //加载流程文件 .addClasspathResource("bpmnFiles/holiday.bpmn") .addClasspathResource("bpmnFiles/holiday.png") //设置流程名称 .name("请假流程") .key("holidayKey") //部署 .deploy(); //输出部署信息 System.out.println("流程名称:"+deployment.getName()); System.out.println("流程ID:"+deployment.getId()); System.out.println("流程Key:"+deployment.getKey()); } }
2、执行操作控制台效果
3、数据库展示
执行操作后activiti会将上边代码中执行的bpmn文件和图片文件保存在activiti数据库中;
三、启动一个流程实例
流程定义部署在activiti后就可以通过工作流管理业务流程了,也就是说上边部署的请假申请流程可以使用了;
针对该流程,启动一个流程表示发起一个新的请假申请单,这就相当于java类与java对象的关系,类定义好后需要new创建一个对象使用,当然可以new多个对象;对于请假申请流程,张三发起一个请假申请需要启动一个流程实例,请假申请单发起一个请假单也需要启动一个流程实例;
1、代码实现
package com.zn; import org.activiti.engine.ProcessEngine; import org.activiti.engine.ProcessEngines; import org.activiti.engine.RepositoryService; import org.activiti.engine.RuntimeService; import org.activiti.engine.repository.Deployment; import org.activiti.engine.runtime.ProcessInstance; import org.junit.Test; public class ActivitiTest { /** * 启动流程实例 * `act_hi_actinst` 已开始和执行完毕的活动信息 * `act_hi_identitylink` 历史参与者信息 * `act_hi_procinst` 流程实例信息 * `act_hi_taskinst` 历史任务实例 * act_ru_execution 任务执行信息 * act_ru_identitylink 当前任务参与者 * `act_ru_task` 任务信息 * */ @Test public void startInstance(){ //获取ProcessEngine对象 默认配置文件名称:activiti.cfg.xml 并且configuration的Bean实例ID为processEngineConfiguration ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //获取到RuntimeService对象 RuntimeService runtimeService = processEngine.getRuntimeService(); //创建流程实例 ProcessInstance holiday = runtimeService.startProcessInstanceByKey("holiday"); //输出实例信息 System.out.println("流程部署ID:"+holiday.getDeploymentId()); System.out.println("流程实例ID:"+holiday.getId()); System.out.println("活动ID:"+holiday.getActivityId()); } }
2、执行操作控制台效果
3、数据库展示
四、任务查询
流程启动后,各个任务的负责人就可以查看自己当前需要处理的任务,查询出来的任务都是该用户的代办任务;
1、代码实现
package com.zn; import org.activiti.engine.*; import org.activiti.engine.history.HistoricActivityInstance; import org.activiti.engine.history.HistoricActivityInstanceQuery; import org.activiti.engine.repository.Deployment; import org.activiti.engine.runtime.ProcessInstance; import org.activiti.engine.task.Task; import org.junit.Test; import java.util.List; public class ActivitiTest { /** * 查看代办任务 */ @Test public void getTask(){ //获取ProcessEngine对象 默认配置文件名称:activiti.cfg.xml 并且configuration的Bean实例ID为processEngineConfiguration ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //获取一个TaskService对象 TaskService taskService=processEngine.getTaskService(); //查询代办业务 createTaskQuery查询任务 taskCandidateOrAssigned查询任务执行者 processDefinitionKey:查询流程 /** * taskCandidateOrAssigned匹配规则:1.Assigned 2.配置bpmn文件中定义的值 * taskAssignee匹配规则:1.Assigned */ //List<Task> list=taskService.createTaskQuery().taskCandidateOrAssigned("zhangsan").processDefinitionKey("holiday").list(); //taskAssignee查看当前指定人的指定任务 List<Task> list = taskService.createTaskQuery().taskAssignee("lisi").processDefinitionKey("holiday").list(); //分页:List<Task> list = taskService.createTaskQuery().taskAssignee("zhangsan").processDefinitionKey("holiday").listPage(i,j); for (Task task:list){ System.out.println("任务名称:"+task.getName()); System.out.println("任务执行人:"+task.getAssignee()); System.out.println("任务ID:"+task.getId()); System.out.println("流程实例ID:"+task.getProcessInstanceId()); } } }
2、执行操作控制台效果
3、数据库
五、任务处理
任务负责人查询代办任务,选择任务进行处理,完成任务;
1、代码实现
package com.zn; import org.activiti.engine.*; import org.activiti.engine.repository.Deployment; import org.activiti.engine.runtime.ProcessInstance; import org.activiti.engine.task.Task; import org.junit.Test; import java.util.List; public class ActivitiTest { /*任务处理 * `act_hi_identitylink` 历史参与者信息 * `act_hi_taskinst` 历史任务信息 * `act_ru_execution` 任务执行信息 * `act_ru_task` 任务信息 * 当所有任务处理完毕,对应当前流程实例信息删除,但是可以在历史中查看该信息 * */ @Test public void completeTask(){ //获取ProcessEngine对象 默认配置文件名称:activiti.cfg.xml 并且configuration的Bean实例ID为processEngineConfiguration ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //获取一个TaskService对象 TaskService taskService = processEngine.getTaskService(); //任务处理 taskService.complete("35005"); } }
2、执行操作控制台效果
3、数据库展示
4、任务查询(经理审批)控制台效果
5、任务处理(经理审批)后数据库显示
6、任务查询(总经理审批)控制台效果
7、再次任务处理(总经理审批)后数据库显示
8、任务查询(人事审批)控制台效果
9、再次任务处理(人事审批)后数据库显示
10、至此流程结束
六、查看历史任务
1、代码实现
package com.zn; import org.activiti.engine.*; import org.activiti.engine.history.HistoricActivityInstance; import org.activiti.engine.history.HistoricActivityInstanceQuery; import org.activiti.engine.repository.Deployment; import org.activiti.engine.runtime.ProcessInstance; import org.activiti.engine.task.Task; import org.junit.Test; import java.util.List; public class ActivitiTest { /** * 查看历史任务 */ @Test public void getHistory() { //获取ProcessEngine对象 默认配置文件名称:activiti.cfg.xml 并且configuration的Bean实例ID为processEngineConfiguration ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //获取HistoryService接口 HistoryService historyService = processEngine.getHistoryService(); //获取历史任务 HistoricActivityInstanceQuery historicActivityInstanceQuery = historyService.createHistoricActivityInstanceQuery(); //获取指定流程实例的任务 historicActivityInstanceQuery.processInstanceId("35001"); //获取任务列表 List<HistoricActivityInstance> list = historicActivityInstanceQuery.list(); for (HistoricActivityInstance ai : list) { System.out.println("任务节点ID:"+ai.getActivityId()); System.out.println("任务节点名称:"+ai.getActivityName()); System.out.println("流程实例ID信息:"+ai.getProcessDefinitionId()); System.out.println("流程实例ID信息:"+ai.getProcessInstanceId()); System.out.println("=============================="); } } }
2、控制台效果