gdufo

           

          jBPM開(kāi)發(fā)整理

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


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

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(6)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          收藏夾

          Hibernate

          友情鏈接

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 收藏| 建宁县| 宁国市| 苗栗市| 清原| 威远县| 双鸭山市| 荥经县| 邓州市| 墨脱县| 泸西县| 永宁县| 托克逊县| 衡水市| 宽城| 墨脱县| 金秀| 桦南县| 交口县| 拉孜县| 潮安县| 桂东县| 扬州市| 时尚| 德阳市| 诸城市| 维西| 惠安县| 林芝县| 杭锦后旗| 荔浦县| 通榆县| 六盘水市| 林口县| 康定县| 安龙县| 沿河| 阳高县| 卢湾区| 新乡市| 泰和县|