jBPM 的客戶(hù)端開(kāi)發(fā)
有了前面的 HelloWorld 后臺流程,我們就要開(kāi)始客戶(hù)端程序了。正如前面提到的,本文不寫(xiě) JSP ,而改采用 JUnit 的形式,輸出則用 System.out.println 。舉一反三,知道在方法中輸入及用 println 輸出,在 JSP 和 SWING 等 GUI 界面還不是一樣嘛。
這個(gè) JUnit 客戶(hù)端,我們就借用創(chuàng )建項目時(shí)自動(dòng)生成的 SimpleProcessTest.java 了,改寫(xiě)后如下:
package com.sample;
import junit.framework.TestCase;
import org.jbpm.JbpmConfiguration;
import org.jbpm.JbpmContext;
import org.jbpm.context.exe.ContextInstance;
import org.jbpm.graph.def.ProcessDefinition;
import org.jbpm.graph.exe.ProcessInstance;
public class SimpleProcessTest extends TestCase {
private JbpmConfiguration config = JbpmConfiguration.getInstance();
private JbpmContext ctx = config.createJbpmContext();
// helloworld 對應于 jbpm_processdefinition 表的 name 字段值,也即 processdefinition.xml 的 name
// 這個(gè)值得取比較耗時(shí),實(shí)際項目里最好和“數據庫的 JDBC 連接”一樣,讓它共享,不要頻繁打開(kāi)關(guān)閉。
private ProcessDefinition processDefinition = ctx.getGraphSession().findLatestProcessDefinition("helloworld");
public void testNewRequest() {
long id = newRequest();
System.out.println("id=" + id);
checkNewRequest(id);
confirmRequest(id);
checkconfirmRequest(id);
ctx.close();// 關(guān)閉 jbpm 容器
}
/**
* 創(chuàng )建一個(gè)請假單
*
* @return
*/
private long newRequest() {
// 創(chuàng )建一個(gè)新流程
ProcessInstance pi = processDefinition.createProcessInstance();
// 取得流程的數據環(huán)境
ContextInstance ci = pi.getContextInstance();
// 創(chuàng )建一張請假單
ci.setVariable("name", " 陳剛 www.chengang.com.cn" );
ci.setVariable("day", 2);
assertEquals(null, ci.getVariable("note"));
// 請假申請結束,轉到下一個(gè)流程結點(diǎn)
pi.signal();
return pi.getId();
}
/**
* 檢查請假單的數據
*
* @param id
*/
private void checkNewRequest(long id) {
// 從數據庫提取原流程
ProcessInstance pi = ctx.loadProcessInstance(id);
// 取得流程的數據環(huán)境
ContextInstance ci = pi.getContextInstance();
// 創(chuàng )建一張請假單
assertEquals(" 陳剛 www.chengang.com.cn" , ci.getVariable("name"));
assertEquals(Integer.valueOf(2), ci.getVariable("day"));
assertEquals(" 我要請假 " , ci.getVariable("note"));
// 當前是結點(diǎn)為 confirm
assertEquals(pi.getRootToken().getNode().getName(), "confirm");
// 流程還沒(méi)結束
assertFalse(pi.hasEnded());
}
/**
* 審批陳剛的請假申請
*
* @param id
*/
private void confirmRequest(long id) {
ProcessInstance pi = ctx.loadProcessInstance(id);
ContextInstance ci = pi.getContextInstance();
// 不通過(guò)
ci.setVariable("note", " 不準請假,繼續加班 " );
// 審批結束,到下一個(gè)流程結點(diǎn)
pi.signal();
}
private void checkConfirmRequest(long id) {
ProcessInstance pi = ctx.loadProcessInstance(id);
ContextInstance ci = pi.getContextInstance();
// ConfirmAction 類(lèi)在 signal 后執行,所以覆蓋了經(jīng)理的審批意見(jiàn)
assertEquals(" 準假 " , ci.getVariable("note"));
// 當前是結點(diǎn)為 end
assertEquals(pi.getRootToken().getNode().getName(), "end");
// 流程結束了
assertTrue(pi.hasEnded());
}
}
這個(gè)例子還是很簡(jiǎn)單,而且關(guān)鍵是缺少用戶(hù)、組、權限等工作流系統必須的東西,不過(guò)沒(méi)關(guān)系。下面的內容我將完成一個(gè)更完整的實(shí)例。
聯(lián)系客服