隨筆-54  評(píng)論-0  文章-2  trackbacks-0

             今天是jBPM的第二天,內(nèi)容不多,定義不少,主要講了流程變量,節(jié)點(diǎn)和事件等知識(shí),全是新的知識(shí),剛學(xué)肯定生疏,久了就沒(méi)問(wèn)題了,編程嘛,多敲代碼,多 調(diào)試,才是王道。
           
          1. 流程變量

          通過(guò)org.jbpm.context.exe.ContextInstance來(lái)操 作變量。

          2.變量的生命周期

          變量的訪問(wèn)和賦值是在某一個(gè)token上進(jìn)行的,缺省時(shí),是基于root Token。每個(gè)Token(執(zhí)行路線)有它自己的一套流程變量。變量的作用域和所屬的Token的生命周期一致,不同的Token上的同名變量互不影 響。
           
          3.變量值要求

          變量名的類(lèi)型為java.lang.String,支持的變量值類(lèi)型如下(文檔10.1節(jié))。(

          如 果變量值是classes that are persistable with hibernate,則POJO的id應(yīng)為long型或String型。
           
          saveOrUpdate( po );
          savePoIdAndPoClassAsVariable()
          session.get( class, id )
          節(jié)點(diǎn)

          1. 流程圖中的各種節(jié)點(diǎn)的作用及用法

          為什么需要多種節(jié)點(diǎn)類(lèi)型?

          需要有不同類(lèi)型(作用)的節(jié)點(diǎn),才能設(shè)計(jì)出復(fù)雜的流程圖。 Jbpm有一套預(yù)先定義好的節(jié)點(diǎn)類(lèi)型。如果不夠用,也可以使用自定義節(jié)點(diǎn)進(jìn)行擴(kuò)展,以完成不同的流程的需要。

          不同的節(jié)點(diǎn)類(lèi)型代表不同的行 為。

          每個(gè)流程都必須要有開(kāi)始節(jié)點(diǎn)和結(jié)束節(jié)點(diǎn)。

          2.預(yù)定義節(jié)點(diǎn)

          start-state,開(kāi)始節(jié)點(diǎn):標(biāo)識(shí)流 程開(kāi)始、
          end-state,結(jié)束節(jié)點(diǎn):標(biāo)識(shí)流程結(jié)束、
          task-node,任務(wù)節(jié)點(diǎn):可以放0個(gè)或多個(gè)任務(wù)、
          decision, 決策節(jié)點(diǎn):路徑選擇,只使用一個(gè)流轉(zhuǎn)(叉路口)、
          fork/join,分支節(jié)點(diǎn)/合并節(jié)點(diǎn):可以分為多個(gè)并行執(zhí)行的分支、
          state,狀 態(tài)節(jié)點(diǎn):等待。


          每個(gè)節(jié)點(diǎn)都對(duì)應(yīng)一個(gè)類(lèi)(Jbpm的持久化類(lèi)),都是org.jbpm.graph.def.Node的子類(lèi)。節(jié)點(diǎn) 都有名字、流轉(zhuǎn)(end-state除外)。

          event事件

          事 件。

          1, 有幾種事件,分別在什么時(shí)候觸發(fā)
          2, 怎么指定當(dāng)事件觸發(fā)時(shí)做什么事(Action)
           1, 節(jié)點(diǎn)的事件

          a)      進(jìn)入節(jié)點(diǎn)(node-enter)。(開(kāi)始節(jié)點(diǎn)沒(méi)有)

          b)      離開(kāi)節(jié)點(diǎn)(node-leave)。(結(jié)束節(jié)點(diǎn)沒(méi)有)

          2, 流轉(zhuǎn)的事件

          a)      只有一個(gè):使用流轉(zhuǎn)(take a transition)

          3, 任務(wù)的事件

          a)      創(chuàng)建任務(wù)(task-create)

          b)      分配任務(wù)(task-assign)

          c)      開(kāi)始任務(wù)(task-start)à TaskInstance.start()

          d)      結(jié)束任務(wù)(task-end)à TaskInstance.end()
           每個(gè)事件有一個(gè)動(dòng)作(action)清單。當(dāng)jBPM引擎產(chǎn)生一個(gè)事件,動(dòng)作(action)清單就會(huì)被 執(zhí)行. 不同的節(jié)點(diǎn)支持的事件類(lèi)型不同,是由event元素所在的節(jié)點(diǎn)的類(lèi)型決定的,例如transition只有一個(gè)事件。
          可以在event元 素用可以指定一個(gè)動(dòng)作,當(dāng)指定的事件發(fā)生時(shí),這個(gè)動(dòng)作被執(zhí)行。

          可以給同一個(gè)事件指定多個(gè)動(dòng)作,當(dāng)這個(gè)事件觸發(fā)的時(shí)候,這些動(dòng)作執(zhí)行的順序 和定義先后順序是一致的。

          不同元素支持不同的事件類(lèi)型:

          一般的節(jié)點(diǎn)都具有的事件:node-enter,進(jìn)入節(jié)點(diǎn)、 node-leave,離開(kāi)節(jié)點(diǎn);
          start-state只有node-leave;
          end-state只有node-enter;
          transition 只有一個(gè)執(zhí)行轉(zhuǎn)換的事件(taking a transition)。因?yàn)橹挥幸粋€(gè)事件,所以配置時(shí)不用寫(xiě)event元素,而直接配置Action。
          task 有task-create,任務(wù)創(chuàng)建、task-assign,任務(wù)分配、task-start,任務(wù)開(kāi)始、task-end,任務(wù)結(jié)束。

          關(guān) 于哪些元素支持哪些事件,可以通過(guò)文檔的18.4節(jié)中的xml文件的寫(xiě)法中獲得。

          如果配置的事件類(lèi)型不存在,不會(huì)報(bào)錯(cuò),也不會(huì)執(zhí)行。

          注 意:在事件中定義的動(dòng)作(Action)不應(yīng)該(不能)影響流程的執(zhí)行。即不要在事件的動(dòng)作中給token發(fā)信號(hào),否則會(huì)拋異常:token is locked。(在Node中配置的Action可以給Token發(fā)信號(hào)。)

          事件執(zhí)行的順序:

          已觸發(fā)事件:node-leave

          已觸發(fā)事件:transition

          已 觸發(fā)事件:node-enter

          已觸發(fā)事件:task-create

          已觸發(fā)事件:task-assign

          已 觸發(fā)事件:task-start

          已觸發(fā)事件:task-end
           

          ************************* 動(dòng)態(tài)的創(chuàng)建不確定數(shù)量的任務(wù)實(shí)例 *********

          會(huì)簽。

          實(shí)現(xiàn)任務(wù)分配給多個(gè)人,在流程定義中定義的相 應(yīng)的任務(wù),不指定參與者,也不知道指定為誰(shuí)。需要做以下工作:
          1,  阻止jBPM自動(dòng)創(chuàng)建任務(wù)實(shí)例(設(shè)置task-node的create-tasks="false")
          2,  在node-enter事件中定義一個(gè)動(dòng)作指定用于創(chuàng)建TaskInstance的類(lèi)。

          類(lèi) CreateTaskInstancesAction要接管兩個(gè)操作:創(chuàng)建與分配任務(wù)實(shí)例。
           創(chuàng)建任務(wù)實(shí)例要調(diào)用方法:

            TaskMgmtInstance.createTaskInstance(Task, ExecutionContext);

          其中的 Task 是任務(wù)的定義,可以先得到當(dāng)前的節(jié)點(diǎn):

            TaskNode taskNode = (TaskNode) executionContext.getNode();

          然后通過(guò)任務(wù)的名字得到任務(wù)的定義:

            Task task = taskNode.getTask("審批");

           

          任務(wù)分配

          個(gè)人任務(wù):actor-id=”xxx”
                             

          查詢(xún)組任務(wù)列表的方法為:

          TaskMgmtSession.findPooledTaskInstances(String actorId)
                                

          對(duì)于一個(gè)組任務(wù),如果他的actorId為null,組中所 有的用戶(hù)都可以在組任務(wù)列表中看到這個(gè)任務(wù)。如果使用TaskInstance.setActorId(String)方法設(shè)置這個(gè)任務(wù)由指定的 acrorId來(lái)辦理,這時(shí)pooledActors中的其他人就看不到這個(gè)任務(wù)了,就是說(shuō)actorId會(huì)屏蔽pooledActors; 當(dāng)這個(gè)用戶(hù)因某些原因不能辦理任務(wù)時(shí),可以把這個(gè)任務(wù)再退回到組任務(wù)列表中,方法是調(diào)用TaskInstance.setActorId(null)設(shè)置 actorId為null,這時(shí)pooledActors中的所有人又都可以看到這個(gè)任務(wù)了。

          不管使用哪種方式分配任務(wù),參與者 (Actor-id,字符串類(lèi)型)的計(jì)算(確定)都是由業(yè)務(wù)層負(fù)責(zé)解釋的。

              最后湯兄給我們推薦了一些好書(shū),學(xué)習(xí)java必須準(zhǔn)備三樣: 心態(tài),基礎(chǔ),睡覺(jué)。能學(xué)多少學(xué)多少。明天才是OA工作流項(xiàng)目的開(kāi)始!加油。。。
          posted on 2010-02-01 21:59 d66380022 閱讀(262) 評(píng)論(0)  編輯  收藏
          主站蜘蛛池模板: 洪江市| 仙居县| 会宁县| 渭源县| 余江县| 吴堡县| 福建省| 天柱县| 庆云县| 彭泽县| 汤阴县| 金秀| 云梦县| 上杭县| 沙河市| 郯城县| 济阳县| 龙游县| 呼和浩特市| 怀柔区| 陕西省| 兖州市| 临沂市| 克山县| 广灵县| 军事| 崇州市| 延安市| 横峰县| 金昌市| 仙游县| 宣汉县| 乐东| 如东县| 永兴县| 凯里市| 秦安县| 申扎县| 甘肃省| 泸定县| 太白县|