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

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

          2)xml文件方式
          static ProcessDefinition auctionProcess =
                JpdlXmlReader.parseFromResource("org/jbpm/tdd/auction.xml");
          注意,必須在classes的org/jbpm/tdd/目錄下有一個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) | 評論 (0)編輯 收藏

          作者:楊洪波

          作者:楊洪波

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

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

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

          3.都實現(xiàn)了用一個單例實現(xiàn)多個單例
          我在Shark學(xué)習(xí)系列的文章中討論過這個功能,jbpm是在JbpmConfiguration.java中實現(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.都使用了單例模式
          我想這個是最基本的,一般的程序員寫解析程序都會這樣使用;要說明的是,AgileFlow
          除了使用單例模式,還實現(xiàn)了配置文件的動態(tài)裝載,如果用戶修改了配置文件,它能夠在
          運行中動態(tài)的獲取這些變化.
          使用jbpm時,第一句話就要使用該模式:JbpmServiceFactory.getInstance()....

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

          3.都實現(xiàn)了用一個單例實現(xiàn)多個單例
          我在Shark學(xué)習(xí)系列的文章中討論過這個功能,jbpm是在JbpmConfiguration.java中實現(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) | 評論 (0)編輯 收藏
               摘要: 目前我看過采用JBPM的工作流有web-console (JBPM 3.2.1自帶)、RUNA WFE、SMART,就這三個我做一個比較:

          RUNA WFE

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

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

            閱讀全文
          posted @ 2007-11-11 16:00 jbpm 閱讀(990) | 評論 (0)編輯 收藏
          作者:胡長城
           
                  目前主要列出了13家公司,這幾家主要是做workflow的。當(dāng)然,目前國內(nèi)做OA,做Platform(包含workflow)的公司很多,但是,在workflow方面非常專注的,比較少。
                  還有很多公司沒有列出來,主要是個人感覺他們在workflow這一個方面并不是非常強勁(可能他們的product,platform很好),比如:BOS(金蝶),EOS(普元),GK-Workflow(北京點擊科技),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這一方面更有特點。注:BusinessWare只給了三個“”,是表示其所定位在解決方案和項目實施,整個產(chǎn)品定位在Business Process Integration層次,有些超越目前國內(nèi)市場需求。

          編號

           

           

           

          I00

          ★★★

          AWF(北京炎黃盈動)

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

          I01

          ★★

          DLFlo(上海東蘭)

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

          I02

          ★★★★★

          LiveFlow(上海東蘭)

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

          I03

          ★★★

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

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

          I04

          ★★

          e-cology(上海泛微)

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

          I05

          ★★

          eWay Platform(北京東方易維)

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

          I06

          ★★★

          JKCFlow(四川金科成)

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

          I07

          ★★★★

          JoinWork(上海天際星)

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

          I08

          ★★★★

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

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

          I09

          ★★★

          RiseOffice(北京有生博大)

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

          I10

          ★★★★★

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

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

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

          I11

          ★★★★★

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

          基本上非常嚴(yán)格遵循了wfmc的規(guī)范,完全實現(xiàn)了interface1、interface2、interface3、interface5

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

          I12

          ★★★★★

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

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

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

          而我是從活動實例的角度來考慮,活動實例的狀態(tài)只是活動實例的一個屬性體,是因為什么行為,造成了什么狀態(tài)的結(jié)果。


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


          先說說基于活動活動實例的角度的思路吧:



          讓我下先來看看狀態(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}

          }




          對于活動實例來說,狀態(tài)只是其一個屬性而已:

          public class BasicActivityInstance extends BasicAttributedEntity{

          private int _state;

          public void setState(int state) {

          _state = state; }

          }

          或者也可以是

          Public void setState(WMActivityInstanceState state)




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



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



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



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

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

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



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

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


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

          作者:tomkoo
          以下例子中 采用了jbpm console 的幾個實例用戶

          項目提交人 : ernie .

          主管審批 : bert

          會簽 : ernie , bert , grover

          老板審批 : grover

           

          正常流程: 項目金額 >= 500W RMB

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

          正常流程: 項目金額 < 500W RMB

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

          其中主管審批, 會簽, 老板審批 , 不通過, 全部退回給項目提交人修改.

          會簽中: 所有人全通過, 則通過. 任何一人不通過, 停止其他會簽任務(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.     <!項目提交人 >  
          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.     <!會簽人 >  
          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.   

           

          會簽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 讀取會簽人設(shè)置   
          13.         String[] a = { "ernie""bert""grover" };   
          14.         assignable.setPooledActors(a);   
          15.     }   
          16.   
          17. }   
          18.   

          創(chuàng)建會簽任務(wù)實現(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 讀取會簽人設(shè)置創(chuàng)建任務(wù)實例   
          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é)束不通過時結(jié)束其他會簽任務(wù)實現(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.         // 如果有一個任務(wù)實例拒絕通過則結(jié)束除當(dāng)前任務(wù)實例外其他任務(wù)實例   
          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) | 評論 (0)編輯 收藏

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

           

          Shark

          Jbpm

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

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

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

          xml 代碼

          [business]


            閱讀全文
          posted @ 2007-09-19 17:40 jbpm 閱讀(916) | 評論 (1)編輯 收藏
               摘要: JBPM的流程執(zhí)行模型以下面幾個模型為原型:
          Node 節(jié)點,Action 動作,Transition 流向,Excution 執(zhí)行。  閱讀全文
          posted @ 2007-09-19 17:08 jbpm 閱讀(688) | 評論 (1)編輯 收藏

          作者: JeffreyHsu


          盡管jbpm非常強大,是目前最適合商業(yè)化的開源工作流引擎,可以開發(fā)出復(fù)雜的流程,但是特別遺憾的是并不支持并發(fā)子流程(multiple-subprocess)
          有一次我需要做一個復(fù)雜的流程,主流程里要求同時啟動多個并發(fā)執(zhí)行的子流程,并且子流程的數(shù)目和啟動的時間都不確定,當(dāng)所有子流程都結(jié)束以后,主流程才繼續(xù)執(zhí)行。我們知道jbpm里有子流程的設(shè)定,有專門的節(jié)點ProcessState來處理,但是后來發(fā)現(xiàn)無論如何也實現(xiàn)不了多子流程并發(fā)執(zhí)行,后來看其源碼知道因為subprocess是作為ProcessState的一個屬性,也就是說ProcessState只能包含一個subprocess的定義,并且最重要的是processInstance.getRootToken()和子流程相關(guān)的只有createSubProcessInstance, getSubProcessInstance, setSubProcessInstance三個方法,這意味著主流程的rootToken只能設(shè)置一個子流程,jbpm并不直接支持多子流程。
          那么我們就必須用一個變通的方法來實現(xiàn),“并發(fā)”很自然的讓我們想到了fork,但是這里的fork不能搭配join來使用,具體原因,將在后面討論。
          下面先給出流程圖:

          state節(jié)點用來啟動子流程(實際應(yīng)用可以換成Task-Node),state進(jìn)入fork后同時進(jìn)入兩個分支,一條去啟動子流程,另一條回到自己,這樣表面看來state沒有動,而同時你又可以啟動第2個,第3個……子流程,需要注意的是第2條子流程和第1個子流程并不處于同一級上,而比第一個子流程低一級,具體請看后面一張圖就明白了,分解后的:

          從圖中我們可以看到后一個子流程的整棵樹是前一個子流程的兄弟,但是在業(yè)務(wù)級上是并發(fā)的效果,已經(jīng)實現(xiàn)我們前面的需求。

          現(xiàn)在來說說為什么不能用join而直接用end,因為會產(chǎn)生一個問題,state3和sub process 2都到達(dá)了join以后,state2下面的fork就結(jié)束了,就會立刻越過join到達(dá)end,而sub process 1即使執(zhí)行完畢到達(dá)了join卻仍然在傻傻等待著他的兄弟分支也到達(dá)join(而實際上它已經(jīng)自跑到end去了)一同結(jié)束,這樣sub process 1就會永遠(yuǎn)停在join動彈不得,業(yè)務(wù)無法進(jìn)行。

          這是我的一個解決方案,但還有一個問題,雖然全部的子流程都能結(jié)束,主流程也能結(jié)束,但因為沒有join,主流程的rootToken仍然停留在fork節(jié)點上。目前我尚不知如何解決,希望各位大家能提出其他更好的解決辦法。
          初學(xué)jbpm,水平有限,有不當(dāng)之處還請高手斧正

          最后附上demo代碼供參考:

          代碼
          1.   
          2. import static org.junit.Assert.*;   
          3.   
          4. import org.jbpm.graph.def.ProcessDefinition;   
          5. import org.jbpm.graph.exe.ProcessInstance;   
          6. import org.jbpm.graph.exe.Token;   
          7. import org.jbpm.graph.node.ProcessState;   
          8. import org.junit.Before;   
          9. import org.junit.Test;   
          10.   
          11. public class MultiProcessTest {   
          12.     private ProcessDefinition superProcessDefinition;   
          13.   
          14.     private ProcessDefinition subProcessDefinition;   
          15.   
          16.     @Before   
          17.     public void setUp() throws Exception {   
          18.         superProcessDefinition = ProcessDefinition.parseXmlString(   
          19.                 "<process-definition name='super'>" +                
          20.                 "  <start-state name='start'>" +   
          21.                 "    <transition to='state' />" +   
          22.                 "  start-state>" +   
          23.                 "  <state name='state'>" +   
          24.                 "    <transition name='create sub' to='fork' />" +   
          25.                 "    <transition name='end' to='end' />" +   
          26.                 "  state>" +   
          27.                 "  <fork name='fork'>" +   
          28.                 "    <transition name='back' to='state' />" +   
          29.                 "    <transition name='go to sub' to='sub process' />" +   
          30.                 "  fork>" +   
          31.                 "  <process-state name='sub process'>" +   
          32.                 "    <sub-process name='sub' />" +   
          33.                 "    <transition to='end' />" +   
          34.                 "  process-state>" +   
          35.                 "  <end-state name='end' />" +   
          36.                 "process-definition>");   
          37.            
          38.         subProcessDefinition = ProcessDefinition.parseXmlString(   
          39.                 "<process-definition name='sub'>" +                          
          40.                 "  <start-state name='start'>"  +   
          41.                 "    <transition to='wait' />" +   
          42.                 "  start-state>" +                         
          43.                 "  <state name='wait'>" +   
          44.                 "    <transition to='end' />" +   
          45.                 "  state>" +              
          46.                 "  <end-state name='end' />" +   
          47.                 "process-definition>");   
          48.         ProcessState processState = (ProcessState) superProcessDefinition   
          49.                 .getNode("sub process");   
          50.         processState.setSubProcessDefinition(subProcessDefinition);   
          51.     }   
          52.   
          53.     @Test   
          54.     public void testMultiProcesses() {   
          55.         ProcessInstance pi = new ProcessInstance(superProcessDefinition);   
          56.   
          57.         // 啟動一個主流程   
          58.         pi.signal();   
          59.         assertEquals("state", pi.getRootToken().getNode().getName());   
          60.   
          61.         // 進(jìn)入分支,此處將進(jìn)入子流程   
          62.         pi.signal("create sub");   
          63.         // 主流程token將停留在fork節(jié)點上   
          64.         assertEquals("fork", pi.getRootToken().getNode().getName());   
          65.   
          66.         // fork分為兩支,其中一支的節(jié)點停留在ProcessState上   
          67.         Token subProcessToken1 = pi.getRootToken().getChild("go to sub");   
          68.         ProcessInstance subPi1 = subProcessToken1.getSubProcessInstance();   
          69.         assertEquals("wait", subPi1.getRootToken().getNode().getName());   
          70.   
          71.         // 另一支返回了state節(jié)點,實際上并沒有返回,這個state節(jié)點不同于先前的state,它們并不在同一個path中   
          72.         Token stateToken1 = pi.getRootToken().getChild("back");   
          73.         assertEquals("state", stateToken1.getNode().getName());   
          74.            
          75.         // 再次進(jìn)入fork,啟動第二個子流程   
          76.         stateToken1.signal("create sub");   
          77.         ProcessInstance subPi2 = stateToken1.getChild("go to sub")   
          78.                 .getSubProcessInstance();   
          79.         // 雖然都是子流程,但它們并不相同,在邏輯上是屬于并發(fā)的無關(guān)系的子流程   
          80.         assertFalse(subPi1.equals(subPi2));   
          81.         // 結(jié)束第二個子流程   
          82.         subPi2.signal();   
          83.         assertTrue(subPi2.hasEnded());   
          84.         assertFalse(pi.hasEnded());   
          85.   
          86.         // 結(jié)束第一個子流程,但主流程仍未結(jié)束   
          87.         subPi1.signal();   
          88.         assertTrue(subPi1.hasEnded());   
          89.         assertFalse(pi.hasEnded());   
          90.            
          91.         // 結(jié)束第二個子流程中的state,第一子流程的back分支結(jié)束,從而主流程也結(jié)束   
          92.         Token stateToken2 = stateToken1.getChild("back");   
          93.         assertEquals("state", stateToken2.getNode().getName());   
          94.         assertFalse(stateToken1.hasEnded());   
          95.         assertFalse(pi.hasEnded());   
          96.         stateToken2.signal("end");   
          97.            
          98.         assertTrue(stateToken1.hasEnded());   
          99.         assertTrue(subPi1.hasEnded());   
          100.         assertTrue(pi.getRootToken().getChild("back").hasEnded());   
          101.         assertTrue(pi.getRootToken().getChild("go to sub").hasEnded());   
          102.         // 主流程結(jié)束了   
          103.         assertTrue(pi.hasEnded());   
          104.         // 雖然主流程已經(jīng)結(jié)束了,但是因為子流程沒有join,所以其rootToken仍然停留在fork上   
          105.         assertEquals("fork", pi.getRootToken().getNode().getName());   
          106.         // 第二個子流程到達(dá)的end和主流程中的end并不是同一個節(jié)點   
          107.         assertTrue(!pi.getRootToken().getNode().equals(stateToken2.getNode()));   
          108.     }   
          109. }   
          posted @ 2007-09-11 17:48 jbpm 閱讀(1032) | 評論 (0)編輯 收藏

          對于BPM產(chǎn)品目前尚無公認(rèn)的分類標(biāo)準(zhǔn),如果沿用以前對工作流的分類,則可以分為生產(chǎn)型(又可以再細(xì)分為自治式和嵌入式兩種)、管理型、協(xié)同型和專門型四大類。但這樣一來,市場上主流的通用BPM產(chǎn)品大都會被劃分到生產(chǎn)型,難以分辨出它們之間的本質(zhì)差異,因此我們需要一種新的分類方法。

          筆者建議根據(jù)產(chǎn)品內(nèi)在拓?fù)浣Y(jié)構(gòu)的差異進(jìn)行分類,將BPM產(chǎn)品劃分為面向引擎型、面向業(yè)務(wù)型、面向消費者型、以及對等型四大類。而一些功能較強的產(chǎn)品能同時支持多種拓?fù)浣Y(jié)構(gòu)。

          面向引擎型:匹馬單槍

           

          見自性清靜,自修自作法身,自行佛行,自成佛道。

          企業(yè)內(nèi)的工作流系統(tǒng)廣泛采用了這種集中控制式拓?fù)浣Y(jié)構(gòu),客戶端連接到負(fù)責(zé)接受請求的中央引擎服務(wù)器。當(dāng)流程上有客戶端完成了任務(wù),它會將結(jié)果發(fā)送給服務(wù)器,服務(wù)器接收齊工作數(shù)據(jù),就開始組織下一個任務(wù)項。大多數(shù)BPM產(chǎn)品都支持這種最原始的拓?fù)湫问健?

          這種方式的長處在于其簡單性,它使得管理和控制都很容易,而且它對客戶端的要求不高,大多數(shù)負(fù)載和責(zé)任都從客戶端轉(zhuǎn)移到了引擎服務(wù)器。

          這種模式的缺點在于成敗懸于一線,整個系統(tǒng)完全依賴于一個全能服務(wù)器。該服務(wù)器必須功能非常強大,并且必須能夠承受巨大的壓力。反過來說,這又限制了系統(tǒng)的可擴(kuò)展性。

          采取這種結(jié)構(gòu)的BPM系統(tǒng)一般非常重視用于自動型活動的企業(yè)應(yīng)用集成(EAI/A2A)和用于人工型活動的人機(jī)交互界面。有集成服務(wù)器背景的廠商往往側(cè)重于應(yīng)用集成和直通處理(系統(tǒng)到系統(tǒng)的交易),F(xiàn)uego、SeeBeyond、Vitria和WebMethods屬于此類。有著工作流背景的廠商則往往對需要大量人工干預(yù)的應(yīng)用提供更完善的功能,F(xiàn)ileNet、Identitech、Plexus和Staffware就屬于此類,這類廠商對客戶界面和流程設(shè)計工具進(jìn)行了優(yōu)化,可以支持各種流程的人工干預(yù)。新玩家HandySoft和Intalio則介于兩者之間。

          歸根到底,應(yīng)用集成能力的高低是區(qū)別諸解決方案的一個主要因素。如果你所考慮的應(yīng)用需要相當(dāng)高的集成水平,尤其是與多個系統(tǒng)的集成,集成服務(wù)器廠商提供的產(chǎn)品顯然具有優(yōu)勢,但選擇來自集成服務(wù)器廠商的BPM解決方案可能意味著需要采用它們的平臺作為集成標(biāo)準(zhǔn)。 

          面向業(yè)務(wù)型:天龍八部

          爾時世尊,天龍八部,四眾圍繞,王及大眾,五體投地,為佛作禮。

          許多業(yè)務(wù)流程管理系統(tǒng)是通過可靠消息通信實現(xiàn)的。消息隊列技術(shù)允許系統(tǒng)異步和分布運行,支持跨異構(gòu)網(wǎng)絡(luò)甚至是暫時離線的系統(tǒng)間通信。一個客戶端為了與屬于另一引擎服務(wù)器的客戶端進(jìn)行協(xié)作,可以將消息發(fā)送到自己所屬引擎的隊列中,引擎會完成剩下的實際消息轉(zhuǎn)發(fā)和傳遞工作,并把最終的返回消息也放在發(fā)起者的接收隊列中,供該客戶端隨時提取。

          這是一種多引擎的拓?fù)浣Y(jié)構(gòu),可以解決許多單純的客戶/服務(wù)器拓?fù)浯嬖诘膯栴},但它仍然采用集中控制的方法,因為一個引擎通常服務(wù)于一大堆客戶端,任務(wù)只是在相互連接的引擎之間分割和協(xié)作。

          這一解決方案的優(yōu)點在于可擴(kuò)展性好,當(dāng)負(fù)荷太重時可以通過添加引擎來緩解。這一方案的容錯性也更強,當(dāng)某臺引擎出現(xiàn)故障時,其他引擎可以接管其原來的工作。另外,它可以支持更有效的通信,因為引擎可以與客戶端離得更近。

          這一方式的缺點在于引擎必須設(shè)計得很精巧,它必須既能處理客戶端請求,又能與其他引擎協(xié)調(diào)。它還有一點與面向引擎的拓?fù)漕愃疲慈匀粚⒇?fù)荷和責(zé)任從客戶端改扛在了引擎服務(wù)器肩上,只不過不光是一個引擎罷了。另外,同時維護(hù)多個引擎也需要更多的管理開銷。

          支持這種拓?fù)浣Y(jié)構(gòu)的BPM產(chǎn)品一般都擅長于跨企業(yè)的應(yīng)用集成和協(xié)調(diào)(B2Bi)。許多BPM應(yīng)用,如支持多賬戶應(yīng)用處理的金融服務(wù),往往基于應(yīng)用服務(wù)器環(huán)境。例如IBM的MQSeries Workflow的產(chǎn)品;BEA的Process Integration。Fujitsu、Intalio、Quovadx、Savvion、Versata等廠商的產(chǎn)品不僅能夠與IBM或BEA的應(yīng)用服務(wù)器兼容,還各自提供常見BPM組件的定制開發(fā)環(huán)境。對側(cè)重于開發(fā)流程之間的應(yīng)用到應(yīng)用通信并以微軟產(chǎn)品為中心的環(huán)境而言,微軟的BizTalk則非常適合。 

          面向消費者型:心心相印

          昔時圣人互出,乃曰傳燈,爾后賢者差肩,乃曰繼祖,是以心心相傳,法法相印。

          近些年,發(fā)布/訂閱(Pub/Sub)拓?fù)浣Y(jié)構(gòu)成為構(gòu)建、實現(xiàn)和集成復(fù)雜流程的搶手貨,被認(rèn)為是滿足動態(tài)需求的一種簡單而有效的手段。很多強大、靈活的BPM系統(tǒng)就建立在這種模式之上,例如,TIBCO便一直是使用Pub/Sub方式構(gòu)建松散耦合的分布式應(yīng)用的先驅(qū)。在動態(tài)演化的系統(tǒng)中應(yīng)用Pub/Sub模式實現(xiàn)業(yè)務(wù)流程已被證明相當(dāng)有效。

          Pub/Sub拓?fù)浣Y(jié)構(gòu)的一大長處是無需復(fù)雜的集中式服務(wù)器和路由機(jī)制,因為消息直接由來源發(fā)往目的地。該模式支持高度分散的業(yè)務(wù)流程間的協(xié)作。

          它的弱點在于可伸縮性非常有限。每個發(fā)布者只能包含有限數(shù)目的訂閱者,否則會處理不過來。此外,在沒有集中控制的情況下發(fā)現(xiàn)發(fā)布者和訂閱者也很困難,因為當(dāng)你找不到對方的時候,無處去詢問和訴說。最后,它還存在生命期的依賴性。

          像抵押貸款、索賠甚至支付處理等BPM應(yīng)用還需要與流程管理功能緊密相關(guān)的圖像處理及內(nèi)容管理功能,為此,Plexus能把大容量文檔圖像處理和高度可伸縮的流程管理緊密結(jié)合在一起;而Identitech等廠商捆綁了基于XML的電子表格和本地記錄管理功能;FileNet的新款Panangon平臺特別提供了企業(yè)內(nèi)容管理(ECM)功能,能同時支持文檔圖像處理、Web內(nèi)容管理及可靠的集成特性和選項。盡管Handysoft并不提供本地網(wǎng)站門戶,也不提供內(nèi)容管理功能,但卻提供了與Documentum、Hummingbird、Plumtree和微軟的SharePoint相集成的功能。 

          對等型:打成一片

          長短好惡,打成一片,一一拈來,更無異見。

          P2P(Peer-to-Peer)計算是Internet發(fā)展的最新產(chǎn)物,在Internet之上已經(jīng)有了數(shù)不勝數(shù)的資源和對等端,它們有潛力克服傳統(tǒng)客戶/服務(wù)器系統(tǒng)的大多數(shù)限制,如可伸縮性、內(nèi)容可用性、計算能力等,當(dāng)然,這也需要比單純將消息轉(zhuǎn)發(fā)給所有對等端更有效的群組通信機(jī)制,因為這些對等端可能是在網(wǎng)格計算背景下分布在全球的用戶和廠商。

          P2P模式是完全分散的,每個結(jié)點都被認(rèn)為是一個對等端,它會連接到一個或者幾個其他的端口。如果不使用過濾機(jī)制的話,那么每個對等端都會把會話轉(zhuǎn)發(fā)給相鄰的所有對等端,形成會話“洪水”。所以在實際應(yīng)用中,應(yīng)該使用分割、投影、過濾等策略,只將與該對等端相關(guān)的流程部署在它上面,該對等端只接受從其流程上游發(fā)來的消息,再將經(jīng)過處理的結(jié)果僅發(fā)送給它的下游對等端。

          P2P拓?fù)涞暮锰幵谟跓o需集中式服務(wù)器,允許任意數(shù)量的網(wǎng)絡(luò)結(jié)點,因為工作負(fù)荷可以在各個對等端之間平衡與共享。

          它的壞處在于有時候延遲現(xiàn)象嚴(yán)重,因為流程有時需要在多個對等端之間協(xié)同。另外,部分低效的對等端必然影響整體的性能。

          由中科院軟件所和中科國際共同開發(fā)的A2E-DI就支持完全分散的數(shù)據(jù)提取、轉(zhuǎn)換、傳輸和加載的全過程操作。HandySoft開發(fā)的BizFlow則提供了一系列由可伸縮業(yè)務(wù)流程引擎驅(qū)動的基于Web的協(xié)作工具,其可伸縮性決定了它亦能應(yīng)用于對等環(huán)境。 

          在P2P結(jié)構(gòu)的基礎(chǔ)之上還可能出現(xiàn)P2P Cluster(P2P集群)拓?fù)浣Y(jié)構(gòu)。它可以通過分而治之的策略解決單純P2P模式中消息通信存在的某些問題。網(wǎng)絡(luò)被劃分為一系列集群,每個集群都了解其管轄的對等端。在每個集群中,犧牲一臺服務(wù)器用于充當(dāng)協(xié)調(diào)者的角色,它知道哪個對等端訂閱了遠(yuǎn)程的某個發(fā)布者,也知道遠(yuǎn)程的某個訂閱者訂閱了集群內(nèi)部的哪個對等端,這樣就不必把時間花在那些無關(guān)的集群內(nèi)部了。其優(yōu)缺點與P2P拓?fù)浯篌w相似。

          posted @ 2007-09-11 17:44 jbpm 閱讀(779) | 評論 (0)編輯 收藏
               摘要:
          理論介紹(一些定義)
            業(yè)務(wù)流程是一個組織及其合作伙伴的人員及系統(tǒng)所完成的工作的一種正式表達(dá), 它旨在給內(nèi)部或外部客戶提供產(chǎn)品或服務(wù)。業(yè)務(wù)流程最簡單的表達(dá)形式就是一組活動,它們表示流程的不同步驟,通過一些轉(zhuǎn)換連接在一起?;顒涌赡苄枰藶楦深A(yù),也可能是全自動的。對于需要人為交互的活動,可以在流程中定義一個角色,標(biāo)識允許誰在這里與流程交互。流程起到定義的作用,而流程中的實例就是完成整個流程的實際項目,從一個活動轉(zhuǎn)換到另一個活動。實例總是開始于流程的Begin活動,而結(jié)束于流程的End活動。實例的路徑完全取決于實例的數(shù)據(jù)以及外部環(huán)境。

             轉(zhuǎn)換是活動之間的直接連接, 許多的轉(zhuǎn)換進(jìn)出一個活動.。一旦某個實例完成了一項活動件,外發(fā)轉(zhuǎn)換將被評估, 其中之一被選中,以使實例轉(zhuǎn)向下一活動。條件轉(zhuǎn)換包含一個布爾表達(dá)式,該表達(dá)式將被計算,要使實例繼續(xù)沿流程前進(jìn),結(jié)果必須為true。有些轉(zhuǎn)換是基于時間的,這就意味著如果到了預(yù)期時間,實例還在那里,這些轉(zhuǎn)換將會觸發(fā)到目標(biāo)活動的自動路由。流程也可以有狀態(tài):可為流程定義屬性,接受每個實例的一個值,這能幫助您保持實例狀態(tài),以  閱讀全文
          posted @ 2007-09-11 17:40 jbpm 閱讀(537) | 評論 (0)編輯 收藏
               摘要: 業(yè)務(wù)流程管理(BPM)是一個當(dāng)前軟件行業(yè)最熱門的市場分類。BPM是模塊化,自動化,管理和優(yōu)化業(yè)務(wù)流程來獲取利潤的學(xué)科。

            閱讀全文
          posted @ 2007-09-11 17:37 jbpm 閱讀(537) | 評論 (0)編輯 收藏

          作者: nogocn 

          在某一公司中,部門員工要休假的話需要部門主管的批準(zhǔn)。如果休假天數(shù)大于10天的話,在部門主管的同意后,還必須上級主管批準(zhǔn)。如果是部門主管要休假只要上級主管批準(zhǔn)即可。在休假被批準(zhǔn)之前,申請人可以撤銷休假申請。
          每個員工還有多少天休假必須管理起來,在員工提交休假申請時要檢查申請?zhí)鞌?shù)是否超過可用天數(shù)。申請批準(zhǔn)后,要在可用天數(shù)里減去申請?zhí)鞌?shù)。每次休假申請結(jié)束之后,不管通過未通過或是否取消,都必須記錄下來。主管在批復(fù)申請之后,系統(tǒng)要將批復(fù)結(jié)果Email給申請人。對于大于10天的申請,如果部門主管已批準(zhǔn)同意而上級主管還未批準(zhǔn),這時申請人撤銷申請后,系統(tǒng)應(yīng)發(fā)Email通知部門主管申請已撤銷。 
            processdefinition.xml
          如下:

          <?xml version="1.0" encoding="UTF-8"?>
          <!-- edited with XMLSPY v2004 rel. 3 U (
          http://www.xmlspy.com) by Keller (zju) -->
          <!DOCTYPE process-definition PUBLIC
              "-//jBpm/jBpm Mapping DTD 2.0//EN"
              "
          http://jbpm.org/dtd/processdefinition-2.0.dtd">
          <process-definition  name="RequestLeave">
           <swimlane name="requester">
            <description>
          申請者</description>
           </swimlane>
           <swimlane name="chief">
            <description>
          部門主管
          </description>
            <delegation class="kellerdu.jbpm.delegation.ChiefSwimlane"/>
           </swimlane>
           <swimlane name="boss">
            <description>
          上級主管
          </description>
            <delegation class="kellerdu.jbpm.delegation.BossSwimlane"/>
           </swimlane>
           <start-state name="request" swimlane="requester">
            <transition to="Begin Request"/>
           </start-state>
           <fork name="Begin Request">
            <transition to="Requester Cancel"/>
            <transition to="IsChief"/>
           </fork>
           <decision name="IsChief">
            <delegation class="kellerdu.jbpm.delegation.ChiefDecision"/>
            <transition name="Boss Approve"  to="Boss Approve"/>
            <transition name="Chief Approve"  to="Chief Approve"/>
           </decision>
           <state name="Requester Cancel">
            <assignment swimlane="requester"/>
            <transition name="cancel" to="Decided">
             <action>
              <!--
          將請假的狀態(tài)改變?yōu)?/span>取消
          ”-->
              <delegation class="kellerdu.jbpm.action.RequestCancel"/>
             </action>
            </transition>
           </state>
           <state name="Chief Approve">
            <assignment swimlane="chief"/>
            <transition name="approve" to="NeedBossApprove">
             <action>
              <!--
          將請假的狀態(tài)改變?yōu)?/span>主管批準(zhǔn)
          ”-->
              <delegation class="kellerdu.jbpm.action.ChiefApprove"/>
             </action>
            </transition>
            <transition name="disapprove" to="Decided">
             <action>
              <!--
          將請假的狀態(tài)改變?yōu)?/span>主管否決
          ”-->
              <delegation class="kellerdu.jbpm.action.ChiefDisapprove"/>
             </action>
            </transition>
           </state>
           <state name="Boss Approve">
            <assignment swimlane="boss"/>
            <transition name="approve" to="Decided">
             <action>
              <!--
          將請假的狀態(tài)改變?yōu)?/span>老板批準(zhǔn)
          ”-->
              <delegation class="kellerdu.jbpm.action.BossApprove"/>
             </action>
            </transition>
            <transition name="disapprove" to="Decided">
             <action>
              <!--
          將請假的狀態(tài)改變?yōu)?/span>老板否決
          ”-->
              <delegation class="kellerdu.jbpm.action.BossDisapprove"/>
             </action>
            </transition>
           </state>
           <decision name="NeedBossApprove">
            <!--
          請假天數(shù)大于10天的要老板批準(zhǔn)
            -->
            <delegation class="kellerdu.jbpm.delegation.NeedBossApproveDecision"/>
            <transition name="need" to="Boss Approve"/>
            <transition name="notNeed" to="Decided"/>
           </decision>
           <join name="Decided">
            <description>
          有一個先到達(dá)即進(jìn)行父
          Token</description>
            <delegation class="kellerdu.jbpm.delegation.DecidedJoin"/>
            <transition to="Do Something"/>
           </join>
           <decision name="Do Something">
            <description>
             
          根據(jù)請求的狀態(tài)決定。

             
          1主管或者老板批準(zhǔn)‘approve’:修改員工休假的總天數(shù),設(shè)定發(fā)給用戶E-Mail的信息。
             
          2主管或者老板否決”-“disapprove”:設(shè)定發(fā)給用戶EMail的信息。
             
          3撤銷”-"cancel"-設(shè)定發(fā)給用戶EMail的信息。如果主管批準(zhǔn),要發(fā)給主管消息說明已經(jīng)撤銷。
              </description>
            <delegation class="kellerdu.jbpm.delegation.DoSomethingDecision"/>
            <transition name="disapprove" to="Finished">
             <action>
              <delegation class="kellerdu.jbpm.action.Disapprove"/>
             </action>
            </transition>
            <transition name="approve" to="Finished">
             <action>
              <delegation class="kellerdu.jbpm.action.Approve"/>
             </action>
            </transition>
            <transition name="cancel" to="Finished">
             <action>
              <delegation class="kellerdu.jbpm.action.Cancel"/>
             </action>
            </transition>
           </decision>
           <end-state name="Finished"/>
           <action event-type="process-end">
            <!--
          發(fā)送EMail消息給申請者,記錄請假日志 -->
            <delegation class="kellerdu.jbpm.action.ProcessEndAction"/>
           </action>
          </process-definition>

           


          posted @ 2007-09-11 13:47 jbpm 閱讀(2426) | 評論 (0)編輯 收藏
               摘要: JBoss jBPM為設(shè)計及開發(fā)工作流和業(yè)務(wù)流程管理系統(tǒng)提供了一個先進(jìn)的平臺。由API、特定領(lǐng)域的語言和圖形建模工具組成的框架讓開發(fā)人員和業(yè)務(wù)分析人員能夠使用通用平臺進(jìn)行溝通及操作。  閱讀全文
          posted @ 2007-09-11 13:35 jbpm 閱讀(465) | 評論 (0)編輯 收藏

          轉(zhuǎn)自: 百度

          jBPM,全稱是Java Business Process Management,是一種基于J2EE的輕量級工作流管理系統(tǒng)。jBPM是公開源代碼項目,它使用要遵循 Apache License。jBPM20041018,發(fā)布了2.0版本,并在同一天加入了JBoss,成為了JBoss企業(yè)中間件平臺的一個組成部分,它的名稱也改成JBoss jBPM。隨著jBPM加入JBoss組織,jBPM也將進(jìn)入一個全新的發(fā)展時代,它的前景是十分光明的。

          jBPM
          最大的特色就是它的商務(wù)邏輯定義沒有采用目前的一些規(guī)范,如WfMC´s XPDL, BPML, ebXML, BPEL4WS等,而是采用了它自己定義的Process defiJBoss jBPM nition language (jPdl)。jPdl認(rèn)為一個商務(wù)流程可以被看作是一個UML狀態(tài)圖。jPdl就是詳細(xì)定義了這個狀態(tài)圖的每個部分,如起始、結(jié)束狀態(tài),狀態(tài)之間的轉(zhuǎn)換等。


          jBPM
          的另一個特色是它使用Hibernate來管理它的數(shù)據(jù)庫。Hibernate是目前Java領(lǐng)域最好的一種數(shù)據(jù)持久層解決方案。通過Hibernate,jBPM將數(shù)據(jù)的管理職能分離出去,自己專注于商務(wù)邏輯的處理。

          posted @ 2007-09-11 13:32 jbpm 閱讀(391) | 評論 (0)編輯 收藏
          作者: fndcz

          1.     JPDL的流程定義元素

          1)        第一層:GraphElement

          這個容易理解,因為在畫流程定義時,每個拖拉的對象都是一個graph的元素。GraphElement有四個屬性:

          (1)processDefine 表示當(dāng)前元素屬于哪個流程定義

          (2)events 表示可以接收哪些event

          (3)name 名字

          (4)exceptionHandlers 異常處理類集合(List)

          2)        第二層:node、processDefinition、Transition、Task

          它們都繼承自GraphElement

          (1)processDefinition表示流程定義(implements NodeCollection),它有下面的屬性:name、version、nodesstartState。nodes表示流程中所有的node,startState用于啟動流程時找到首節(jié)點。

          (2)Transition表示轉(zhuǎn)移,它有三個屬性:from(Node)to(Node),supportedEventTypes表示支持的event類型

          (3)node表示節(jié)點,它有四個屬性:leaving transitions、arriving transitions、actionsuperState

          (4)Task 定義任務(wù)

          3)        第三層:各種不同的node

          它們都繼承自node。 DecisionEndStateForkJoinMergeMilestone、 InterleaveEnd、InterleaveStart、ProcessState、State

           

          posted @ 2007-09-11 13:29 jbpm 閱讀(580) | 評論 (0)編輯 收藏
               摘要: 1概述
          一個流程定義是對一個業(yè)務(wù)流程的正式說明,以及它是基于有向圖的。該圖是結(jié)點(node)與流向(transition)的組合。圖中每一個結(jié)點都是一個特殊的類型,結(jié)果的類型決定了該結(jié)點的運行時的行為。一個流程定義有且僅有一個開始狀態(tài)。
          一個令牌(token)是執(zhí)行的軌跡。令牌是一個運行時的概念,其維護(hù)著速個圖中指向結(jié)點的指針。
            閱讀全文
          posted @ 2007-09-11 13:27 jbpm 閱讀(730) | 評論 (0)編輯 收藏
          主站蜘蛛池模板: 宜宾县| 同心县| 彩票| 怀宁县| 邢台县| 通城县| 峨眉山市| 东丽区| 怀仁县| 玉田县| 宜兰市| 库车县| 沂南县| 淮北市| 辛集市| 和硕县| 宝丰县| 武清区| 同仁县| 嘉鱼县| 三河市| 岳阳市| 凌海市| 个旧市| 葫芦岛市| 阳朔县| 广宗县| 潢川县| 弥勒县| 双辽市| 永修县| 马边| 阿巴嘎旗| 如皋市| 荣成市| 英德市| 揭阳市| 黎川县| 宝山区| 抚顺市| 安新县|