概念:

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());

  

JBPM学习(三):管理流程定义的更多相关文章

  1. jBPM学习之部署流程定义

    也许部署流程定义的方法有很多,这里选用的是用Java代码调用工作流引擎提供的部署服务API.在这之前,假设你的Eclipse已经安装好了GPD工作流画图工具,并且学会了画出最简单的HelloWorld ...

  2. Activiti第二篇【管理流程定义、执行任务和流程实例、流程变量】

    上篇Activiti只是一个快速入门案例,这篇就讲定义.部署.查看任务等等的一些细节[涉及到的数据库表.对象等等]- 管理流程定义 管理流程定义主要涉及到以下的4张表: -- 流程部署相关的表 SEL ...

  3. JBPM4.4_管理流程定义

    1. 管理流程定义 没有更新功能 1.1. 部署流程定义 注意区分Deployment与ProcessDefinition 1.1.1. 示例代码1:流程定义有关文件在classpath中 Strin ...

  4. JBPM工作流(四)——管理流程定义

    概念: ProcessDefinition,流程定义:一个流程的步骤说明,如一个请假流程.报销流程.是一个规则. ProcessDefinition,流程定义对象,是解析.jpdl.xml文件得到流程 ...

  5. JBPM学习(五):流程变量

    1.启动流程实例 // 启动流程实例 @Test public void startProcessInstance() { // 使用指定key的最新版本的流程定义启动流程实例 ProcessInst ...

  6. Activiti学习笔记3 — 流程定义

    一.创建流程引擎对象 private ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); 二.发布一个流程 ...

  7. JBPM表达业务流程(流程定义语言)

    业务流程包括三部分: 活动 Activity / 节点 Node (有很多种,不同的类型有不同的功能,必须要有一个Start Activity) 连线 Transition / 转移 (从一个Acti ...

  8. 工作流学习——Activiti流程定义管理三步曲 (zhuan)

    http://blog.csdn.net/zwk626542417/article/details/46602419 ***************************************** ...

  9. Flowable实战(三)流程部署管理

    一.流程定义的版本   当部署流程定义时,数据库中的流程定义会是这个样子: id key name version myProcess:1:676 myProcess My important pro ...

随机推荐

  1. Burp Suite Walkthrough(英文版)

    Burp Suite is one of the best tools available for web application testing. Its wide variety of featu ...

  2. Arrays.sort 与 Collections.sort

    代码如下: package com.wangzhu.arrays; import java.util.Arrays; import java.util.Collections; public clas ...

  3. Handler 接收Parcelable ArrayList时返回空的错误

    遇到一个问题,从handler 接收的Parcelable ArrayList返回空,调试发现这个arraylist生成的时候是有值的,传到handler就没值了 赋值的代码 new Thread(n ...

  4. Structs 原理图

    Struts开源架构很好的实现了MVC模式,MVC即Model-View-Controller的缩写,是一种常用的设计模式.MVC 减弱了业务逻辑接口和数据接口之间的耦合,以及让视图层更富于变化.MV ...

  5. [HDU 4433]locker[DP]

    题意: 给出密码做的现状和密码, 每次可以移动连续的最多3列, 向上或向下, 求将密码调出来所需要的最少步数. 思路: 首先应看出,恢复的过程中, 调每一位的时间顺序是不影响的, 不妨就从左到右一位位 ...

  6. JNI编程(二) —— 让C++和Java相互调用(1)

    自己在外面偷偷的算了下,又有将近两个月没更新过blog了.趁着今天有兴致,来更新JNI编程的第二篇文章.在第一篇里,大概介绍了JNI的特点.用途和优劣.并且做一个最简单的JNI的例子,不过说实话那个例 ...

  7. poj棋盘分割(记忆化)

    http://poj.org/problem?id=1191 黑书上P116 想了挺久 没想出来 想推出一公式来着 退不出来.. 想偏了  正解:递归 #include <iostream> ...

  8. apache虚拟主机的设置

    方法一: 首先打开apache中conf下的http.conf文件打开虚拟主机的注释:如下去掉第二行前面的#即可 # Virtual hosts# Include conf/extra/httpd-v ...

  9. 【转】Android 学习笔记——利用JNI技术在Android中调用、调试C++代码

    原文网址:http://cherishlc.iteye.com/blog/1756762 在Android中调用C++其实就是在Java中调用C++代码,只是在windows下编译生成DLL,在And ...

  10. MyEclipse常用操作技巧

    1.源码和帮助文档的的关连 下面以关联struts2-core-2.3.14.2.jar源代码为例: 如下为示意图 2.拷贝项目的时候,要注意 将项目的web-root fold改成更新后的名字项目名 ...