JBPM工作流(四)——管理流程定義
阿新 • • 發佈:2017-07-23
-1 exc xml文件 put gety tar from art 沒有
概念:
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());
|
JBPM工作流(四)——管理流程定義