Activiti7 基本架构与使用步骤(一)
感觉跟activiti6差不多,不过7中删除了两个service(IdentityService、FormService),反而又多了两个表。这里所有输出的信息都是以后可以放在前端里的信息。
1.Activiti的架构说明
ProcessEngineConfiguration类,主要作用是加载activiti.cfg.xml配置文件
ProcessEngine类 作用是帮助我们可以快速得到各个Service接口,并且可以生成activiti的工作环境 25张表生成
Service接口 作用:可以快速实现数据25张表的操作。
RepositoryService
RuntimeService
TaskService
HistoryService
2.用BPMN的ActivitiDesigner插件绘制流程定义图
3.部署流程定义
方式一:单个文件(bpmn文件,png文件)
/** * 流程定义的部署 * 影响的activiti表有哪些 * act_re_deployment 部署信息 * act_re_procdef 流程定义的一些信息 * act_ge_bytearray 流程定义的bpmn文件以及png文件 */ public class ActivitiDeployment { // 流程定义部署 public static void main(String[] args){ //1.创建ProcessEngine对象 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //2.得到RepositoryService实例 RepositoryService repositoryService = processEngine.getRepositoryService(); //3.进行部署 Deployment deployment = repositoryService.createDeployment()//创建Deployment对象 .addClasspathResource("diagram/holiday.bpmn")//添加bpmn文件 .addClasspathResource("diagram/holiday.png")//添加png文件 .name("请假申请单流程") .deploy();//部署 //4.输出部署的一些信息 System.out.println(deployment.getName()); System.out.println(deployment.getId()); } }
方式二:先将bpmn文件和png文件压缩成zip文件。但是activiti最终也是以单个文件形式保存,说明activiti进行了解压工作。
/** * Zip文件部署流程 * 影响的activiti表有哪些 * act_re_deployment 部署信息 * act_re_procdef 流程定义的一些信息 * act_ge_bytearray 流程定义的bpmn文件以及png文件 */ public class ActivitiZipDeployment { // 流程定义部署 public static void main(String[] args){ //1.创建ProcessEngine对象 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //2.得到RepositoryService实例 RepositoryService repositoryService = processEngine.getRepositoryService(); //3.转换出ZipInputStream流对象 InputStream is = ActivitiZipDeployment.class.getClass().getClassLoader().getResourceAsStream("holidayBPMN.zip"); //将InputStream流转化为ZipInputStream ZipInputStream zipInputStream = new ZipInputStream(is); //3.进行部署 Deployment deployment = repositoryService.createDeployment()//创建Deployment对象 .addZipInputStream(zipInputStream) .name("请假申请单流程") .deploy();//部署 //4.输出部署的一些信息 System.out.println(deployment.getName()); System.out.println(deployment.getId()); } }
4.启动流程实例:
/** * 启动流程实例: * 前提是先已经完成流程定义的部署工作 * * 背后影响的表: * act_hi_actinst 已完成的活动信息 * act_hi_identitylink 参与者信息 * act_hi_procinst 流程实例 * act_hi_taskinst 任务实例 * act_ru_execution 执行表 * act_ru_identitylink 参与者信息 * act_ru_task 任务表 */ public class ActivitiStartInstance { public static void main(String[] args) { //1.得到ProcessEngine对象 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //2.得到RunService对象 RuntimeService runtimeService = processEngine.getRuntimeService(); //3.创建流程实例(关键步骤)即 启动流程实例 //需要知道流程定义的Key:holiday(找key的方法 1:bpmn文件中的id,它对应的值就是key // 2:直接看数据库中流程定义表act_re_procdet的key值) ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("holiday"); //4.输出实例的相关信息 System.out.println("流程部署ID="+processInstance.getDeploymentId());//null System.out.println("流程定义ID="+processInstance.getProcessDefinitionId());//holiday:1:4 System.out.println("流程实例ID="+processInstance.getId());//2501 System.out.println("流程活动ID="+processInstance.getActivityId());//获取当前具体执行的某一个节点的ID(null) } }
5.查看任务
TaskService taskService.createTaskQuery()
/** * 查询当前用户的任务列表 */ public class ActivitiTaskQuery { //lisi完成自己任务列表的查询 public static void main(String[] args) { //1.得到ProcessEngine对象 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //2.得到TaskService对象 TaskService taskService = processEngine.getTaskService(); //3.根据流程定义的key以及负责人assignee来实现当前用户的任务列表查询 List<Task> taskList = taskService.createTaskQuery() .processDefinitionKey("holiday") .taskAssignee("lisi") .list();//这里还有一个查询唯一结果的方法:singleResult();、还有分页查询listPage(index,limit); //4.任务列表展示 for (Task task : taskList) { //查的act_hi_procinst表的id System.out.println("流程实例ID="+task.getProcessInstanceId()); //查的act_hi_taskinst表的id System.out.println("任务ID="+task.getId()); //查的act_hi_taskinst表的Assignee_ System.out.println("任务负责人名称="+task.getAssignee()); //查的act_hi_taskinst表的NAME_ System.out.println("任务名称="+task.getName()); } } }
6.完成任务
TaskService taskService.complete(task.getId());//参数为任务ID
/** * 处理当前用户的任务列表 * 背后操作到的表: * act_hi_actinst * act_hi_identitylink * act_hi_taskinst * act_ru_execution * act_ru_identitylink * act_ru_task //只放当前要执行的任务 */ public class ActivitiCompleteTask { /** * 李四完成自己的任务 * @param args */ public static void main(String[] args) { //1.得到ProcessEngine对象 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //2.得到TaskService对象 TaskService taskService = processEngine.getTaskService(); //3.处理任务,结合当前用户任务列表的查询操作的话,可以知道任务ID=5002(实际操作中应该与查询写在一起) taskService.complete("5002"); } }