1. 程式人生 > >業務流程管理框架JBPM

業務流程管理框架JBPM

xsd earch 圖標 系統 catalog 數據庫 ear let tput

1.JBPM4.4業務流程管理框架

JBPM,全稱是Java Business Process Management(業務流程管理),它是覆蓋了業務流程管理、工作流、服務協作等領域的一個開源的、靈活的、易擴展的可執行流程語言框架。它使用Hibernate來管理它的數據庫,只要是Hibernate支持的數據庫,它都支持

2.ProcessEngine的核心服務

RespositoryService:流程定義的服務接口:包括流程定義的部署、查詢、刪除等操作。

ExecutionService: 流程執行的服務接口:包括啟動流程、實例推進、設置變量等操作。

ManagementService:Web管理控制臺的服務接口,包括獲得消息和計時器的操作。

HistoryService:歷史庫的服務接口:包括對流程實例、活動實例進行查詢。某個流程定義中的所有的活動的平均持續時間,某個流程定義中的某個活動實例的轉移的執行次數等操作。

IdentityService:主要包括用戶、組、成員關系等相關的操作

CommondService:command模式的服務接口,實際上將客戶端請求全部封裝在一個調用接口中,execute(Command cmd),由這個接口去調用command接口的眾多實現類。

3. 環境搭建

3.1配置GPD(流程設計器)

Help ------> Install New Software

點擊add,出現一個Add Repository

點擊Archive,選擇jbbm4.4/install/src/gpd/jbpm-gpd-site.zip

技術分享

選擇所有插件,然後點Next即可

技術分享

3.2配置JBPM運行時

1) 打開window à preferences

2) 選擇 JBoss jBPM --> Runtime Locations

3) 點擊 Add...

4) 在 Add Location 對話框中,輸入一個名字,比如 jbpm-4.4 然後點擊 Search...

5) 在 Browse For Folder 對話框中,選擇你的jbpm 根目錄,然後點擊 OK

技術分享

3.3在目錄中添加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)並且關閉所有的對話框

技術分享

技術分享

3.4定義jBPM 用戶庫

1) 點擊窗口 --> 屬性(Windows --> Preferences)

2) 選擇Java --> 創建路徑 --> 用戶類庫(Java --> Build Path --> User Libraries)

3) 點擊新建(New)

4) 類型名字jBPM Libraries

5) 點擊添加JARs(Add External JARs...)

6) 找到jBPM 安裝程序下的lib 目錄

7) 選擇lib 下的所有jar 文件並點擊打開(Open)

8) 選擇jBPM Libraries 作為入口

9) 重新點擊添加JARs(Add External JARs)

10) 在jBPM 的安裝程序的根目錄下選擇jbpm.jar 文件

11) 點擊打開(Open)

12) 在jbpm.jar 下選擇源碼附件(Source attachment)作為入口

13) 點擊編輯(Edit)

14) 在源碼附件的配置(Source Attachment Configuration)對話框中,點擊目錄(External Folder...)

15) 找到jBPM 安裝程序下的src 目錄

16) 點擊選擇(Choose)

技術分享

技術分享

4.創建項目

4.1jar

Jbpm4.4的lib目錄下除了.zip和.war

4.2 配置文件

Jbpm4.4 --- examples --- src 下的五個文件復制到項目src目錄下

<hibernate-configuration>

<session-factory>

<!-- 連接數據庫的一些信息 -->

<property name="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</property>

<property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property>

<property name="hibernate.connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property>

<property name="hibernate.connection.username">jbpm</property>

<property name="hibernate.connection.password">jbpm</property>

<property name="hibernate.hbm2ddl.auto">update</property>

<property name="hibernate.format_sql">true</property>

<!-- 小配置:映射文件 -->

<mapping resource="jbpm.repository.hbm.xml" />

<mapping resource="jbpm.execution.hbm.xml" />

<mapping resource="jbpm.history.hbm.xml" />

