亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

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

系統 3068 0

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

?

?

PVM的流程定義模型

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

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

?


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

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

?



和傳統的觀察者模式一致,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來說,這是一件很自然地事情:流程定義包含多個節點定義。重要的是Activity自身華麗的變身:節點定義實現了嵌套,出現了結構塊。看圖說話:

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


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

PVM的過程調度
jBPM4采用execution來記錄當前流程執行的位置,并通過移動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處于活動狀態。最上層的execution稱為根execution,jBPM4里,根execution即為流程實例(在jBPM3里,記錄流程執行位置的token和流程實例processInstance是獨立分開的)。


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

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

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

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

activityBehaviour.execute(execution);
    

?



Signal執行節點定義的運行期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位置并執行TransitionEndActivity:

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

?



TransitionEndActivity銷毀移出節點的scope execution,接著執行TransitionTake:

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

?



TransitionTake觸發轉移線的take事件,并執行TransitionStartActivity:

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

?



TransitionStartActivity設置execution位置為目標節點,創建scope execution并執行ExecutionActivity:

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

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

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

?



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

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

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

?

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


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

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

【本文對您有幫助就好】

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

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 成人在线不卡 | 国产免费福利 | 日本欧美日韩 | 99精品热视频 | 免费xxx | 四虎影视在线观看 | 精品伊人久久久99热这里只 | 亚洲高清视频一区 | 欧美成人免费午夜影视 | 狠狠狠狼鲁欧美综合网免费 | 色射综合 | 伊人95| 九九国产在线观看 | 成人免费观看高清在线毛片 | 国产精品你懂得 | 网曝门精品国产事件在线观看 | 一级影院| 九九99九九在线精品视频 | 日日夜夜免费精品 | 成人性色生活片免费看爆迷你毛片 | 九九99re在线视频精品免费 | 99久久精品6在线播放 | 亚洲精品动漫一区二区三区在线 | 亚洲另类第一页 | 欧美精品v欧洲精品 | 成人亚洲性情网站www在线观看 | 久久婷婷丁香七月色综合 | 亚洲第一红杏精品久久 | 一级看片免费视频 | 爱爱免费网址 | 中文字幕一区视频一线 | 四虎在线永久免费观看 | 同性女女黄h片在线播放 | 国产欧美一区二区三区免费看 | 日韩免费高清一级毛片久久 | 国产乱肥老妇精品视频 | 男女性高清爱潮视频免费观看 | 香蕉视频在线网站 | 狠狠的日| 色国产精品一区在线观看 | 777奇米视频 |