4. Activiti架构简介
activiti.cfg.xml activiti 的引擎配置文件,包括:ProcessEngineConfiguration 的定义、数据源定义、事务管理器等,此文件其实就是一个 spring 配置文件,下面是一个基本的配置只配置了 ProcessEngineConfiguration和数据源。
ProcessEngineConfiguration 流程引擎的配置类,通过 ProcessEngineConfiguration 可以创建工作流引擎 ProceccEngine,常用的两种方法。
ProcessEngine 工作流引擎,相当于一个门面接口,通过 ProcessEngineConfiguration 创建 processEngine,通过ProcessEngine 创建各个 service 接口。
Service 通过ProcessEngine 创建 Service, Service 是工作流引擎提供用于进行工作流部署、执行、管理的服务接口。
5. Activiti入门案例
5.1 流程定义
什么是流程定义流程定义是线下按照 bpmn2.0 标准去描述 业务流程,通常使用 activiti-explorer(web 控制台)或 activiti-eclipse-designer 插件对业务流程进行建模,这两种方式都遵循 bpmn2.0 标准。本教程使用activiti-eclipse-designer 插件完成流程建模。使用 designer 设计器绘制流程,会生成两个文件:.bpmn和.png
创建bpmn文件Palette(画板)
在 eclipse 或 idea 中安装 activiti-designer 插件即可使用,画板中包括以下结点: Connection—连接 Event---事件 Task---任务 Gateway---网关 Container—容器 Boundary event—边界事件 Intermediate event- -中间事件 流程图设计完毕保存生成.bpmn 文件
idea创建bpmn
生成png图片第一步:将 holiday.bpmn 文件改为扩展名 xml 的文件名称:holiday.xml 第二步:在 holiday.xml 文件上面,点右键并选择 Diagrams 菜单,再选择 Show BPMN2.0 Designe
第三步:打开后的效果图如下:
打开如下窗口,注意填写文件名及扩展名,选择好保存图片的位置:
第五步:中文乱码的解决1、 打开IDEA安装路径,找到如下的安装目录;
根据自己所安装的版本来决定,我使用的是 64 位的 idea,所以在 idea64.exe.vmoptions 文件的最后 一行追加一条命令:-Dfile.encoding=UTF-8 如下所示
一定注意,不要有空格,否则重启 IDEA 时会打不开,然后 重启 IDEA,把原来的 png 图片删掉,再重新生成,即可解决乱码问题
5.2 部署流程
什么是流程部署将线下定义的流程部署到 activiti 数据库中,这就是流程定义部署,通过调用 activiti 的 api 将流程定义的 bpmn 和 png 两个文件一个一个添加部署到 activiti 中,也可以将两个文件打成 zip 包进行部署。
单个文件部署方式分别将bpmn 文件和 png 图片文件部署 压缩包部署方式
/** * 流程定义的部署 * activiti表有哪些? * act_re_deployment 部署信息 * act_re_procdef 流程定义的一些信息 * act_ge_bytearray 流程定义的bpmn文件及png文件 * * @author zrj * @date 2020/12/29 * @since V1.0 **/ public class ActivitiDeployment { /** * 方式一 * 分别将 bpmn 文件和 png 图片文件部署 */ @Test public void activitiDeploymentTest() { //1.创建ProcessEngine对象 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //2.得到RepositoryService实例 RepositoryService repositoryService = processEngine.getRepositoryService(); //3.进行部署 Deployment deployment = repositoryService.createDeployment() .addClasspathResource( "diagram/holiday.bpmn" ) .addClasspathResource( "diagram/holiday.png" ) .name( "请假申请单流程" ) .deploy(); //4.输出部署的一些信息 System.out.println( deployment.getName() ); System.out.println( deployment.getId() ); } /** * 方式二 * 将 holiday.bpmn 和 holiday.png 压缩成 zip 包 */ @Test public void activitiDeploymentTest2() { //1.创建ProcessEngine对象 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //2.得到RepositoryService实例 RepositoryService repositoryService = processEngine.getRepositoryService(); //3.转化出ZipInputStream流对象 InputStream is = ActivitiDeployment.class.getClassLoader().getResourceAsStream( "diagram/holidayBPMN.zip" ); //将 inputstream流转化为ZipInputStream流 ZipInputStream zipInputStream = new ZipInputStream( is ); //3.进行部署 Deployment deployment = repositoryService.createDeployment() .addZipInputStream( zipInputStream ) .name( "请假申请单流程" ) .deploy(); //4.输出部署的一些信息 System.out.println( deployment.getName() ); System.out.println( deployment.getId() ); } }
操作数据表
-- activiti表有哪些? -- 部署信息 select * from act_re_deployment ; -- 流程定义的一些信息 select * from act_re_procdef; -- 流程定义的bpmn文件及png文件 select * from act_ge_bytearray;
5.3 启动流程
/** * 启动流程实例: * 前提是先已经完成流程定义的部署工作 * 背后影响的表: * act_hi_actinst 已完成的活动信息 * act_hi_identitylink 参与者信息 * act_hi_procinst 流程实例 * act_hi_taskinst 任务实例 * act_ru_execution 执行表 * act_ru_identitylink 参与者信息 * act_ru_task 任务 * * @author zrj * @date 2020/12/29 * @since V1.0 **/ public class ActivitiStartInstance { public static void main(String[] args) { //1.得到ProcessEngine对象 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //2.得到RunService对象 RuntimeService runtimeService = processEngine.getRuntimeService(); //3.创建流程实例 流程定义的key需要知道 holiday ProcessInstance processInstance = runtimeService.startProcessInstanceByKey( "holiday" ); //4.输出实例的相关信息 System.out.println( "流程部署ID" + processInstance.getDeploymentId() ); System.out.println( "流程定义ID" + processInstance.getProcessDefinitionId() ); System.out.println( "流程实例ID" + processInstance.getId() ); System.out.println( "活动ID" + processInstance.getActivityId() ); } }
5.4 流程定义查询
/** * 流程定义查询 * * @author zrj * @date 2020/12/29 * @since V1.0 **/ public class QueryProceccDefinition { @Test public void queryProceccDefinition() { // 流程定义key String processDefinitionKey = "holiday"; //1.得到ProcessEngine对象 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); // 获取repositoryService RepositoryService repositoryService = processEngine.getRepositoryService(); // 查询流程定义 ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery(); //遍历查询结果 List<ProcessDefinition> list = processDefinitionQuery .processDefinitionKey( processDefinitionKey ) .orderByProcessDefinitionVersion().desc().list(); for (ProcessDefinition processDefinition : list) { System.out.println( "------------------------" ); System.out.println( " 流 程 部 署 id : " + processDefinition.getDeploymentId() ); System.out.println( "流程定义id: " + processDefinition.getId() ); System.out.println( "流程定义名称: " + processDefinition.getName() ); System.out.println( "流程定义key: " + processDefinition.getKey() ); System.out.println( "流程定义版本: " + processDefinition.getVersion() ); } } }
5.5 流程定义删除
/** * 删除指定流程id的流程 */ public void deleteDeployment() { // 流程部署id String deploymentId = "8801"; //1.得到ProcessEngine对象 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); // 通过流程引擎获取repositoryService RepositoryService repositoryService = processEngine.getRepositoryService(); //删除流程定义, 如果该流程定义已有流程实例启动则删除时出错 repositoryService.deleteDeployment( deploymentId ); //设置true 级联删除流程定义,即使该流程有流程实例启动也可以删除,设 //置为false非级别删除方式,如果流程 repositoryService.deleteDeployment( deploymentId, true ); }
5.6 流程定义资源查询
/** * 获取资源 */ @Test public void getProcessResources() throws IOException { // 流程定义id String processDefinitionId = ""; //1.得到ProcessEngine对象 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); // 获取repositoryService RepositoryService repositoryService = processEngine.getRepositoryService(); // 流程定义对象 ProcessDefinition processDefinition = repositoryService .createProcessDefinitionQuery() .processDefinitionId( processDefinitionId ).singleResult(); //获取bpmn String resource_bpmn = processDefinition.getResourceName(); //获取png String resource_png = processDefinition.getDiagramResourceName(); // 资源信息 System.out.println( "bpmn: " + resource_bpmn ); System.out.println( "png: " + resource_png ); File file_png = new File( "d:/purchasingflow01.png" ); File file_bpmn = new File( "d:/purchasingflow01.bpmn" ); // 输出bpmn InputStream resourceAsStream = null; resourceAsStream = repositoryService.getResourceAsStream( processDefinition.getDeploymentId(), resource_bpmn ); FileOutputStream fileOutputStream = new FileOutputStream( file_bpmn ); byte[] b = new byte[1024]; int len = -1; while ((len = resourceAsStream.read( b, 0, 1024 )) != -1) { fileOutputStream.write( b, 0, len ); } // 输出图片 resourceAsStream = repositoryService.getResourceAsStream( processDefinition.getDeploymentId(), resource_png ); fileOutputStream = new FileOutputStream( file_png ); // byte[] b = new byte[1024]; // int len = -1; while ((len = resourceAsStream.read( b, 0, 1024 )) != -1) { fileOutputStream.write( b, 0, len ); } }