欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

jBPM4 PVM的流程定義模型與過程調度

系統(tǒng) 2773 0

完整的jBPM4 PVM介紹發(fā)表在《程序員》第8期,這里截取部分的意思是 PVM的過程調度是非常靈活的,PVM提供了一套和token類似的execution過程調度機制,通過對execution的完全操控,節(jié)點運行期行為有了無限的可能

?

?

PVM的流程定義模型

首先要說明的是,上圖里的類全是接口。位于最上層的是ObservableElement,其提供給流程元素以附加Event(事件)的能力。在ObservableElementImpl里,它持有一個events的集合屬性。對于流程元素來說,典型的事件有:流程啟動/結束,節(jié)點啟動/結束和轉移線執(zhí)行(take)。

Java代碼?
  1. protected ?Map<String,?EventImpl>?events;??
      protected Map<String, EventImpl> events;
    

?


Event又做了些什么呢?EventImpl透過EventListenerReference實例的集合持有EventListener實例。這樣在引擎執(zhí)行過程調度時,就非常容易地通過流程元素本身獲取事件監(jiān)聽器并在相應的時候執(zhí)行它們。

Java代碼 復制代碼
  1. protected ?List<EventListenerReference>?listenerReferences;??
      protected List<EventListenerReference> listenerReferences;
    

?



和傳統(tǒng)的觀察者模式一致,EventListener接口有且只有一個方法:

Java代碼?
  1. void ?notify(EventListenerExecution?execution)? throws ?Exception;??
      void notify(EventListenerExecution execution) throws Exception;
    

?



緊接著ObservableElement的是CompositeElement,其擴展了ObservableElement接口。先看看它的方法:

Java代碼?
  1. List<?? extends ?Activity>?getActivities(); ??
  2. ??
  3. boolean ?hasActivity(String?activityName); ??
  4. ??
  5. Activity?getActivity(String?activityName);??
        List<? extends Activity> getActivities();

  boolean hasActivity(String activityName);

  Activity getActivity(String activityName);
    

?



很明顯,它持有了Activity的集合,對于ProcessDefinition來說,這是一件很自然地事情:流程定義包含多個節(jié)點定義。重要的是Activity自身華麗的變身:節(jié)點定義實現(xiàn)了嵌套,出現(xiàn)了結構塊。看圖說話:

這一設計在jBPM3里是沒有的,但是在jBPM4里則必須出現(xiàn),因為結構塊是BPEL和BPMN里的重要概念。既然號稱PVM,則必須向BPEL和BPMN致敬。稍后我們可以看到,結構塊的引入給引擎過程調度增加了很大的復雜度。在jPDL里,與之對應的實現(xiàn)是group。這是jBPM4流程定義模型的最重要改變。


ProcessDefinition和Activity分別繼承自CompositeElement,Activity和Transition建立起雙向關聯(lián),這三者也是工作流模型里的標準建模。

PVM的過程調度
jBPM4采用execution來記錄當前流程執(zhí)行的位置,并通過移動execution來推動流程的流轉。

Java代碼?
  1. /**?transient?cached?current?activity?pointer.??persistence?is?managed?in?{@link?#activityName}?*/ ??
  2. private ?ActivityImpl?activity; ??
  3. ??
  4. /**?transition?is?not?to?be?made?persistable?by?default?*/ ??
  5. protected ?TransitionImpl?transition;??
        /** transient cached current activity pointer.  persistence is managed in {@link #activityName} */
  private ActivityImpl activity;

  /** transition is not to be made persistable by default */
  protected TransitionImpl transition;
    

?



execution通過activity和transition屬性來記錄位置。

execution是可以嵌套的,即會存在一種父子關系構成樹狀結構,在任何時間,只有葉子execution處于活動狀態(tài)。最上層的execution稱為根execution,jBPM4里,根execution即為流程實例(在jBPM3里,記錄流程執(zhí)行位置的token和流程實例processInstance是獨立分開的)。


