一、JBPM定義
JBPM,全稱是Java Business Process Management(業務流程管理),它是覆蓋了業務流程管理、工作流、服務協作等領域的一個開源的、靈活的、易擴展的可執行流程語言框架。
二、為什麼用JBPM
業務分析師和開發人員使用的是同一種語言來交談,大大降低了開發的風險,如果要開發一個項目,速度也更快了,因為開發人員不用再將用戶需求轉化成軟件設計了。其次,JBPM采用的不是一般的開發工具,而是自己的圖形化開發工具,非常方便隨時了解和掌握運行的進程。最後,JBPM的流程框架非常靈活,使用起來也非常安全,它經過了安全認證,因此可以保證一些商業機密不被洩露。
三、JBPM環境配置詳解
首先在Eclipse中配置環境。如下:
① 配置GPD(流程設計器)
Help ------> Install New Software
點擊add,出現一個Add Repository
點擊Archive,選擇jbbm4.4/install/src/gpd/jbpm-gpd-site.zip
② 選擇所有插件,然後點Next即可
③ 配置JBPM運行時
1) 打開window --- preferences
1) 選擇 JBoss jBPM --> Runtime Locations
2) 點擊 Add...
3) 在 Add Location 對話框中,輸入一個名字,比如 jbpm-4.4 然後點擊 Search...
4) 在 Browse For Folder 對話框中,選擇你的jbpm 根目錄,然後點擊 OK
④ 在目錄中添加JPDL4模式
如果你想直接編輯XML 源碼, 最好是在你的XML 目錄中指定一下模式(schema),這樣當你在編輯流程源碼的時候,可以更好的幫助你編寫代碼。
1) 點擊窗口 --> 屬性(Windows --> Preferences)
2) 選擇XML --> 目錄(XML --> XML CataLog)
3) 點擊添加(Add)
4) 添加XML 目錄(Add XML Catalog Entry)的窗口打開
5) 點擊map-icon 的圖標下面的按鈕並選擇文件系統(File System)
6) 在打開的對話框中, 選擇jBPM 安裝目錄下src 文件夾中jpdl.xsd 文件
7) 點擊打開(Open)並且關閉所有的對話框
四、JBPM開發步驟詳解
① 引入JAR文件
在jbpm4.4的解壓包中根目錄Jbpm的jar包還有lib文件夾中除report-engine,war包外所有jar包
注:因為Jbpm4.4是用Mysql作為DB的,如果要用Oracle作為DB需要引入相應的驅動包。
② 創建配置文件
③ 畫流程圖---[新建jpdl.xml文件]
並生成jbpmtest.jpdl.xml文件:
五、關鍵代碼
① 創建表18張
[http://www.linuxidc.com/Linux/2017-01/139344.htm]表的詳細說明
②獲取工作流引擎
1 2 3 4 5 6ProcessEngine processEngine=
new
Configuration().setResource(
"jbpm.cfg.xml"
).buildProcessEngine();
@Test
public
void
test01(){
System.out.println(processEngine);
}
③部署流程定義
? 1 2 3 4 5 6 7 8 9@Test
public
void
deploy(){
String deployid = processEngine.getRepositoryService()
.createDeployment()
.addResourceFromClasspath(
"jbpmtest.jpdl.xml"
)
.addResourceFromClasspath(
"jbpmtest.png"
).deploy();
System.out.println(
"部署流程 id:"
+deployid);
}
④啟動流程實例
1 2 3 4 5 6 7@Test
public
void
startTest(){
//啟動流程實例 通過key,key是process節點中的key,如果不寫,默認為name的值
ProcessInstance pi=processEngine.getExecutionService().startProcessInstanceByKey(
"jbpmtest"
);
System.out.println(
"start ok!"
);
System.out.println(
"id:"
+pi.getId()+
",狀態:"
+pi.getState()+
",流程定義的ID:"
+pi.getProcessDefinitionId());
}
⑤查看任務列表
1 2 3 4 5 6 7 8 9 10@Test
public
void
selectTask(){
String user=
"張三"
;
String users=
"王五"
;
List<Task> tasks = processEngine.getTaskService().findPersonalTasks(user);
for
(Task task : tasks) {
System.out.println(
"任務ID:"
+task.getId()+
"\t任務名稱:"
+task.getName()+
"\t任務辦理人:"
+task.getAssignee());
}
}
⑥查看當前任務所在點
1 2 3 4 5@Test
public
void
findSelect(){
String name = processEngine.getExecutionService().createProcessInstanceQuery().processInstanceId(
"jbpmtest.80001"
).uniqueResult().findActiveActivityNames().toString();
System.out.println(name);
}
⑦辦理任務
1 2 3 4 5@Test
public
void
testCompleteTask(){
processEngine.getTaskService().completeTask(
"10002"
);
System.out.println(
"OK"
);
}
六、流程管理
①查詢所有流程定義
1ProcessEngine pro=Configuration.getProcessEngine();
1 2 3 4 5 6 7 8 9 10 11
@Test
public
void
findAll(){
List<ProcessDefinition> list = pro.getRepositoryService().createProcessDefinitionQuery().list();
for
(ProcessDefinition pd : list) {
System.out.println(
"id:"
+pd.getId()+
"\tname:"
+pd.getName()+
"\tkey:"
+pd.getKey()+
"\t版本號:"
+pd.getVersion()+
"\t部署的id:"
+pd.getDeploymentId());
}
}
②查詢最新版的流程定義
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21@Test
public
void
getNewFindAll(){
//查詢所有,讓最大的版本排到最後面
List<ProcessDefinition> all = pro.getRepositoryService().createProcessDefinitionQuery().orderAsc(ProcessDefinitionQuery.PROPERTY_VERSION).list();
//過濾出所有最新的版本
Map<String, ProcessDefinition> map=
new
HashMap<String, ProcessDefinition>();
for
(ProcessDefinition pd : all) {
map.put(pd.getKey(), pd);
}
//顯示
for
(ProcessDefinition pd : map.values()) {
System.out.println(
"id="
+ pd.getId()
// 格式為:{key}-{version},用於唯一的標識一個流程定義
+
", name="
+ pd.getName()
// 流程定義的名稱,jpdl.xml中根元素的name屬性的值
+
", key="
+ pd.getKey()
// 流程定義的key,jpdl.xml中根元素的key屬性的值,默認是name屬性的值
+
", version="
+ pd.getVersion()
// 自動生成的,同一個名稱的第一個為1,以後的自動加1.
+
", deploymentId="
+ pd.getDeploymentId());
// 所屬的部署對象
}
}
③根據id刪除
注:deleteDeploymentCascade級聯刪除
1 2 3 4 5@Test
public
void
delById(){
pro.getRepositoryService().deleteDeploymentCascade(
"1"
);
System.out.println(
"del ok!!!"
);
}
④刪除指定key的所有版本的流程
1 2 3 4 5 6 7 8@Test
public
void
delByKey(){
List<ProcessDefinition> list = pro.getRepositoryService().createProcessDefinitionQuery().processDefinitionKey(
"jbpmtest"
).list();
for
(ProcessDefinition pd : list) {
pro.getRepositoryService().deleteDeploymentCascade(pd.getDeploymentId());
}
}
⑤ZIP 部署
1 2 3 4 5 6 7 8 9
@Test
public
void
addZip(){
//部署zip格式的資源
InputStream is=
this
.getClass().getClassLoader().getResourceAsStream(
"src.zip"
);
ZipInputStream zs=
new
ZipInputStream(is);
String id= pro.getRepositoryService().createDeployment().addResourcesFromZipInputStream(zs).deploy();
System.out.println(
"部署成功:deploymentid:"
+id);
}