<mapping resource="jbpm.task.hbm.xml" />

<mapping resource="jbpm.identity.hbm.xml" />

</session-factory>

</hibernate-configuration>

4.3畫流程圖

在src上右鍵,new ---- Other

技術分享

4.4代碼

1.創建表 18張

@Test

public void create(){

//創建表 18張

new org.hibernate.cfg.Configuration().configure("jbpm.hibernate.cfg.xml").buildSessionFactory();

System.out.println("ok");

}

技術分享

技術分享

2.創建ProcessEngine對象

//通過默認的配置文件生成單例的processEngine對象

ProcessEngine pro=Configuration.getProcessEngine();

3.部署流程定義

@Test

public void getDeploy(){

//部署流程定義

String re=pro.getRepositoryService()

.createDeployment()

.addResourceFromClasspath("jbpms.jpdl.xml")

.addResourceFromClasspath("jbpms.png").deploy();

System.out.println(re);

}

4.啟動流程實例

@Test

public void testStart(){

//啟動流程實例 通過key,key是process節點中的key,如果不寫,默認為name的值

ProcessInstance pi=pro.getExecutionService().startProcessInstanceByKey("jbpms");

System.out.println("start ok!");

System.out.println("id:"+pi.getId()+",狀態:"+pi.getState()+",流程定義的ID:"+pi.getProcessDefinitionId());

}

5.查看任務列表

@Test

public void selectTask(){

//查看任務列表

String user="hh";

String user2="boss";

List<Task> tasks = pro.getTaskService().findPersonalTasks(user);

for (Task task : tasks) {

System.out.println("任務ID:"+task.getId()+"\t任務名稱:"+task.getName()+"\t任務的辦理人:"+task.getAssignee());

}

}

6.查看當前任務所在點

@Test

public void findSelect(){

//查詢當前任務所在點

String name=pro.getExecutionService().createProcessInstanceQuery().processInstanceId("jbpms.130001").uniqueResult().findActiveActivityNames().toString();

System.out.println(name);

}

7.辦理任務

//辦理任務

@Test

public void testCompleteTask(){

pro.getTaskService().completeTask("130002");

System.out.println("ok");

}

5.流程管理

1.創建ProcessEngine對象

//通過默認的配置文件生成單例的processEngine對

ProcessEngine pro=Configuration.getProcessEngine();

2.查詢流程定義

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

}

}

3.查詢最新版的流程定義

@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()); // 所屬的部署對象

}

}

4.刪除(根據id)

@Test

public void deleteById(){

//根據id刪除

pro.getRepositoryService().deleteDeployment("1");

System.out.println("delete ok");

}

5.刪除(根據key)

@Test

public void deleteByKey(){

//刪除指定key的所有版本的流程

List<ProcessDefinition> list=pro.getRepositoryService().createProcessDefinitionQuery().processDefinitionKey("jbpms").list();

for (ProcessDefinition pd : list) {

pro.getRepositoryService().deleteDeploymentCascade(pd.getDeploymentId());

}

}

6.部署zip格式資源

@Test

public void addZip(){

//部署zip格式的資源

InputStream is=this.getClass().getClassLoader().getResourceAsStream("hh.zip");

ZipInputStream zs=new ZipInputStream(is);

String id= pro.getRepositoryService().createDeployment().addResourcesFromZipInputStream(zs).deploy();

System.out.println("部署成功:deploymentid:"+id);

}

7.查看流程圖

@Test

public void getImageResource() throws Exception{

//查看流程圖

// 獲取指定部署對象中的指下資源的內容

InputStream in=pro.getRepositoryService().getResourceAsStream("50001", "jbpms.png");

//保存到xx盤

OutputStream out=new FileOutputStream("E:/jbpms.png");

for (int b=-1;(b=in.read())!=-1;) {

out.write(b);

}

in.close();

out.close();

System.out.println("----ok---");

}

業務流程管理框架JBPM