在兩種情況下,execution會產生子execution。一種情況是流程定義里存在并發(fā)路徑,此時execution會根據并發(fā)的路徑個數產生相應的子execution,子execution執(zhí)行完畢并匯聚后則會觸發(fā)它們的父execution繼續(xù)流轉。另外一種情況是節(jié)點定義存在自己的變量定義和時間服務定義,則執(zhí)行該節(jié)點時會為該節(jié)點產生一個獨立的子execution,產生該execution的目的在于使得該節(jié)點擁有獨立的作用域,這個子execution也被稱為scope execution。節(jié)點執(zhí)行完畢后,與之關聯(lián)的scope execution將會被移除,同時,父execution被重新激活流轉。

1、 execution的移動
execution的移動操作被封裝在atomicOperation里。execution通過執(zhí)行atomicOperation來推動其的轉移。目前移動execution的atomicOperation有7種,如下圖所示:

ExecutionActivity執(zhí)行節(jié)點定義的運行期行為。節(jié)點的運行期行為委派給ActivityBehaviour實現(xiàn),當需要對節(jié)點行為進行擴展時,需要實現(xiàn)ActivityBehaviour接口。jBPM4存在兩個對節(jié)點行為進行擴展的接口,分別是ActivityBehaviour和ExternalActivityBehaviour,ActivityBehaviour的execute方法在節(jié)點被執(zhí)行時調用;ExternalActivityBehaviour繼承自ActivityBehaviour,多出一個signal方法,在節(jié)點處于等待狀態(tài)被觸發(fā)流轉時調用。

Java代碼?
  1. ActivityBehaviour?activityBehaviour?=?activity.getBehaviour(); ??
  2. ??
  3. activityBehaviour.execute(execution);??
      ActivityBehaviour activityBehaviour = activity.getBehaviour();

activityBehaviour.execute(execution);
    

?



Signal執(zhí)行節(jié)點定義的運行期signal方法。

Java代碼?
  1. ExternalActivityBehaviour?externalActivityBehaviour?=?????(ExternalActivityBehaviour)?activity.getBehaviour(); ??
  2. ??
  3. externalActivityBehaviour.signal(execution,signalName,?parameters);??
      ExternalActivityBehaviour externalActivityBehaviour =     (ExternalActivityBehaviour) activity.getBehaviour();

externalActivityBehaviour.signal(execution,signalName, parameters);
    

?



一個典型的signal方法會調用execution的take方法,從而將execution移動至給定的轉移線上。jPDL里StateActivity類的signal方法:

Java代碼?
  1. execution.take(transition);??
      execution.take(transition);
    

?



看看execution的take方法,設置execution位置并執(zhí)行TransitionEndActivity:

Java代碼?
  1. //設置當前execution的位置 ??
  2. setTransition((TransitionImpl)?transition); ??
  3. ???? //觸發(fā)事件,執(zhí)行TRANSITION_END_ACTIVITY原子操作 ??
  4. fire(Event.END,getActivity(),AtomicOperation. ??
  5. TRANSITION_END_ACTIVITY);??
      //設置當前execution的位置
setTransition((TransitionImpl) transition);
    //觸發(fā)事件,執(zhí)行TRANSITION_END_ACTIVITY原子操作
fire(Event.END,getActivity(),AtomicOperation.
TRANSITION_END_ACTIVITY);
    

?



TransitionEndActivity銷毀移出節(jié)點的scope execution,接著執(zhí)行TransitionTake:

Java代碼?
  1. //如果activity存在scope?execution的話,則銷毀,返回父execution ??
  2. if ?(activity.isLocalScope())?{ ??
  3. ??????propagatingExecution?=?execution.destroyScope(activity); ??
  4. ?????} ??
  5. //父execution執(zhí)行TRANSITION_TAKE原子操作 ??
  6. propagatingExecution.performAtomicOperation(AtomicOperation. ??
  7. ???TRANSITION_TAKE);??
      //如果activity存在scope execution的話,則銷毀,返回父execution
if (activity.isLocalScope()) {
      propagatingExecution = execution.destroyScope(activity);
     }
//父execution執(zhí)行TRANSITION_TAKE原子操作
propagatingExecution.performAtomicOperation(AtomicOperation.
   TRANSITION_TAKE);
    

?



TransitionTake觸發(fā)轉移線的take事件,并執(zhí)行TransitionStartActivity:

