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

jBPM4 PVM的流程定義模型與過程調(diào)度

系統(tǒng) 3136 0

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

?

?

PVM的流程定義模型

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

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

?


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

Java代碼 復(fù)制代碼
  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,其擴(kuò)展了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é)點(diǎn)定義。重要的是Activity自身華麗的變身:節(jié)點(diǎn)定義實(shí)現(xiàn)了嵌套,出現(xiàn)了結(jié)構(gòu)塊。看圖說話:

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


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

PVM的過程調(diào)度
jBPM4采用execution來記錄當(dāng)前流程執(zhí)行的位置,并通過移動execution來推動流程的流轉(zhuǎn)。

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是可以嵌套的,即會存在一種父子關(guān)系構(gòu)成樹狀結(jié)構(gòu),在任何時間,只有葉子execution處于活動狀態(tài)。最上層的execution稱為根execution,jBPM4里,根execution即為流程實(shí)例(在jBPM3里,記錄流程執(zhí)行位置的token和流程實(shí)例processInstance是獨(dú)立分開的)。


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

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

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

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

activityBehaviour.execute(execution);
    

?



Signal執(zhí)行節(jié)點(diǎn)定義的運(yùn)行期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方法會調(diào)用execution的take方法,從而將execution移動至給定的轉(zhuǎn)移線上。jPDL里StateActivity類的signal方法:

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

?



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

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

?



TransitionEndActivity銷毀移出節(jié)點(diǎn)的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ā)轉(zhuǎn)移線的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設(shè)置execution位置為目標(biāo)節(jié)點(diǎn),創(chuàng)建scope execution并執(zhí)行ExecutionActivity:

Java代碼?
  1. //設(shè)置當(dāng)前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);??
      //設(shè)置當(dāng)前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種原子操作構(gòu)成了一個完整的execution節(jié)點(diǎn)間移動過程,分別是:執(zhí)行節(jié)點(diǎn)、觸發(fā)流轉(zhuǎn)、結(jié)束源節(jié)點(diǎn)、執(zhí)行轉(zhuǎn)移線和開始目標(biāo)節(jié)點(diǎn)。如果節(jié)點(diǎn)是自動節(jié)點(diǎn)(沒有等待狀態(tài)),則觸發(fā)流轉(zhuǎn)(signal)這一步操作不會執(zhí)行。

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

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

?

jBPM4 PVM的流程定義模型與過程調(diào)度


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

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

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

【本文對您有幫助就好】

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

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 婷婷色九月 | 婷婷国产天堂久久综合五月 | 99久久精品99999久久 | 国产视频一区二区在线播放 | 香蕉视频在线观看黄 | 免费观看成人羞羞视频网站观看 | 日韩精品成人a在线观看 | 欧美xxx精品| 99久久99热久久精品免费 | 国产欧美日韩亚洲精品区2345 | 久久黄色免费视频 | 久久ri精品高清一区二区三区 | 四虎在线影视在线影库 | 国产成人综合日韩精品婷婷九月 | 国产精品19p | 国产女人又爽又大 | 玖玖国产| 亚洲一区精品视频在线 | 国产极品精频在线观看 | 久久视频这里只有精品 | 一级毛片免费视频 | 欧洲欧美成人免费大片 | 精品伊人久久大香线蕉网站 | 天天天做天天天天爱天天想 | 日韩精品一区二区三区中文精品 | 黄色免费在线观看 | 亚洲欧洲视频在线观看 | 一级毛片一级毛片一级级毛片 | 精品人人做人人爽久久久 | 愉拍自拍视频在线播放 | 亚洲欧洲第一页 | 日本sese | 欧美日韩国产高清 | 日韩中文字幕在线亚洲一区 | 日本精品久久久中文字幕 | 国产一区二区三区精品久久呦 | 国产精品亚洲欧美一级久久精品 | 男人天堂.com| 在线免费精品视频 | 午夜干b | 色综合久久九月婷婷色综合 |