JBPM工作流(四)——管理流程定义
概念:
ProcessDefinition,流程定义:一个流程的步骤说明,如一个请假流程、报销流程、是一个规则。
ProcessDefinition,流程定义对象,是解析.jpdl.xml文件得到流程步骤的信息。没有更新操作,启动流程实例时是使用指定key的最新的版本。
1.部署流程定义
a)一次添加一个资源,相关文件在Classpath中
| 1 2 3 4 5 6 7 8 9 10 11 12 13 | // 1,部署流程定义(添加)    // jbpm4_deployment    // jbpm4_deployprop    // jbpm4_lob    @Test    publicvoiddeploy_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包
| 1 2 3 4 5 6 7 8 9 10 11 12 13 | @Test    publicvoiddeploy_2() {        // 找到zip文件        InputStream in = this.getClass().getClassLoader().getResourceAsStream("helloworld/helloworld.zip");        ZipInputStream zipInputStream = newZipInputStream(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) 查询所有流程定义
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | @Test    publicvoidfindAll() {        // 查询        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) 查询所有最新版本的流程定义
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | @Test    publicvoidfindAllLatestVersions() {        // 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 = newHashMap<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
| 1 2 3 4 5 6 7 8 | @Test    publicvoiddeleteById() {        String deploymentId = "1";        // // 删除某Deployment,如果有关联的执行信息,就抛异常        // processEngine.getRepositoryService().deleteDeployment(deploymentId);        // 删除某Deployment,如果有关联的执行信息,就级联删除        processEngine.getRepositoryService().deleteDeploymentCascade(deploymentId);    } | 
b) 删除指定key的所有版本的流程定义
| 1 2 3 4 5 6 7 8 9 10 11 12 13 | @Test    publicvoiddeleteByKey() {        // 1,查询出指定key的所有版本的流程定义        List<ProcessDefinition> list = processEngine.getRepositoryService()//                .createProcessDefinitionQuery()//                .processDefinitionKey("helloworld")//                .list();        // 2,循环删除        for(ProcessDefinition pd : list) {            processEngine.getRepositoryService().deleteDeploymentCascade(pd.getDeploymentId());        }    } | 
4.获取部署时的某文件的资源(查看流程图)
a) 查看流程图
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | @Test    publicvoidgetResourceFromDeployment() throwsException {        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 = newFileOutputStream("c:/process.png");        for(intb = -1; (b = in.read()) != -1;) {            out.write(b);        }        in.close();        out.close();    } | 
5.获取流程图中某活动的坐标(不重要)
| 1 2 3 4 5 6 7 | 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()); | 
JBPM工作流(四)——管理流程定义的更多相关文章
- Activiti第二篇【管理流程定义、执行任务和流程实例、流程变量】
		上篇Activiti只是一个快速入门案例,这篇就讲定义.部署.查看任务等等的一些细节[涉及到的数据库表.对象等等]- 管理流程定义 管理流程定义主要涉及到以下的4张表: -- 流程部署相关的表 SEL ... 
- JBPM4.4_管理流程定义
		1. 管理流程定义 没有更新功能 1.1. 部署流程定义 注意区分Deployment与ProcessDefinition 1.1.1. 示例代码1:流程定义有关文件在classpath中 Strin ... 
- 工作流学习——Activiti流程定义管理三步曲 (zhuan)
		http://blog.csdn.net/zwk626542417/article/details/46602419 ***************************************** ... 
- JBPM学习(三):管理流程定义
		概念: ProcessDefinition,流程定义:一个流程的步骤说明,如一个请假流程.报销流程.是一个规则. ProcessDefinition,流程定义对象,是解析.jpdl.xml文件得到流程 ... 
- jBPM学习之部署流程定义
		也许部署流程定义的方法有很多,这里选用的是用Java代码调用工作流引擎提供的部署服务API.在这之前,假设你的Eclipse已经安装好了GPD工作流画图工具,并且学会了画出最简单的HelloWorld ... 
- JBPM表达业务流程(流程定义语言)
		业务流程包括三部分: 活动 Activity / 节点 Node (有很多种,不同的类型有不同的功能,必须要有一个Start Activity) 连线 Transition / 转移 (从一个Acti ... 
- 【Java EE 学习 67 上】【OA项目练习】【JBPM工作流的使用】
		OA项目中有极大可能性使用到JBPM框架解决流程控制问题,比如请假流程.报销流程等等. JBPM:JBoss Business Process Management,翻译过来就是业务流程管理.实际上就 ... 
- WF工作流与管理类应用系统工作流需求实现的一些误区
		如今实现各种应用系统大家都知道工作流是一个非常重要的环节,不同的业务系统的工作流需求是需要找相应的工作流产品去实现的,因为不同工作流产品的架构细节也许会成为某类需求实现的瓶颈. WF ... 
- JBPM工作流(三)——ProcessEngine与Service API
		1.获取processEngine的方法: a) 方法一 private ProcessEngine processEngine = new Configuration().setResource(& ... 
随机推荐
- 最新版Xamarin Mono For Android、Monotouch 安装、破解(实时同步更新)
			以上链接如不是最新,以官方为主,官方更新地址如下:http://xamarin.com/installer_assets/v3/Mac/Universal/InstallationManifest.x ... 
- Eclipse/myEclipse 代码提示/自动提示/自动完成设置
			设置eclipse/myEclipse代码提示可以方便开发者,不用在记住拉杂的单词,只用打出首字母,就会出现提示菜单.如同dreamweaver一样方便. 1.菜单window->Prefere ... 
- Scala编程基础
			Scala与Java的关系... 4 安装Scala. 4 Scala解释器的使用... 4 声明变量... 5 数据类型与操作符... 5 函数调用与apply()函数... 5 if表达式... ... 
- Spring Aop——给Advice传递参数
			给Advice传递参数 Advice除了可以接收JoinPoint(非Around Advice)或ProceedingJoinPoint(Around Advice)参数外,还可以直接接收与切入点方 ... 
- Linux系统复制文件/文件夹到远程服务器
			从一个服务器复制文件到另一个服务器,或者从本地到远程复制是 Linux 管理员的日常任务之一. 我觉得不会有人不同意,因为无论在哪里这都是你的日常操作之一.有很多办法都能处理这个任务,我们试着加以概括 ... 
- Java RandomAccessFile与MappedByteBuffer
			Java RandomAccessFile与MappedByteBuffer https://www.cnblogs.com/guazi/p/6838915.html 
- 尝试新的构造系统 Ninja
			Ninja 是 Chrome 项目的构建工具,用来替换经典工具 make,目前这个开源工具已经被很多其它项目采用.据项目作者描述,创建这个新的构建工具,主要是为了提升大型项目的编译速度. 由于 Nin ... 
- 【go】golang中置new()函数和make()函数的区别
			Go语言中的内建函数new和make是两个用于内存分配的原语(allocation primitives),其功能相似,却有本质区别. 1.new 官方文档 // The new built-in f ... 
- OpenCV 对矩阵进行掩码操作
			Mask operations on matrices https://docs.opencv.org/master/d7/d37/tutorial_mat_mask_operations.html ... 
- 批量生产Xcode group 并映射 实体目录
			xaddgroup A Ruby gem . Batch Add Group To Xcodeproj , map Real Dir. Install $ gem install xaddgroup ... 
