posts - 26,  comments - 7,  trackbacks - 0
            2007年9月19日
               摘要:   閱讀全文
          posted @ 2007-12-12 16:16 jbpm 閱讀(1840) | 評(píng)論 (0)編輯 收藏
               摘要:   閱讀全文
          posted @ 2007-12-12 16:13 jbpm 閱讀(1474) | 評(píng)論 (0)編輯 收藏

          作者:楊洪波
          jbpm解析流程定義有三種方式:
          1)par包
          static ProcessDefinition auctionProcess =
                ProcessArchive.parse("org/jbpm/tdd/auction.par");
          注意,必須在classes的org/jbpm/tdd/目錄下有一個(gè)auction.par文件

          2)xml文件方式
          static ProcessDefinition auctionProcess =
                JpdlXmlReader.parseFromResource("org/jbpm/tdd/auction.xml");
          注意,必須在classes的org/jbpm/tdd/目錄下有一個(gè)auction.xml文件

          3)文本方式
          static ProcessDefinition auctionProcess = JpdlXmlReader.parse(
              "<process-definition>" +
              "  <start-state name='start'>" +
              "    <transition to='auction'/>" +
              "  </start-state>" +
              "  <state name='auction'>" +
              "    <transition to='end'/>" +
              "  </state>" +
              "  <end-state name='end'/>" +
              "</process-definition>");
          這種方式的本質(zhì)和xml文件解析方式是一樣的.

          posted @ 2007-11-22 18:02 jbpm 閱讀(757) | 評(píng)論 (0)編輯 收藏

          作者:楊洪波

          作者:楊洪波

          shark和jbpm配置文件處理方式比較

          1.都使用了單例模式
          我想這個(gè)是最基本的,一般的程序員寫解析程序都會(huì)這樣使用;要說明的是,AgileFlow
          除了使用單例模式,還實(shí)現(xiàn)了配置文件的動(dòng)態(tài)裝載,如果用戶修改了配置文件,它能夠在
          運(yùn)行中動(dòng)態(tài)的獲取這些變化.
          使用jbpm時(shí),第一句話就要使用該模式:JbpmServiceFactory.getInstance()....

          2.都實(shí)現(xiàn)了缺省配置和定制配置
          Shark中,缺省配置放在一個(gè)深層次的目錄中,定制配置放在config目錄,兩個(gè)配置
          文件的內(nèi)容差不多;
          jbpm中,缺省配置放在代碼中實(shí)現(xiàn),如下:
          propertyClassNames = new HashMap();
          propertyClassNames.put( "default", "org.jbpm.impl.DefaultServiceFactory" );
          abbreviatedClassNames.put( "jbpm.service.factory", propertyClassNames );
          定制配置放在config目錄中,為jbpm.properties
          比較而言,jbpm的實(shí)現(xiàn)方式要好,理由如下:
          1)缺省配置容易找到
          2)定制配置很簡(jiǎn)單,默認(rèn)是沒有配置的,比shark的要清爽很多

          3.都實(shí)現(xiàn)了用一個(gè)單例實(shí)現(xiàn)多個(gè)單例
          我在Shark學(xué)習(xí)系列的文章中討論過這個(gè)功能,jbpm是在JbpmConfiguration.java中實(shí)現(xiàn)的:
          private void instantiateConfiguredObjects() {
              // instantiate configured objects
              this.fileMgr = (FileMgr) instantiate( "jbpm.file.mgr", FileMgr.class );
              this.idGenerator = (IdGenerator) instantiate( "jbpm.id.generator", IdGenerator.class );
              this.serviceFactory = (ServiceFactory) instantiate( "jbpm.service.factory", ServiceFactory.class );
          }

          1.都使用了單例模式
          我想這個(gè)是最基本的,一般的程序員寫解析程序都會(huì)這樣使用;要說明的是,AgileFlow
          除了使用單例模式,還實(shí)現(xiàn)了配置文件的動(dòng)態(tài)裝載,如果用戶修改了配置文件,它能夠在
          運(yùn)行中動(dòng)態(tài)的獲取這些變化.
          使用jbpm時(shí),第一句話就要使用該模式:JbpmServiceFactory.getInstance()....

          2.都實(shí)現(xiàn)了缺省配置和定制配置
          Shark中,缺省配置放在一個(gè)深層次的目錄中,定制配置放在config目錄,兩個(gè)配置
          文件的內(nèi)容差不多;
          jbpm中,缺省配置放在代碼中實(shí)現(xiàn),如下:
          propertyClassNames = new HashMap();
          propertyClassNames.put( "default", "org.jbpm.impl.DefaultServiceFactory" );
          abbreviatedClassNames.put( "jbpm.service.factory", propertyClassNames );
          定制配置放在config目錄中,為jbpm.properties
          比較而言,jbpm的實(shí)現(xiàn)方式要好,理由如下:
          1)缺省配置容易找到
          2)定制配置很簡(jiǎn)單,默認(rèn)是沒有配置的,比shark的要清爽很多

          3.都實(shí)現(xiàn)了用一個(gè)單例實(shí)現(xiàn)多個(gè)單例
          我在Shark學(xué)習(xí)系列的文章中討論過這個(gè)功能,jbpm是在JbpmConfiguration.java中實(shí)現(xiàn)的:
          private void instantiateConfiguredObjects() {
              // instantiate configured objects
              this.fileMgr = (FileMgr) instantiate( "jbpm.file.mgr", FileMgr.class );
              this.idGenerator = (IdGenerator) instantiate( "jbpm.id.generator", IdGenerator.class );
              this.serviceFactory = (ServiceFactory) instantiate( "jbpm.service.factory", ServiceFactory.class );
          }

          posted @ 2007-11-22 17:59 jbpm 閱讀(483) | 評(píng)論 (0)編輯 收藏
               摘要: 目前我看過采用JBPM的工作流有web-console (JBPM 3.2.1自帶)、RUNA WFE、SMART,就這三個(gè)我做一個(gè)比較:

          RUNA WFE

          RUNA WFE是上面提到的三個(gè)中,唯一可以直接部署應(yīng)用的,當(dāng)然也有它的缺點(diǎn),下面我會(huì)提到。這個(gè)框架采用的是Struts作為表示層,流程管理和組織架構(gòu)管理都做的不錯(cuò),良好的國際化,文檔很全。如果只打算研究可以看下它的permission部分,它已經(jīng)實(shí)現(xiàn)了對(duì)流程查看、啟動(dòng)、結(jié)束等的權(quán)限控制,JBPM自身在這部分基本還是TODO狀態(tài)。

            閱讀全文
          posted @ 2007-11-11 16:24 jbpm 閱讀(2022) | 評(píng)論 (0)編輯 收藏
               摘要: 研究工作流及其相關(guān)技術(shù)的人一定知道這個(gè)組織——工作流管理聯(lián)盟(簡(jiǎn)稱WfMC,Workflow Management Coalition),其成立于1993年。作為工作流技術(shù)標(biāo)準(zhǔn)化的工業(yè)組織,WfMC提出的工作流系統(tǒng)參考模型(Reference Model)無疑為各家工作流軟件廠商的系統(tǒng)設(shè)計(jì)規(guī)劃提供了最權(quán)威的參考,乃至標(biāo)準(zhǔn)。下面就是這個(gè)參考模型:

            閱讀全文
          posted @ 2007-11-11 16:00 jbpm 閱讀(989) | 評(píng)論 (0)編輯 收藏
          作者:胡長(zhǎng)城
           
                  目前主要列出了13家公司,這幾家主要是做workflow的。當(dāng)然,目前國內(nèi)做OA,做Platform(包含workflow)的公司很多,但是,在workflow方面非常專注的,比較少。
                  還有很多公司沒有列出來,主要是個(gè)人感覺他們?cè)趙orkflow這一個(gè)方面并不是非常強(qiáng)勁(可能他們的product,platform很好),比如:BOS(金蝶),EOS(普元),GK-Workflow(北京點(diǎn)擊科技),iOffice.net(廣州紅帆),KA-2(北京科諾),OW4J(Oracle中國),UAP(用友),HotOA(上海華炎),ZoTn(中唐)。還有些小型的工作流產(chǎn)品公司,產(chǎn)品并不是非常有特色,也沒有列出來,比如:WiseFlow(上海維泰),aoflow(北京奧寶)

                   目前我所知道的,在國內(nèi)比較有名的國外workflow/BPM 廠商,主要有三家:Ultimus(較早進(jìn)入中國),BusinessWare(北京麒麟,美國VITRIA),2003年進(jìn)入中國; webMethods(2003年底在北京成立辦事處)
                   以下的“”表示可workflow參考度和可研究度,越多表示產(chǎn)品在workflow這一方面更有特點(diǎn)。注:BusinessWare只給了三個(gè)“”,是表示其所定位在解決方案和項(xiàng)目實(shí)施,整個(gè)產(chǎn)品定位在Business Process Integration層次,有些超越目前國內(nèi)市場(chǎng)需求。

          編號(hào)

           

           

           

          I00

          ★★★

          AWF(北京炎黃盈動(dòng))

          嵌入式的工作流平臺(tái),功能不是太完善,主要研發(fā)實(shí)力不足

          I01

          ★★

          DLFlo(上海東蘭)

          2000就開始做工作流平臺(tái),2002年推出了java版本。但整體來看,發(fā)展的不是很理想

          I02

          ★★★★★

          LiveFlow(上海東蘭)

          DLFlo定位差不多,都面向二次開發(fā)平臺(tái)。但是正個(gè)產(chǎn)品還是停留在“workflow”功能層次。—— 但是,吸收了DLFlo的很多經(jīng)驗(yàn),所以其工作流平臺(tái)目前還是屬于國內(nèi)前列

          I03

          ★★★

          BusinessWare(北京麒麟遠(yuǎn)創(chuàng))

          主要方向是BPMBPI(業(yè)務(wù)流程整合)。整個(gè)產(chǎn)品是一個(gè)“集成平臺(tái)”。

          I04

          ★★

          e-cology(上海泛微)

          但從workflow這個(gè)層次來說,泛微沒有太多的特色。

          I05

          ★★

          eWay Platform(北京東方易維)

          Eway的黃金時(shí)代已經(jīng)一去不復(fù)返了,自動(dòng)“馬毅”那個(gè)團(tuán)隊(duì)離開以后。工作流的一些理念當(dāng)時(shí)還是值得的,有些類似ofbiz。表單處里采用二次開發(fā)jsp頁面來處理。

          I06

          ★★★

          JKCFlow(四川金科成)

          JFCFlow從早期的工作流產(chǎn)品轉(zhuǎn)移向“業(yè)務(wù)基礎(chǔ)軟件平臺(tái)”,但是整個(gè)產(chǎn)品平臺(tái)目前還只能算是,一個(gè)OA開發(fā)平臺(tái)。在workflowmodel方面并不是非常的強(qiáng)

          I07

          ★★★★

          JoinWork(上海天際星)

          Joinwork剛剛推出來,其開發(fā)者丁宏比較欣賞jBPMjoinwork很多思想也是參考了jBPM。但功能上稍微弱了點(diǎn)。但是其基于SWT的設(shè)計(jì)思想很值得借鑒。

          I08

          ★★★★

          Koof MetaLogic(北京世紀(jì)金政)

          去年推出的workflow產(chǎn)品,專做工作流平臺(tái),雖然主要定位于oa和電子政務(wù)平臺(tái),但工作流這一快,還是有很多克參考的功能。

          I09

          ★★★

          RiseOffice(北京有生博大)

          當(dāng)前版本riseoffice5.1,整個(gè)工作流產(chǎn)品基本上為“OA審批流程”量身定做。其表單處里和權(quán)限控制很有特色,以及審批歷程的處理。整個(gè)design端時(shí)采用web的,用的 addflow控件。

          I10

          ★★★★★

          SunFlow(杭州信雅達(dá))

          sunFlow這一兩年發(fā)展很迅速,大有趕超SynchroFlow 趨勢(shì)。

          其產(chǎn)品最大的特色是采用基于域的聯(lián)邦系統(tǒng)架構(gòu),對(duì)分布式管理、運(yùn)行支持較好。而且也是目前國內(nèi)為數(shù)不多的可以支持“仿真”的工作流系統(tǒng)。

          I11

          ★★★★★

          SynchroFlow(西安協(xié)同數(shù)碼)

          基本上非常嚴(yán)格遵循了wfmc的規(guī)范,完全實(shí)現(xiàn)了interface1interface2interface3interface5

          這一點(diǎn)上,SunFlowSynchroFlow都有很多相像的地方,都遺留很多學(xué)院研究的特點(diǎn)(這兩個(gè)產(chǎn)品的最初原型都是在大學(xué)中誕生的)。

          I12

          ★★★★★

          Utimus(國內(nèi))
          上海敏照(增值代理商),上海永信(增值代理商)
          Ultimus
          上海分公司

          進(jìn)入中國最早的國外工作流產(chǎn)品,整個(gè)產(chǎn)品采用邏輯的組織結(jié)構(gòu)圖,工作流系統(tǒng)支持的功能也很強(qiáng)。其比較有特色的是其“事件條件表

          posted @ 2007-10-28 12:21 jbpm 閱讀(2999) | 評(píng)論 (4)編輯 收藏
            作者:胡長(zhǎng)城
          今天和同事chelsea 就活動(dòng)實(shí)例狀態(tài)的實(shí)現(xiàn)思路上進(jìn)行了討論。我們兩個(gè)站在了兩個(gè)不同的角度來看待,這兩個(gè)不同的角度也正好眼下最為常見到的兩種實(shí)現(xiàn)思路:
          helsea是從狀態(tài)角度來看待,當(dāng)然也完全是從state pattern的角度來思考:狀態(tài)在達(dá)到某個(gè)狀態(tài)的時(shí)候,會(huì)引起或必須引起活動(dòng)實(shí)例執(zhí)行什么操作。

          而我是從活動(dòng)實(shí)例的角度來考慮,活動(dòng)實(shí)例的狀態(tài)只是活動(dòng)實(shí)例的一個(gè)屬性體,是因?yàn)槭裁葱袨椋斐闪耸裁礌顟B(tài)的結(jié)果。


           這兩種觀點(diǎn),沒有誰對(duì)誰錯(cuò),也沒有誰優(yōu)誰劣,兩者是站在不同的角度來分析同一個(gè)問題。其實(shí)這兩種模式在應(yīng)用中都是很普遍的,也都是能夠很好的解決問題的。不過在現(xiàn)有的workflow引擎實(shí)現(xiàn)中,基于活動(dòng)實(shí)例的角度是占絕大多數(shù)的,比如obe,shark等等。所以我受這個(gè)的影響也是比較深的。


          先說說基于活動(dòng)活動(dòng)實(shí)例的角度的思路吧:



          讓我下先來看看狀態(tài)類:

          public final class WMActivityInstanceState extends WMObjectState {

          public static final int OPEN_NOTRUNNING_INT = 0;

          public static final int OPEN_SUSPENDED_INT = 1;

          }

          或者也可以這么表示:

          public enum WMActivityInstanceState{

          NOTRUNNIN(0),

          SUSPENDED(1);

          private int code;

          private WMActivityInstanceState(int code){this.code = code;}
          public int getCode(){return this.code}

          }




          對(duì)于活動(dòng)實(shí)例來說,狀態(tài)只是其一個(gè)屬性而已:

          public class BasicActivityInstance extends BasicAttributedEntity{

          private int _state;

          public void setState(int state) {

          _state = state; }

          }

          或者也可以是

          Public void setState(WMActivityInstanceState state)




          所以,從活動(dòng)實(shí)例的角度來看,狀態(tài)之間的關(guān)系是平行的。你可以在執(zhí)行完一些初始化的操作之后,將活動(dòng)實(shí)例的狀態(tài)設(shè)置為Initialized:當(dāng)然這個(gè)操作你必須顯示的去設(shè)置活動(dòng)實(shí)例(當(dāng)然,你可以用一些Event去處理),比如調(diào)用活動(dòng)實(shí)例的setState方法。至于為什么調(diào)用這個(gè)方法,或者此時(shí)設(shè)置的狀態(tài)是對(duì)是錯(cuò),活動(dòng)實(shí)例并不關(guān)心。



          下面再來說說基于狀態(tài)角度的思路吧,這個(gè)思路大體可以說就是state pattern的應(yīng)用。



               說道這兒,您可以看看這篇文檔:從工作流狀態(tài)機(jī)實(shí)踐中總結(jié)狀態(tài)模式使用心得 。當(dāng)然如果您對(duì)state pattern不是很了解,那么建議你先看看這篇文檔:設(shè)計(jì)模式之state 。



              State模式的著眼點(diǎn)就是狀態(tài),以狀態(tài)的變遷影響實(shí)例的行為和動(dòng)作。其實(shí)這就是兩個(gè)不同的抽象體:state和stateOwner,我們可以看到,活動(dòng)實(shí)例對(duì)象就表現(xiàn)為stateOwner。

             State模式的依據(jù)是狀態(tài)之間是有有向連接關(guān)系的,這有向連接關(guān)系其實(shí)就是狀態(tài)的轉(zhuǎn)換規(guī)則:A-B-C-D-A。

             激發(fā)狀態(tài)的變遷,是由外界的事件(Event)影響的:這個(gè)事件會(huì)告知,當(dāng)前的活動(dòng)實(shí)例狀態(tài)要從當(dāng)前狀態(tài)往下一個(gè)狀態(tài)變遷。而活動(dòng)實(shí)例并不知道下一個(gè)狀態(tài)是什么,這完全是狀態(tài)對(duì)象負(fù)責(zé)維護(hù)和告知的。



          至此,我們可以看出來了,兩種方式的不同:

          第一種方式(基于活動(dòng)實(shí)例),其外界事件是影響到活動(dòng)實(shí)例,或者說在事件中顯示的告知活動(dòng)實(shí)例狀態(tài)從什么變?yōu)槭裁础?br />
          第二種方式(基于實(shí)例狀態(tài)),其外界事件是影響到活動(dòng)實(shí)例狀態(tài)對(duì)象,至于這個(gè)狀態(tài)的下一個(gè)狀態(tài)是什么,時(shí)間并不知道,完全由活動(dòng)狀態(tài)之間的關(guān)系來維護(hù)。


          posted @ 2007-10-28 12:12 jbpm 閱讀(711) | 評(píng)論 (0)編輯 收藏

          作者:tomkoo
          以下例子中 采用了jbpm console 的幾個(gè)實(shí)例用戶

          項(xiàng)目提交人 : ernie .

          主管審批 : bert

          會(huì)簽 : ernie , bert , grover

          老板審批 : grover

           

          正常流程: 項(xiàng)目金額 >= 500W RMB

          提交項(xiàng)目 --> 主管審批 --> 會(huì)簽 --> 老板審批 --> 審批通過(結(jié)束)

          正常流程: 項(xiàng)目金額 < 500W RMB

          提交項(xiàng)目 --> 主管審批 --> 會(huì)簽 --> 審批通過(結(jié)束)

          其中主管審批, 會(huì)簽, 老板審批 , 不通過, 全部退回給項(xiàng)目提交人修改.

          會(huì)簽中: 所有人全通過, 則通過. 任何一人不通過, 停止其他會(huì)簽任務(wù).退回給提交人.

          流程定義如下:

          1. <?xml version="1.0" encoding="UTF-8"?>  
          2.   
          3. <process-definition xmlns="urn:jbpm.org:jpdl-3.1"  
          4.     name="tc_prj_approval">  
          5.   
          6.     <swimlane name="initiator" />  
          7.   
          8.     <!項(xiàng)目提交人 >  
          9.     <swimlane name="requester">  
          10.         <assignment expression="user(ernie)" />  
          11.     </swimlane>  
          12.   
          13.     <! 主管 >  
          14.     <swimlane name="chief">  
          15.         <assignment expression="user(bert)" />  
          16.     </swimlane>  
          17.   
          18.     <!老板 >  
          19.     <swimlane name="boss">  
          20.         <assignment expression="user(grover)" />  
          21.     </swimlane>  
          22.   
          23.     <!會(huì)簽人 >  
          24.     <swimlane name="cosinger">  
          25.         <assignment class="net.chenj.jbpm.sample.CosingerAssiHandler">  
          26.         </assignment>  
          27.     </swimlane>  
          28.     <start-state name="start">  
          29.         <task name="tc_prj_newprj" swimlane="initiator"></task>  
          30.         <transition name="to_submit" to="tc_prj_submit"></transition>  
          31.     </start-state>  
          32.     <task-node name="tc_prj_submit">  
          33.         <task name="tc_prj_submit"></task>  
          34.         <transition name="to_chiefapprove" to="tc_prj_chiefapprove"></transition>  
          35.     </task-node>  
          36.     <task-node name="tc_prj_chiefapprove">  
          37.         <task name="tc_prj_chiefapprove"></task>  
          38.         <transition name="approve" to="tc_prj_countersign"></transition>  
          39.         <transition name="disapprove" to="tc_prj_submit"></transition>  
          40.     </task-node>  
          41.     <task-node name="tc_prj_countersign" signal="last-wait"  
          42.         create-tasks="false">  
          43.         <task name="tc_prj_countersign">  
          44.             <event type="task-end">  
          45.                 <action  
          46.                     class="net.chenj.jbpm.sample.TaskEndCountersign">  
          47.                 </action>  
          48.             </event>  
          49.   
          50.         </task>  
          51.   
          52.         <event type="node-enter">  
          53.             <action name="createInstance"  
          54.                 class="net.chenj.jbpm.sample.CreateTaskInstanceCountersign">  
          55.             </action>  
          56.         </event>  
          57.   
          58.         <transition name="approve" to="amount_decision"></transition>  
          59.         <transition name="disapprove" to="tc_prj_submit"></transition>  
          60.     </task-node>  
          61.     <decision name="amount_decision">  
          62.         <transition name="to_bossapprove" to="tc_prj_bossapprove"></transition>  
          63.         <transition name="to_end" to="end1"></transition>  
          64.     </decision>  
          65.     <task-node name="tc_prj_bossapprove">  
          66.         <task name="tc_prj_bossapprove"></task>  
          67.         <transition name="approve" to="end1"></transition>  
          68.         <transition name="disapprove" to="tc_prj_submit">  
          69.             <condition>#{amount >= 500}</condition>  
          70.         </transition>  
          71.     </task-node>  
          72.     <end-state name="end1"></end-state>  
          73. </process-definition>  
          74.   

           

          會(huì)簽swimlane class

          1. package net.chenj.jbpm.sample;   
          2.   
          3. import org.jbpm.graph.exe.*;   
          4. import org.jbpm.taskmgmt.def.*;   
          5. import org.jbpm.taskmgmt.exe.Assignable;   
          6.   
          7. public class CosingerAssiHandler implements AssignmentHandler {   
          8.   
          9.     private static final long serialVersionUID = 1L;   
          10.   
          11.     public void assign(Assignable assignable, ExecutionContext executionContext) {   
          12.         // 從數(shù)據(jù)庫或者ldap 讀取會(huì)簽人設(shè)置   
          13.         String[] a = { "ernie""bert""grover" };   
          14.         assignable.setPooledActors(a);   
          15.     }   
          16.   
          17. }   
          18.   

          創(chuàng)建會(huì)簽任務(wù)實(shí)現(xiàn)類

           

           

          1. package net.chenj.jbpm.sample;   
          2.   
          3. import org.jbpm.graph.def.ActionHandler;   
          4. import org.jbpm.graph.exe.ExecutionContext;   
          5. import org.jbpm.graph.exe.Token;   
          6. import org.jbpm.graph.node.TaskNode;   
          7. import org.jbpm.taskmgmt.def.Task;   
          8. import org.jbpm.taskmgmt.exe.TaskMgmtInstance;   
          9.   
          10. public class CreateTaskInstanceCountersign implements ActionHandler {   
          11.   
          12.     private static final long serialVersionUID = 1L;   
          13.   
          14.     public void execute(ExecutionContext executionContext) throws Exception {   
          15.   
          16.         Token token = executionContext.getToken();   
          17.         TaskMgmtInstance tmi = executionContext.getTaskMgmtInstance();   
          18.         TaskNode taskNode = (TaskNode) executionContext.getNode();   
          19.         Task task = taskNode.getTask("tc_prj_countersign");   
          20.         // 從數(shù)據(jù)庫或者ldap 讀取會(huì)簽人設(shè)置創(chuàng)建任務(wù)實(shí)例   
          21.         tmi.createTaskInstance(task, token).setActorId("ernie");   
          22.         tmi.createTaskInstance(task, token).setActorId("bert");   
          23.         tmi.createTaskInstance(task, token).setActorId("grover");   
          24.   
          25.     }   
          26.   
          27. }   

           

          結(jié)束不通過時(shí)結(jié)束其他會(huì)簽任務(wù)實(shí)現(xiàn)

          1. package net.chenj.jbpm.sample;   
          2.   
          3. import java.util.Collection;   
          4. import java.util.Iterator;   
          5. import org.jbpm.graph.def.ActionHandler;   
          6. import org.jbpm.graph.exe.ExecutionContext;   
          7. import org.jbpm.taskmgmt.exe.TaskInstance;   
          8. import org.jbpm.taskmgmt.exe.TaskMgmtInstance;   
          9.   
          10. public class TaskEndCountersign implements ActionHandler {   
          11.   
          12.     private static final long serialVersionUID = 1L;   
          13.   
          14.     public void execute(ExecutionContext executionContext) throws Exception {   
          15.   
          16.        
          17.         boolean isDisapprove = Boolean.valueOf((String) executionContext   
          18.                 .getVariable("isDisapprove"));   
          19.         // 如果有一個(gè)任務(wù)實(shí)例拒絕通過則結(jié)束除當(dāng)前任務(wù)實(shí)例外其他任務(wù)實(shí)例   
          20.         if (isDisapprove) {   
          21.             TaskMgmtInstance tmi = executionContext.getTaskMgmtInstance();   
          22.             TaskInstance ti = executionContext.getTaskInstance();   
          23.             final String actorId = ti.getActorId();   
          24.             Collection c = tmi.getSignallingTasks(executionContext);   
          25.             for (Iterator it = c.iterator(); it.hasNext();) {   
          26.                 TaskInstance task = (TaskInstance) it.next();   
          27.                 if (!(actorId.equals(task.getActorId())) && (!task.hasEnded())) {   
          28.                     task.end("disapprove");   
          29.                 }   
          30.             }   
          31.         }   
          32.   
          33.     }   
          34.   
          35. }   

           

           

          posted @ 2007-10-15 17:34 jbpm 閱讀(6234) | 評(píng)論 (0)編輯 收藏

          作者:Ni Yue
          前一段時(shí)間做的一個(gè)jbpm和shark的feature對(duì)比,今天整理筆記突然又看到這張記錄紙了,so post here and drop the paper.作比較的時(shí)候Shark是1.0版本,而Jbpm是2.0版本(現(xiàn)在已經(jīng)出到3.0了)

           

          Shark

          Jbpm

          持久層 Shark自己的一個(gè)ORM的方案DODS,感覺不是很好 大名鼎鼎的 Hibernate(Jbpm2中使用的是Hibernate 2.1,Jbpm3種使用的是Hibernate3)
          靈活性 Shark給人的感覺就是龐大,需要獨(dú)立的運(yùn)行一個(gè)工作量引擎服務(wù) 相對(duì)更加靈活,和OSWorkflow有的一比,也可以作為嵌入式的工作流引擎
          后臺(tái)管理 其實(shí)這點(diǎn)和上面一點(diǎn)有點(diǎn)相對(duì)應(yīng)了,靈活性差其實(shí)是由于提供的功能太多的緣故,Shark自帶了一個(gè)管理程序,界面雖然差了一點(diǎn),但是功能滿全面的 Jbpm2中沒有提供后臺(tái)的管理,Jbpm3還沒怎么用過,好像是有的,不知道具體功能如何
          流程定義的圖形設(shè)計(jì)器 Shark使用的WfMC定義的XPDL語言定義流程,有一個(gè)JaWE來圖形化定義流程,不過XPDL是在是看起來很難懂 Jbpm2中沒有流程圖形定義器,不過Jbpm3中已經(jīng)有了,是基于Eclipse的一個(gè)插件,可以使用它定義Jbpm使用的JPDL,而且不僅是插件形式,后面還會(huì)出stand alone的版本
          表單定制 這個(gè)Shark可以借助XPDL來進(jìn)行表單定制,沒看太懂就是了 Jbpm2不支持,原來看了Jbpm的MailList里面說在考慮Jbpm3中會(huì)加入這方面的內(nèi)容,現(xiàn)在似乎沒有看到還
          用戶模型 好像必須采用Shark中的用戶模型 靈活性的體現(xiàn),任意的用戶模型。Jbpm3.1的roadmap里面考慮自帶一個(gè)簡(jiǎn)單的用戶模型供使用
          異構(gòu)系統(tǒng)交互 Shark可以開CORBA的服務(wù),這個(gè)方面的功能很強(qiáng)大 只能通過Java和異構(gòu)系統(tǒng)的交互似乎,Java能做的Jbpm就行
          學(xué)習(xí)成本 Shark使用的XPDL很難看懂… 相對(duì)簡(jiǎn)單
          文檔 感覺是一片空白,給的那幾個(gè)pdf都不頂什么用,用兩三個(gè)小時(shí)就全部看完了,組織的不是很好而且。相對(duì)其他的方面,這個(gè)是最大的缺點(diǎn)了 挺全面的文檔,一個(gè)chapter一個(gè)chapter的,看起來也方便
          posted @ 2007-10-15 15:09 jbpm 閱讀(1093) | 評(píng)論 (0)編輯 收藏
               摘要: 是一張Ultimus為一個(gè)簡(jiǎn)單變更定單流程開發(fā)的地圖。一個(gè)客戶申請(qǐng)變更一個(gè)產(chǎn)品或服務(wù)將啟動(dòng)本流程。在收到申請(qǐng)以后,工程經(jīng)理能拒絕申請(qǐng),需要一個(gè)EMAIL提醒發(fā)送給客戶,或申請(qǐng)同時(shí)輸入到3個(gè)其他團(tuán)隊(duì)(軟件,電子,機(jī)械)。當(dāng)所有需求團(tuán)隊(duì)反饋后,流程使用網(wǎng)絡(luò)服務(wù)申請(qǐng)一個(gè)包括變更所有的輸入和時(shí)間和成本的預(yù)算包。這些信息將反饋給工程經(jīng)理做最終檢查和調(diào)整。此時(shí),工程經(jīng)理又一次能夠拒絕申請(qǐng)(如果成本或時(shí)間預(yù)估過高)。否則,信息將提交給銷售部門添加任何補(bǔ)充信息。然后流程將自動(dòng)生成一個(gè)報(bào)價(jià)并且和提醒一起發(fā)送給客戶。  閱讀全文
          posted @ 2007-09-23 19:25 jbpm 閱讀(524) | 評(píng)論 (0)編輯 收藏
               摘要: JBoss jBPM is a flexible, extensible workflow management system. JBoss jBPM has an intuitive process language to express business processes graphically in terms of tasks, wait states for asynchronous communication, timers, automated actions,... To bind these operations together, JBoss jBPM has the most powerful and extensible control flow mechanism.

            閱讀全文
          posted @ 2007-09-23 19:18 jbpm 閱讀(749) | 評(píng)論 (0)編輯 收藏
               摘要: 在下面的例子里,我們將向您展示如何能給用戶分配任務(wù)。因?yàn)樵趈BPM工作流

          引擎和組織機(jī)構(gòu)模型之間是分離的,對(duì)計(jì)算參與者的表達(dá)語言將總是被限制的。

          因此,你必須指定一個(gè)任務(wù)處理的實(shí)現(xiàn),包括計(jì)算任務(wù)參與者
            閱讀全文
          posted @ 2007-09-23 16:29 jbpm 閱讀(1192) | 評(píng)論 (0)編輯 收藏
               摘要: 城市政府寬帶網(wǎng)絡(luò)軟件平臺(tái)連接一個(gè)城市的市政府、黨的機(jī)關(guān)、人大、政法四大類幾十甚至上百個(gè)機(jī)關(guān)。政府部門中有大量的工作是需要部門內(nèi)、部門之間的多部門、多工作崗位、多工作人員協(xié)同工作來完成的。而且其工作呈工作流狀態(tài)和事務(wù)性狀態(tài)(既工作流程的完整性)。
            閱讀全文
          posted @ 2007-09-23 15:56 jbpm 閱讀(689) | 評(píng)論 (0)編輯 收藏
               摘要: 工作流一直是實(shí)施BPM的重要環(huán)節(jié),以往的開源與閉源的劃分已經(jīng)不適合如今的工作流局勢(shì),開源已經(jīng)滲透到了各個(gè)領(lǐng)域,如今的工作流已是三分天下的大局  閱讀全文
          posted @ 2007-09-23 11:06 jbpm 閱讀(3494) | 評(píng)論 (1)編輯 收藏
               摘要: 業(yè)務(wù)日歷是關(guān)于業(yè)務(wù)時(shí)間的,并且被用于為任務(wù)和定時(shí)器計(jì)算預(yù)期的時(shí)間。 業(yè)務(wù)日歷能夠通過對(duì)一個(gè)期限和日期進(jìn)行增加來計(jì)算日期。我們先看看業(yè)務(wù)日歷的語法:

          xml 代碼

          [business]


            閱讀全文
          posted @ 2007-09-19 17:40 jbpm 閱讀(916) | 評(píng)論 (1)編輯 收藏
               摘要: JBPM的流程執(zhí)行模型以下面幾個(gè)模型為原型:
          Node 節(jié)點(diǎn),Action 動(dòng)作,Transition 流向,Excution 執(zhí)行。  閱讀全文
          posted @ 2007-09-19 17:08 jbpm 閱讀(688) | 評(píng)論 (1)編輯 收藏
          主站蜘蛛池模板: 霍州市| 宜春市| 太谷县| 内丘县| 平定县| 十堰市| 成安县| 元谋县| 溧阳市| 郸城县| 龙里县| 宣武区| 宜春市| 南澳县| 苍南县| 安义县| 苍溪县| 江山市| 梨树县| 富锦市| 阿尔山市| 龙南县| 锡林浩特市| 仙游县| 微山县| 慈溪市| 永吉县| 刚察县| 东莞市| 云浮市| 微山县| 临洮县| 泗洪县| 纳雍县| 栖霞市| 筠连县| 湟中县| 报价| 梅河口市| 米泉市| 温宿县|