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
    
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包

?
1
2
3
4
5
6
7
8
9
10
11
12
13
@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) 查询所有流程定义

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@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) 查询所有最新版本的流程定义

?
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
    
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

?
1
2
3
4
5
6
7
8
@Test
    
public
void
deleteById() {
        
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
    
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) 查看流程图

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@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.获取流程图中某活动的坐标(不重要)

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

  

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/12134.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论