Java代碼?
  1. execution.fire(Event.TAKE,transition,AtomicOperation. ??
  2. ?????TRANSITION_START_ACTIVITY);??
      execution.fire(Event.TAKE,transition,AtomicOperation.
     TRANSITION_START_ACTIVITY);
    

?



TransitionStartActivity設置execution位置為目標節(jié)點,創(chuàng)建scope execution并執(zhí)行ExecutionActivity:

Java代碼?
  1. //設置當前execution的位置 ??
  2. execution.setActivity(activity); ??
  3. ??
  4. ExecutionImpl?propagatingExecution?=?execution; ??
  5. //如果activity存在scope的話,則創(chuàng)建scope?execution ??
  6. ???? if ?(activity.isLocalScope())?{ ??
  7. ????????propagatingExecution?=?execution.createScope(activity); ??
  8. } ??
  9. ??
  10. propagatingExecution.setTransition( null ); ??
  11. //scope?execution執(zhí)行EXECUTE_ACTIVITY原子操作 ??
  12. propagatingExecution.performAtomicOperation(AtomicOperation. ??
  13. ????EXECUTE_ACTIVITY);??
      //設置當前execution的位置
execution.setActivity(activity);

ExecutionImpl propagatingExecution = execution;
//如果activity存在scope的話,則創(chuàng)建scope execution
    if (activity.isLocalScope()) {
        propagatingExecution = execution.createScope(activity);
}

propagatingExecution.setTransition(null);
//scope execution執(zhí)行EXECUTE_ACTIVITY原子操作
propagatingExecution.performAtomicOperation(AtomicOperation.
    EXECUTE_ACTIVITY);
    

?



上述5種原子操作構成了一個完整的execution節(jié)點間移動過程,分別是:執(zhí)行節(jié)點、觸發(fā)流轉、結束源節(jié)點、執(zhí)行轉移線和開始目標節(jié)點。如果節(jié)點是自動節(jié)點(沒有等待狀態(tài)),則觸發(fā)流轉(signal)這一步操作不會執(zhí)行。

存在結構塊的情況下,TransitionEndActivity會依次觸發(fā)父節(jié)點的結束事件,前提是下一個目標節(jié)點未被父節(jié)點所包含,如果包含,則屬于結構塊內的節(jié)點移動;TransitionStartActivity會依次觸發(fā)父節(jié)點的開始事件,前提同樣是上一個源節(jié)點未被該父節(jié)點所包含,不屬于結構塊內的節(jié)點移動。

MoveToParentActivity使用在節(jié)點執(zhí)行或signal時沒有指定傳播方式,同時又找不到移出的轉移線時,會去執(zhí)行父節(jié)點的signal操作。MoveToChildActivity使用在節(jié)點含有子節(jié)點時,將execution轉移至子節(jié)點執(zhí)行。這兩種原子操作共同構成了進入和結束結構塊時execution的移動行為。

?

jBPM4 PVM的流程定義模型與過程調度


更多文章、技術交流、商務合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 边摸边吃奶边做激情叫床 | 91精品久久久久久久久久 | 亚洲一区二区三 | 2018中文字幕在线观看 | www.天天操 | 国产午夜免费视频片夜色 | 91短视频免费版 | 男女日比 | 久久美乳 | 青草免费观看 | 欧美国产二区 | 日韩不卡在线视频 | 一级毛片 在线播放 | 99精品免费久久久久久久久日本 | 国产在视频线精品视频www666 | 看亚洲a级一级毛片 | 精品视频一区二区三区在线观看 | 中文字幕一区在线观看视频 | 久久精品二 | 天天澡天天碰天天狠伊人五月 | 国产精品第六页 | 精久久久 | 毛片网站在线 | 色久在线 | 国产一区二区精品丝袜 | 日本高清www午色夜黄 | 亚洲欧美日韩国产精品26u | 成年人看的羞羞网站 | 日韩天天操| 日韩美女一区二区三区在线观看 | 毛片99| 午夜精品久久久久久久99热浪潮 | 91精品国产综合久久久久 | 四虎影视网站 | 欧美综合网| 成人激情视频在线观看 | 亚洲精品三级 | 久久99精品久久久久久 | 成人性爱视频在线观看 | 欧美性猛交xxxx乱大交蜜桃 | 热99在线视频 |