gdufo

           

          jBPM開發整理

          http://www.cn-java.com/www1/?uid-550631-action-viewspace-itemid-4212
          jBPM開發整理
          1.  概述
                  jBPM是一個工作流平臺,它實現了一系列的基礎類,提供了面向圖形編程的方式來定義流程,方便用戶在此基礎上專注業務流程邏輯的實現;他依賴很少的庫文件,能很好地嵌入到已有的Java Project當中。
                  jBPM采用Hibernate進行數據持久化的管理;
           
                 一般的開發流程為:
          1.選定數據庫,對數據庫進行初始化;jBPM平臺本身需要數據庫的支持,    
                所以在使用jBPM之前要先初始化相應的數據庫,包括創建表和插入初始  
                化數據等。
          2.使用JBPM定義流程,生成ProcessDefinition.xml;并加入自定義的處理代碼,如Action等。
          3.利用JUnit Framework寫單元測試。
          4.部署jBPM
           
                   
          2.  環境配置
                   2.1 Eclipse
                           1.為了支持圖形化的流程定義,安裝jBPM圖形化插件,位置為:
                                  \jbpm-starters-kit-3.1.1\jbpm-designer\jbpm-gpd-feature\eclipse
                  2.2 Library
          1.JBPM 3要求 J2SE 1.4.2 +
          2.JBPM庫:
          jBPM核心功能庫:jbpm-[version].jar (位于jbpm/build下)
          jBPM可選的身份驗證庫:jbpm-[version].jar(位于jbpm/build下)
          3.必須的第三方庫:(位于jbpm/lib下)
          XML分析庫:dom4j-1.6.1.jar
          Logging庫:commons-logging.jar
                             4.可選的第三方庫:
                                   見User Guide Chapter 5
           
                   2.3 Configuration Files
           
           
                                                        Table 2-1 Configuration Files
                                            路徑
                              作用描述
          src/config.files/jbpm.cfg.xml
          配置jBPM參數
          src/config.files/hibernate.cfg.xml
          配置Hibernate連接參數等
          org/jbpm/db/hibernate.queries.hbm.xml
          定義了Hibernate的常用查詢Query
          org/jbpm/graph/node/node.types.xml
          Node類型和對應實現類的映射
          org/jbpm/graph/action/action.types.xml
          Action類型和對應實現類的映射
          org/jbpm/calendar/jbpm.business.calendar.properties
          定義了Business Hour和Free Time
          org/jbpm/context/exe/jbpm.varmapping.xml
          定義了使用何種類完成某種Java對象轉換為jBPM中可存儲的數據庫實例
          org/jbpm/db/hibernate/jbpm.converter.properties
          定義了ID和Class Name的映射
          org/jbpm/graph/def/jbpm.default.modules.properties
          定義了創建ProcessDefinition時,缺省加載的模塊
          org/jbpm/jpdl/par/jbpm.parsers.xml
          定義了分析器
          3.    開發步驟
                 3.1創建jBPM項目
                      1.在Eclipse中創建一個Process Project項目
                 3.2 配置數據庫
                        1.下載PostgreSQL、pgAdmin和dbVisualizer
                                Account:qlisguo/leesen;SuperUser:postgres/leesen127
                        2.創建JbpmDB數據庫;
                        3.運行jbpm-db/build/postgresql/scripts/postgresql.create.sql,為jBPM創建   
                              初始化的表、索引等;
                        4.可選:為了讓jBPMStarterKit自帶的WebApp能運行,必須對
                               jbpm_id_user初始化,加入一些帳號;
                        5.可選:為了讓jBPMStarterKit自帶的WebApp運行,必須修改已部署的   
                              JBoss的配置文件,配置數據源;
                        6.修改jbpm 項目中Hibernate的數據庫連接配置文件Hibernate.cfg.xml;
                 3.3 流程定義
                         1.在Processes目錄下創建一個ProcessDefinition Project;
                         2.利用圖形化界面對ProcessDefinition.xml進行業務邏輯流程的定義;
                 3.4 JUnit測試
                          1.src/java.jbpm.test 是StarterKit 自帶的測試用例
                          2.繼承junit.framework.TestCase類
                          3.jBPM工作流的測試流程
                           
                 3.5 部署                     
           
          4.  jBPM流程整理
           
           
                  創建ProcessDefinitionà創建ProcessInstanceàToken.signal()
                  
                  
                    一個Process Definition即是一張有向圖,由Node和Transition完成流程的執行。
           
                  Token
          ·       是一個鏈表結構,具有唯一的父Token和若干子Token;每個Token都包含一個Node節點指針;這意味著,Token鏈表表示了一條流程的執行路徑。
          ·       當一個ProcessInstance被創建時,一個rootToken同時被創建。
          ·       Token.signal()方法調用 Node.leave(),Node.leave() 設置Token的當前Node為新的Node,從而讓流程繼續下去。其執行路進如下所示:
          Token.signal()
                 àNode.leave()
                 àTransition.take()
                 àNode.enter()
                 àNode.execute()
          ·       當Token進 入一個Node時,該Node的execute方法即被調用,每個Node都可以在execute()方法中定義自己的流程執行方式。而 State 類型的Node是不會傳播執行的,即當Token進入State Node時,只能通過Token.signal()方法,顯式地去讓流程繼續。
           
                  Node
          ·       Node有 兩個責任:1)執行純java代碼,比如創建Task,更新數據庫等;2)負責傳播執行流程:不傳播(內置的Node Type中只有State Node不傳播);自動選擇一條Leave Transition,繼續流程;創建新的執行路徑即新的Token(例如Fork Node);結束流程;更改流程執行時的結構,即Token Tree。
          ·       每種Node Type都重載了Node 類的execute方法,其中只有State Node的execute()方法為空,即意味著當Token進入State Node時,流程即停止在此。
           
          Node Type
                                    Description
          Task Node
          當流程進入該Node時,該Node會創建一系列的Tasks;然后等待這些Tasks完成;當Tasks完成之后,則會調用token.signal()方法,使流程自動執行下去。
          State
          要顯示調用token.signal()方法,才能使流程繼續
                 
                  Actions
          5.  jBPM APIs 整理
           
          5.1    ProcessDefinition
          里面包含Node,Tasks,Swimlane,Transition等的定義,可以利用getXXX方法獲得其中的元素。
           
          ProcessDefinition processDefinition = ProcessDefinition.parseXmlString(
                "<process-definition>" +
                " <task-node name='saturday afternoon'>" +
                "    <task name='wash car'>" +
                "      <assignment class='the-wash-car-assignment-handler-class-name' />" +
                "    </task>" +
                " </task-node>" +
                "</process-definition>"
              );
          5.2    Configuration、Context
                      bpmConfiguration jbpmConfiguration = JbpmConfiguration.parseResource("org/jbpm/jbpm.test.cfg.xml");
           
          jbpmContext = getJbpmConfiguration().createJbpmContext();
          從jbpmContext中可以獲得所有的session,例如getGraphSession()…
           
           
          5.3    ContextInstance操作變量
              
          ·       org.jbpm.module.exe.ModuleInstance.ContextInstance類負責對變量進行操作。
           
          ·       獲取一個ContextInstance
               ContextInstance contextInstance = (ContextInstance) processInstance.getInstance(ContextInstance.class);
                  
          ·       Variables的 持久化是伴隨JbpmContext的save(ProcessInstance)方法的,因為Variables是ProcessInstance的一 部分;如果有不想持久化的Variable的話就利用ContextInstance.setTransientVariable(),創建臨時變量。
           
          5.4    org.jbpm.context.log變量日志管理
          ·       記錄的Variable的更新,刪除,創建等日志
          5.5    Task任務管理
          ·       TaskMgmtDefinition管理Task所和Swimlane
          taskMgmtDefinition = processDefinition.getTaskMgmtDefinition();
           
              processDefinition = new ProcessDefinition();
              taskMgmtDefinition = new TaskMgmtDefinition();
              processDefinition.addDefinition(taskMgmtDefinition);
              buyer = new Swimlane("buyer");
              laundry = new Task("laundry");
              dishes = new Task("dishes");
          ·       TaskNodeàTaskàTaskControlleràVariableAccess 層次關系。
          TaskController.submitParameters()方法,可以把TaskInstance的Task Variable新值更新到對應的Process Variable;
          ·       TaskMgmtInstance運行時的任務管理
              TaskMgmtInstance tmi = (TaskMgmtInstance) processInstance.getInstance(TaskMgmtInstance.class);
           
          ·        TaskInstance可以調用set/getVariable()方法,對Task的Local變量進行存取
          ·        TaskMgmtInstance.createStartTaskInstance(),創建start state 中的任務,并把該任務分派給當前的Actor。
           
           
          5.6    Swimlane的整理
                1.Swimlane是task的role。Tasks可以分配給swimlane,同時users、group也可以被指派到swimlane,通過 swimlane這作橋梁,tasks就被分配給了特定的users。 需要注意的是,swimlane不包含授權控制,即如果user A 沒有通過swimlane分配到task A,user A仍然可以通過 task.end()來結束任務。
          5.7    Token的整理
           
          1.當創建一ProcessInstance時,自動創建了一rootToken
          2. 當rootToken 進入Fork Node 時,就會自動根據Transition 名創建子Token(/TransitionName),而rootToken則在Fork Node處等待,通過ProcessInstance.findToken()找到子Token繼續分支流程的完成,待所有的分支流程完成,則 rootToken被自動激發到 Join Node 的下一個節點。分支流程的token起始指向的Node就是ForkNode對應的 Transition to的節點。
          3.Decision Node 根據指定的Decision Handle ,來決定選擇哪一條transition


          posted on 2008-09-18 10:45 gdufo 閱讀(561) 評論(0)  編輯  收藏 所屬分類: workflow

          導航

          統計

          常用鏈接

          留言簿(6)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          收藏夾

          Hibernate

          友情鏈接

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 云南省| 洞口县| 金华市| 洛隆县| 台北市| 河曲县| 宣恩县| 正宁县| 嘉善县| 专栏| 洛浦县| 会东县| 确山县| 根河市| 镇宁| 神农架林区| 重庆市| 满洲里市| 阜平县| 长沙市| 甘泉县| 乡宁县| 渝北区| 离岛区| 奉新县| 旬邑县| 鸡西市| 兴宁市| 万山特区| 曲水县| 历史| 东源县| 石门县| 团风县| 凤庆县| 宣威市| 遂川县| 安图县| 斗六市| 亚东县| 长海县|