JBPM学习(三):管理流程定义
概念:
ProcessDefinition,流程定义:一个流程的步骤说明,如一个请假流程、报销流程、是一个规则。
ProcessDefinition,流程定义对象,是解析.jpdl.xml文件得到流程步骤的信息。没有更新操作,启动流程实例时是使用指定key的最新的版本。
1.部署流程定义
a)一次添加一个资源,相关文件在Classpath中
// 1,部署流程定义(添加) // jbpm4_deployment // jbpm4_deployprop // jbpm4_lob @Test public void deploy_1() { String deploymentId = processEngine.getRepositoryService()// .createDeployment()//创建一个部署对象,Deployment:一次部署的信息,含有多个文件 .addResourceFromClasspath("helloworld/test.jpdl.xml")//往Deployment对象添加资源 .addResourceFromClasspath("helloworld/test.png")// .deploy();//执行部署 System.out.println("deploymentId = " + deploymentId); }
b)一次添加多个资源,多个资源先打成zip包
@Test public void deploy_2() { // 找到zip文件 InputStream in = this.getClass().getClassLoader().getResourceAsStream("helloworld/helloworld.zip"); ZipInputStream zipInputStream = new ZipInputStream(in); // 部署 String deploymentId = processEngine.getRepositoryService()// .createDeployment()// .addResourcesFromZipInputStream(zipInputStream)// .deploy(); System.out.println("deploymentId = " + deploymentId); }
c)说明
1, addResourceFromClasspath(resource); 可以调用多次以添加多个文件。文件重复添加也不会报错。
2, addResourceFromInputStream(resourceName, inputStream)添加一个文件(使用InputStream)
3, addResourcesFromZipInputStream(zipInputStream)添加多个文件,里面也可以有文件夹。
4, 以上方法可以在一起调用。
2.查询所有流程定义
a) 查询所有流程定义
@Test public void findAll() { // 查询 List<ProcessDefinition> list = processEngine.getRepositoryService()// .createProcessDefinitionQuery()// .orderAsc(ProcessDefinitionQuery.PROPERTY_KEY)//排序条件 //.count()查询出总数量 //.page(0, 100)分页,取出前100条记录 .list(); // 显示 for (ProcessDefinition pd : list) { System.out.println("id=" + pd.getId()// 格式为:{key}-{version} + ", name=" + pd.getName()// 流程定义文件(.jpdl.xml)中根元素的name属性的值 + ", key=" + pd.getKey()// 流程定义文件(.jpdl.xml)中根元素的key属性的值,可以不写,不写就是name属性的值 + ", version=" + pd.getVersion()// 流程定义文件(.jpdl.xml)中根元素的version属性的值,可以不写,不写就会自增(key相同时,版本加1) + ", deploymentId=" + pd.getDeploymentId()); // 本流程定义对应的 .jpdl.xml 文件所属的Deployment对象的id } }
b) 查询所有最新版本的流程定义
@Test public void findAllLatestVersions() { // 1,查询所有流程定义,按Version升序排列,这样所有最大的版本就都排到最后了 List<ProcessDefinition> allList = processEngine.getRepositoryService()// .createProcessDefinitionQuery()// .orderAsc(ProcessDefinitionQuery.PROPERTY_VERSION)// // .processDefinitionName("test")// // .orderAsc(ProcessDefinitionQuery.PROPERTY_KEY)// // .orderDesc(ProcessDefinitionQuery.PROPERTY_KEY)// // .uniqueResult() // .count() // .page(firstResult, maxResults) .list(); // 2,过滤出所需的最新版本的流程定义 Map<String, ProcessDefinition> map = new HashMap<String, ProcessDefinition>(); for (ProcessDefinition pd : allList) { map.put(pd.getKey(), pd);//不同的key会保存最新的版本(上面已经按版本升序排列) } // 显示 for (ProcessDefinition pd : map.values()) { System.out.println("id=" + pd.getId()// 格式为:{key}-{version} + ", name=" + pd.getName()// 流程定义文件(.jpdl.xml)中根元素的name属性的值 + ", key=" + pd.getKey()// 流程定义文件(.jpdl.xml)中根元素的key属性的值,可以不写,不写就是name属性的值 + ", version=" + pd.getVersion()// 流程定义文件(.jpdl.xml)中根元素的version属性的值,可以不写,不写就会自增(key相同时,版本加1) + ", deploymentId=" + pd.getDeploymentId()); // 本流程定义对应的 .jpdl.xml 文件所属的Deployment对象的id } }
3.删除流程定义(其实是删除Deployment)
void deleteDeployment(java.lang.String deploymentId):删除一个部署如果过程定义没有运行执行。历史信息(如果有的话)是在数据库中。
void deleteDeploymentCascade(java.lang.String deploymentId):删除部署,包含过程定义,相关流程实例和他们的历史信息
a) 删除某个Deployment
@Test public void deleteById() { String deploymentId = "1"; // // 删除某Deployment,如果有关联的执行信息,就抛异常 // processEngine.getRepositoryService().deleteDeployment(deploymentId); // 删除某Deployment,如果有关联的执行信息,就级联删除 processEngine.getRepositoryService().deleteDeploymentCascade(deploymentId); }
b) 删除指定key的所有版本的流程定义
@Test public void deleteByKey() { // 1,查询出指定key的所有版本的流程定义 List<ProcessDefinition> list = processEngine.getRepositoryService()// .createProcessDefinitionQuery()// .processDefinitionKey("helloworld")// .list(); // 2,循环删除 for (ProcessDefinition pd : list) { processEngine.getRepositoryService().deleteDeploymentCascade(pd.getDeploymentId()); } }
4.获取部署时的某文件的资源(查看流程图)
a) 查看流程图
@Test public void getResourceFromDeployment() throws Exception { String deploymentId = "50001"; String resourceName = "helloworld/test.png"; // 指定的是 jbpm4_lob 表中的name_列的值 // 获取某Deployment中所有文件资源的名称 Set<String> names = processEngine.getRepositoryService().getResourceNames(deploymentId); for (String name : names) { System.out.println(name); } // 获取某Deployment中指定名称的资源 InputStream in = processEngine.getRepositoryService().getResourceAsStream(deploymentId, resourceName); // 保存到"c:/"中 OutputStream out = new FileOutputStream("c:/process.png"); for (int b = -1; (b = in.read()) != -1;) { out.write(b); } in.close(); out.close(); }
5.获取流程图中某活动的坐标(不重要)
String processDefinitionId = "test-1"; // 流程定义的id String activityName = "start1"; // 活动的名称 ActivityCoordinates c = processEngine.getRepositoryService().getActivityCoordinates(processDefinitionId, activityName); System.out.println("x=" + c.getX() + ",y=" + c.getY() + ",width=" + c.getWidth() + ",height=" + c.getHeight());