小菜毛毛技術分享

          與大家共同成長

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            164 Posts :: 141 Stories :: 94 Comments :: 0 Trackbacks

          jBPM開發入門指南(4)

          7   jBPM 的客戶端開發

          有了前面的 HelloWorld 后臺流程,我們就要開始客戶端程序了。正如前面提到的,本文不寫 JSP ,而改采用 JUnit 的形式,輸出則用 System.out.println 。舉一反三,知道在方法中輸入及用 println 輸出,在 JSP SWING GUI 界面還不是一樣嘛。

           

          這個 JUnit 客戶端,我們就借用創建項目時自動生成的 SimpleProcessTest.java 了,改寫后如下:

          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

              // 這個值得取比較耗時,實際項目里最好和“數據庫的 JDBC 連接”一樣,讓它共享,不要頻繁打開關閉。

              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();// 關閉 jbpm 容器

              }

           

              /**

                * 創建一個請假單

                *

                * @return

                */

              private long newRequest() {

                  // 創建一個新流程

                  ProcessInstance pi = processDefinition.createProcessInstance();

                  // 取得流程的數據環境

                  ContextInstance ci = pi.getContextInstance();

                  // 創建一張請假單

                  ci.setVariable("name", " 陳剛 www.chengang.com.cn" );

                  ci.setVariable("day", 2);

                  assertEquals(null, ci.getVariable("note"));

                  // 請假申請結束,轉到下一個流程結點

                  pi.signal();

                  return pi.getId();

              }

           

              /**

                * 檢查請假單的數據

                *

                * @param id

                */

              private void checkNewRequest(long id) {

                  // 從數據庫提取原流程

                  ProcessInstance pi = ctx.loadProcessInstance(id);

                  // 取得流程的數據環境

                  ContextInstance ci = pi.getContextInstance();

                  // 創建一張請假單

                  assertEquals(" 陳剛 www.chengang.com.cn" , ci.getVariable("name"));

                  assertEquals(Integer.valueOf(2), ci.getVariable("day"));

                  assertEquals(" 我要請假 " , ci.getVariable("note"));

           

                  // 當前是結點為 confirm

                  assertEquals(pi.getRootToken().getNode().getName(), "confirm");

                  // 流程還沒結束

                  assertFalse(pi.hasEnded());

              }

           

              /**

                * 審批陳剛的請假申請

                *

                * @param id

                */

              private void confirmRequest(long id) {

                  ProcessInstance pi = ctx.loadProcessInstance(id);

                  ContextInstance ci = pi.getContextInstance();

                  // 不通過

                  ci.setVariable("note", " 不準請假,繼續加班 " );

                  // 審批結束,到下一個流程結點

                  pi.signal();

              }

           

              private void checkConfirmRequest(long id) {

                  ProcessInstance pi = ctx.loadProcessInstance(id);

                  ContextInstance ci = pi.getContextInstance();

                  // ConfirmAction 類在 signal 后執行,所以覆蓋了經理的審批意見

                  assertEquals(" 準假 " , ci.getVariable("note"));

           

                  // 當前是結點為 end

                  assertEquals(pi.getRootToken().getNode().getName(), "end");

                  // 流程結束了

                  assertTrue(pi.hasEnded());

              }

           

          }

           

          這個例子還是很簡單,而且關鍵是缺少用戶、組、權限等工作流系統必須的東西,不過沒關系。下面的內容我將完成一個更完整的實例

          http://97wen.com/

          http://77.haowyt.com/

          posted on 2009-05-05 15:14 小菜毛毛 閱讀(500) 評論(0)  編輯  收藏 所屬分類: JBPM
          主站蜘蛛池模板: 綦江县| 延寿县| 从江县| 布拖县| 什邡市| 南汇区| 兴仁县| 汝州市| 元氏县| 蓬莱市| 贞丰县| 灵寿县| 高阳县| 遂昌县| 峨眉山市| 定边县| 策勒县| 屯留县| 万安县| 罗田县| 青岛市| 于都县| 龙井市| 巴林左旗| 河曲县| 托克托县| 二手房| 湘阴县| 登封市| 博客| 莒南县| 武清区| 潮安县| 通道| 晋江市| 惠来县| 嘉义县| 敖汉旗| 柘荣县| 孟州市| 岳阳县|