流程定义查询
查询部署的流程定义。
/** * 查询流程定义信息 //act_re_procdef */ public class QueryProcessDefinition { public static void main(String[] args) { //1.得到ProcessEngine对象 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //2.创建RepositoryService对象 RepositoryService repositoryService = processEngine.getRepositoryService(); //3.得到ProcessDefinitionQuery对象,可以认为它就是一个查询器 ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery(); //4.设置条件,并查询出当前的所有流程定义 查询条件:流程定义的key=holiday //orderByProcessDefinitionVersion() 设置排序方式,根据流程定义的版本号进行排序 List<ProcessDefinition> list = processDefinitionQuery.processDefinitionKey("holiday") .orderByProcessDefinitionVersion() .desc().list(); //5.输出流程定义信息 for(ProcessDefinition processDefinition :list){ System.out.println("流程定义ID:"+processDefinition.getId()); System.out.println("流程定义名称:"+processDefinition.getName()); System.out.println("流程定义的Key:"+processDefinition.getKey()); System.out.println("流程定义的版本号:"+processDefinition.getVersion()); System.out.println("流程部署的ID:"+processDefinition.getDeploymentId()); } } }
其实查的就是act_re_procdef,这个表信息
流程定义删除
删除已经部署成功的流程定义
/** * 删除已经部署的流程定义 * * 背后影响的表: * act_ge_bytearray act_re_deployment act_re_procdef */ public class DeleteProcessDefinition { /** * 注意事项: * 1.当我们正在执行的这一套流程没有完全审批结束的时候,此时如果要删除流程定义信息就会失败 * 2.如果公司层面要强制删除,可以使用repositoryService.deleteDeployment("1",true); * //参数true代表级联删除,此时就会先删除没有完成的流程结点,最后就可以删除流程定义信息 false的值代表不级联 * * @param args */ public static void main(String[] args) { //1.得到ProcessEngine对象 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //2.创建RepositoryService对象 RepositoryService repositoryService = processEngine.getRepositoryService(); //3.执行删除流程定义 参数代表流程部署的id repositoryService.deleteDeployment("1"); } }
说明:
1) 使用 repositoryService 删除流程定义
2) 如果该流程定义下没有正在运行的流程,则可以用普通删除。
3) 如果该流程定义下存在已经运行的流程,使用普通删除报错,可用级联删除方法将流程及相关
记录全部删除。项目开发中使用级联删除的情况比较多,删除操作一般只开放给超级管理员使
用。
资源的查询
/** * 需求: * 1.从Activiti的act_ge_bytearray表中读取两个资源文件 * 2.将两个资源文件保存到路径: * * 技术方案: * 1.第一种方式使用actviti的api来实现 * 2.第二种方式:其实就是原理层面,可以使用jdbc的对blob类型,clob类型数据的读取,并保存 * IO流转换,最好commons-io.jar包可以轻松解决IO操作 * * 真实应用场景:用户想查看这个请假流程具体有哪些步骤要走? * * */ public class QueryBpmnFile { public static void main(String[] args) throws IOException { //1.得到ProcessEngine对象 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //2.得到RepositoryService对象 RepositoryService repositoryService = processEngine.getRepositoryService(); //3.得到查询器:ProcessDefinitionQuery对象 ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery(); //4.设置查询条件 // processDefinitionQuery.processDefinitionKey("holiday");//参数是流程定义的key processDefinitionQuery.processDefinitionId("holiday:2:15004"); //5.执行查询操作,查询出想要的流程定义 ProcessDefinition processDefinition = processDefinitionQuery.singleResult(); //6.通过流程定义信息,得到部署ID String deploymentId = processDefinition.getDeploymentId(); //7.通过repositoryService的方法,实现读取图片信息及bpmn文件信息(输入流) //getResourceAsStream()方法的参数说明:第一个参数部署id,第二个参数代表资源名称 //processDefinition.getDiagramResourceName() 代表获取png图片资源的名称 //processDefinition.getResourceName()代表获取bpmn文件的名称 InputStream pngIs = repositoryService .getResourceAsStream(deploymentId,processDefinition.getDiagramResourceName()); InputStream bpmnIs = repositoryService .getResourceAsStream(deploymentId,processDefinition.getResourceName()); //8.构建出OutputStream流 OutputStream pngOs = new FileOutputStream("F:\"+processDefinition.getDiagramResourceName()); OutputStream bpmnOs = new FileOutputStream("F:\"+processDefinition.getResourceName()); //9.输入流,输出流的转换 commons-io-xx.jar中的方法 IOUtils.copy(pngIs,pngOs); IOUtils.copy(bpmnIs,bpmnOs); //10.关闭流 pngOs.close(); bpmnOs.close(); pngIs.close(); bpmnIs.close(); } }
说明:
1) deploymentId 为流程部署 ID
2) resource_name 为 act_ge_bytearray表中 NAME_列的值
3) 使用repositoryService的getDeploymentResourceNames方法可以获取指定部署下得所有文件的名
称
4) 使用 repositoryService 的 getResourceAsStream 方法传入部署 ID和资源图片名称可以获取部署下
指定名称文件的输入流
5) 最后的将输入流中的图片资源进行输出。
流程历史信息的查看
即使流程定义已经删除了,流程执行的历史信息通过前面的分析,依然保存在 activiti 的 act_hi_*相
关的表中。所以我们还是可以查询流程执行的历史信息,可以通过 HistoryService 来查看相关的历史
记录。
/** * 需求: * 历史数据的查看 * * */ public class HistoryQuery { public static void main(String[] args) throws IOException { //1.得到ProcessEngine对象 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //2.得到HistoryService HistoryService historyService = processEngine.getHistoryService(); //3.得到HistoricActivitiInstanceQuery对象 HistoricActivityInstanceQuery historicActivityInstanceQuery = historyService.createHistoricActivityInstanceQuery(); historicActivityInstanceQuery.processInstanceId("2501");//设置流程实例的id //4.执行查询 List<HistoricActivityInstance> list = historicActivityInstanceQuery .orderByHistoricActivityInstanceStartTime().asc().list();//排序StartTime //5.遍历查询结果 for (HistoricActivityInstance instance :list){ System.out.println(instance.getActivityId()); System.out.println(instance.getActivityName()); System.out.println(instance.getProcessDefinitionId()); System.out.println(instance.getProcessInstanceId()); System.out.println("============================="); } } }
_2 StartEvent holiday:1:4 2501 ============================= _3 填写请假申请单 holiday:1:4 2501 ============================= _4 部门经理审批 holiday:1:4 2501 ============================= _5 总经理审批 holiday:1:4 2501 ============================= _6 EndEvent holiday:1:4 2501 ============================= Process finished with exit code 0