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());
JBPM学习(三):管理流程定义的更多相关文章
- jBPM学习之部署流程定义
也许部署流程定义的方法有很多,这里选用的是用Java代码调用工作流引擎提供的部署服务API.在这之前,假设你的Eclipse已经安装好了GPD工作流画图工具,并且学会了画出最简单的HelloWorld ...
- Activiti第二篇【管理流程定义、执行任务和流程实例、流程变量】
上篇Activiti只是一个快速入门案例,这篇就讲定义.部署.查看任务等等的一些细节[涉及到的数据库表.对象等等]- 管理流程定义 管理流程定义主要涉及到以下的4张表: -- 流程部署相关的表 SEL ...
- JBPM4.4_管理流程定义
1. 管理流程定义 没有更新功能 1.1. 部署流程定义 注意区分Deployment与ProcessDefinition 1.1.1. 示例代码1:流程定义有关文件在classpath中 Strin ...
- JBPM工作流(四)——管理流程定义
概念: ProcessDefinition,流程定义:一个流程的步骤说明,如一个请假流程.报销流程.是一个规则. ProcessDefinition,流程定义对象,是解析.jpdl.xml文件得到流程 ...
- JBPM学习(五):流程变量
1.启动流程实例 // 启动流程实例 @Test public void startProcessInstance() { // 使用指定key的最新版本的流程定义启动流程实例 ProcessInst ...
- Activiti学习笔记3 — 流程定义
一.创建流程引擎对象 private ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); 二.发布一个流程 ...
- JBPM表达业务流程(流程定义语言)
业务流程包括三部分: 活动 Activity / 节点 Node (有很多种,不同的类型有不同的功能,必须要有一个Start Activity) 连线 Transition / 转移 (从一个Acti ...
- 工作流学习——Activiti流程定义管理三步曲 (zhuan)
http://blog.csdn.net/zwk626542417/article/details/46602419 ***************************************** ...
- Flowable实战(三)流程部署管理
一.流程定义的版本 当部署流程定义时,数据库中的流程定义会是这个样子: id key name version myProcess:1:676 myProcess My important pro ...
随机推荐
- PHP设置COOKIE的HttpOnly属性
httponly是微软对cookie做的扩展.这个主要是解决用户的cookie可能被盗用的问题. 大家都知道,当我们去邮箱或者论坛登陆后,服务器会写一些cookie到我们的浏览器,当下次再访问其他页面 ...
- java对xml文件做增删改查
http://www.cnblogs.com/wangchenyang/archive/2011/08/23/2150530.html http://www.blogjava.net/weishuan ...
- 小心loadrunner成为瓶颈
最近在测试中发现一个问题,某些时候用进程跑场景的时候tps死活上不去,而用同样数量的线程跑的时候,TPS开始很高,然后很快的跌倒谷底.当遇到这个问题的时候往往就是loadrunner成为瓶颈了! 解决 ...
- JAVA客户端API调用memcached两种方式
1. memcached client for java客户端API:memcached client for java 引入jar包:java-memcached-2.6.2.jar package ...
- function(a)
问题: 问个初级的问题int a = 8;function(a);这里在function中的a值是引用a内存中的数据,还是新开辟内存后将a的值赋值到新内存供函数调用. 回答: int a = 8; ...
- libvlc 双击,鼠标事件消息响应
基于vlc 2.1 动态库实现接收双击消息的接收,使双击vlc播放画面可以全屏显示. 需要其他版本的vlc可以与我联系(有偿进行修改) 下载地址:http://download.csdn.net/de ...
- VJP1063 迎春舞会之集体舞(DP)
我是被这题彻底折腾惨了 .. DP很简单 不用说了 重点是必须按它那个图说来来划分三角形 而不是随便撇下一部分 随便划下一个三角形就可以 所以 要判断J是第奇数个点才可以 #include <i ...
- MySQL海量数据查询优化策略
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...
- Android学习之路——简易版微信为例(二)
1 概述 从这篇博文开始,正式进入简易版微信的开发.深入学习前,想谈谈个人对Android程序开发一些理解,不一定正确,只是自己的一点想法.Android程序开发不像我们在大学时候写C控制台程序那样, ...
- [转]关于WM_NCHITTEST消息
http://www.cnblogs.com/GnagWang/archive/2010/09/12/1824394.html 我为了移动一个无标题栏的窗体,使用了WM_NCHITTEST消息,这个消 ...