<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 26,  comments - 7,  trackbacks - 0
      2007年9月11日
         摘要:   閱讀全文
    posted @ 2007-12-12 16:16 jbpm 閱讀(1836) | 評論 (0)編輯 收藏
         摘要:   閱讀全文
    posted @ 2007-12-12 16:13 jbpm 閱讀(1469) | 評論 (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>");
    這種方式的本質和xml文件解析方式是一樣的.

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

    作者:楊洪波

    作者:楊洪波

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

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

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

    3.都實現了用一個單例實現多個單例
    我在Shark學習系列的文章中討論過這個功能,jbpm是在JbpmConfiguration.java中實現的:
    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
    除了使用單例模式,還實現了配置文件的動態裝載,如果用戶修改了配置文件,它能夠在
    運行中動態的獲取這些變化.
    使用jbpm時,第一句話就要使用該模式:JbpmServiceFactory.getInstance()....

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

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

    RUNA WFE

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

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

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

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

    編號

     

     

     

    I00

    ★★★

    AWF(北京炎黃盈動)

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

    I01

    ★★

    DLFlo(上海東蘭)

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

    I02

    ★★★★★

    LiveFlow(上海東蘭)

    DLFlo定位差不多,都面向二次開發平臺。但是正個產品還是停留在“workflow”功能層次?!?/span> 但是,吸收了DLFlo的很多經驗,所以其工作流平臺目前還是屬于國內前列

    I03

    ★★★

    BusinessWare(北京麒麟遠創)

    主要方向是BPMBPI(業務流程整合)。整個產品是一個“集成平臺”。

    I04

    ★★

    e-cology(上海泛微)

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

    I05

    ★★

    eWay Platform(北京東方易維)

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

    I06

    ★★★

    JKCFlow(四川金科成)

    JFCFlow從早期的工作流產品轉移向“業務基礎軟件平臺”,但是整個產品平臺目前還只能算是,一個OA開發平臺。在workflowmodel方面并不是非常的強

    I07

    ★★★★

    JoinWork(上海天際星)

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

    I08

    ★★★★

    Koof MetaLogic(北京世紀金政)

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

    I09

    ★★★

    RiseOffice(北京有生博大)

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

    I10

    ★★★★★

    SunFlow(杭州信雅達)

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

    其產品最大的特色是采用基于域的聯邦系統架構,對分布式管理、運行支持較好。而且也是目前國內為數不多的可以支持“仿真”的工作流系統。

    I11

    ★★★★★

    SynchroFlow(西安協同數碼)

    基本上非常嚴格遵循了wfmc的規范,完全實現了interface1、interface2、interface3、interface5

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

    I12

    ★★★★★

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

    進入中國最早的國外工作流產品,整個產品采用邏輯的組織結構圖,工作流系統支持的功能也很強。其比較有特色的是其“事件條件表

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

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


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


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



    讓我下先來看看狀態類:

    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}

    }




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

    public class BasicActivityInstance extends BasicAttributedEntity{

    private int _state;

    public void setState(int state) {

    _state = state; }

    }

    或者也可以是

    Public void setState(WMActivityInstanceState state)




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



    下面再來說說基于狀態角度的思路吧,這個思路大體可以說就是state pattern的應用。



         說道這兒,您可以看看這篇文檔:從工作流狀態機實踐中總結狀態模式使用心得 。當然如果您對state pattern不是很了解,那么建議你先看看這篇文檔:設計模式之state 。



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

       State模式的依據是狀態之間是有有向連接關系的,這有向連接關系其實就是狀態的轉換規則:A-B-C-D-A。

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



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

    第一種方式(基于活動實例),其外界事件是影響到活動實例,或者說在事件中顯示的告知活動實例狀態從什么變為什么。

    第二種方式(基于實例狀態),其外界事件是影響到活動實例狀態對象,至于這個狀態的下一個狀態是什么,時間并不知道,完全由活動狀態之間的關系來維護。


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

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

    項目提交人 : ernie .

    主管審批 : bert

    會簽 : ernie , bert , grover

    老板審批 : grover

     

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

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

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

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

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

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

    流程定義如下:

    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.         // 從數據庫或者ldap 讀取會簽人設置   
    13.         String[] a = { "ernie""bert""grover" };   
    14.         assignable.setPooledActors(a);   
    15.     }   
    16.   
    17. }   
    18.   

    創建會簽任務實現類

     

     

    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.         // 從數據庫或者ldap 讀取會簽人設置創建任務實例   
    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. }   

     

    結束不通過時結束其他會簽任務實現

    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.         // 如果有一個任務實例拒絕通過則結束除當前任務實例外其他任務實例   
    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 閱讀(6225) | 評論 (0)編輯 收藏

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

     

    Shark

    Jbpm

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

    引擎和組織機構模型之間是分離的,對計算參與者的表達語言將總是被限制的。

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

    xml 代碼

    [business]


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

    作者: JeffreyHsu


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

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

    從圖中我們可以看到后一個子流程的整棵樹是前一個子流程的兄弟,但是在業務級上是并發的效果,已經實現我們前面的需求。

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

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

    最后附上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.         // 進入分支,此處將進入子流程   
    62.         pi.signal("create sub");   
    63.         // 主流程token將停留在fork節點上   
    64.         assertEquals("fork", pi.getRootToken().getNode().getName());   
    65.   
    66.         // fork分為兩支,其中一支的節點停留在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節點,實際上并沒有返回,這個state節點不同于先前的state,它們并不在同一個path中   
    72.         Token stateToken1 = pi.getRootToken().getChild("back");   
    73.         assertEquals("state", stateToken1.getNode().getName());   
    74.            
    75.         // 再次進入fork,啟動第二個子流程   
    76.         stateToken1.signal("create sub");   
    77.         ProcessInstance subPi2 = stateToken1.getChild("go to sub")   
    78.                 .getSubProcessInstance();   
    79.         // 雖然都是子流程,但它們并不相同,在邏輯上是屬于并發的無關系的子流程   
    80.         assertFalse(subPi1.equals(subPi2));   
    81.         // 結束第二個子流程   
    82.         subPi2.signal();   
    83.         assertTrue(subPi2.hasEnded());   
    84.         assertFalse(pi.hasEnded());   
    85.   
    86.         // 結束第一個子流程,但主流程仍未結束   
    87.         subPi1.signal();   
    88.         assertTrue(subPi1.hasEnded());   
    89.         assertFalse(pi.hasEnded());   
    90.            
    91.         // 結束第二個子流程中的state,第一子流程的back分支結束,從而主流程也結束   
    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.         // 主流程結束了   
    103.         assertTrue(pi.hasEnded());   
    104.         // 雖然主流程已經結束了,但是因為子流程沒有join,所以其rootToken仍然停留在fork上   
    105.         assertEquals("fork", pi.getRootToken().getNode().getName());   
    106.         // 第二個子流程到達的end和主流程中的end并不是同一個節點   
    107.         assertTrue(!pi.getRootToken().getNode().equals(stateToken2.getNode()));   
    108.     }   
    109. }   
    posted @ 2007-09-11 17:48 jbpm 閱讀(1023) | 評論 (0)編輯 收藏

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

    筆者建議根據產品內在拓撲結構的差異進行分類,將BPM產品劃分為面向引擎型、面向業務型、面向消費者型、以及對等型四大類。而一些功能較強的產品能同時支持多種拓撲結構。

    面向引擎型:匹馬單槍

     

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

    企業內的工作流系統廣泛采用了這種集中控制式拓撲結構,客戶端連接到負責接受請求的中央引擎服務器。當流程上有客戶端完成了任務,它會將結果發送給服務器,服務器接收齊工作數據,就開始組織下一個任務項。大多數BPM產品都支持這種最原始的拓撲形式。

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

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

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

    歸根到底,應用集成能力的高低是區別諸解決方案的一個主要因素。如果你所考慮的應用需要相當高的集成水平,尤其是與多個系統的集成,集成服務器廠商提供的產品顯然具有優勢,但選擇來自集成服務器廠商的BPM解決方案可能意味著需要采用它們的平臺作為集成標準。 

    面向業務型:天龍八部

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

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

    這是一種多引擎的拓撲結構,可以解決許多單純的客戶/服務器拓撲存在的問題,但它仍然采用集中控制的方法,因為一個引擎通常服務于一大堆客戶端,任務只是在相互連接的引擎之間分割和協作。

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

    這一方式的缺點在于引擎必須設計得很精巧,它必須既能處理客戶端請求,又能與其他引擎協調。它還有一點與面向引擎的拓撲類似,即仍然將負荷和責任從客戶端改扛在了引擎服務器肩上,只不過不光是一個引擎罷了。另外,同時維護多個引擎也需要更多的管理開銷。

    支持這種拓撲結構的BPM產品一般都擅長于跨企業的應用集成和協調(B2Bi)。許多BPM應用,如支持多賬戶應用處理的金融服務,往往基于應用服務器環境。例如IBM的MQSeries Workflow的產品;BEA的Process Integration。Fujitsu、Intalio、Quovadx、Savvion、Versata等廠商的產品不僅能夠與IBM或BEA的應用服務器兼容,還各自提供常見BPM組件的定制開發環境。對側重于開發流程之間的應用到應用通信并以微軟產品為中心的環境而言,微軟的BizTalk則非常適合。 

    面向消費者型:心心相印

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

    近些年,發布/訂閱(Pub/Sub)拓撲結構成為構建、實現和集成復雜流程的搶手貨,被認為是滿足動態需求的一種簡單而有效的手段。很多強大、靈活的BPM系統就建立在這種模式之上,例如,TIBCO便一直是使用Pub/Sub方式構建松散耦合的分布式應用的先驅。在動態演化的系統中應用Pub/Sub模式實現業務流程已被證明相當有效。

    Pub/Sub拓撲結構的一大長處是無需復雜的集中式服務器和路由機制,因為消息直接由來源發往目的地。該模式支持高度分散的業務流程間的協作。

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

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

    對等型:打成一片

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

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

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

    P2P拓撲的好處在于無需集中式服務器,允許任意數量的網絡結點,因為工作負荷可以在各個對等端之間平衡與共享。

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

    由中科院軟件所和中科國際共同開發的A2E-DI就支持完全分散的數據提取、轉換、傳輸和加載的全過程操作。HandySoft開發的BizFlow則提供了一系列由可伸縮業務流程引擎驅動的基于Web的協作工具,其可伸縮性決定了它亦能應用于對等環境。 

    在P2P結構的基礎之上還可能出現P2P Cluster(P2P集群)拓撲結構。它可以通過分而治之的策略解決單純P2P模式中消息通信存在的某些問題。網絡被劃分為一系列集群,每個集群都了解其管轄的對等端。在每個集群中,犧牲一臺服務器用于充當協調者的角色,它知道哪個對等端訂閱了遠程的某個發布者,也知道遠程的某個訂閱者訂閱了集群內部的哪個對等端,這樣就不必把時間花在那些無關的集群內部了。其優缺點與P2P拓撲大體相似。

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

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

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

    作者: nogocn 

    在某一公司中,部門員工要休假的話需要部門主管的批準。如果休假天數大于10天的話,在部門主管的同意后,還必須上級主管批準。如果是部門主管要休假只要上級主管批準即可。在休假被批準之前,申請人可以撤銷休假申請。
    每個員工還有多少天休假必須管理起來,在員工提交休假申請時要檢查申請天數是否超過可用天數。申請批準后,要在可用天數里減去申請天數。每次休假申請結束之后,不管通過未通過或是否取消,都必須記錄下來。主管在批復申請之后,系統要將批復結果Email給申請人。對于大于10天的申請,如果部門主管已批準同意而上級主管還未批準,這時申請人撤銷申請后,系統應發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>
        <!--
    將請假的狀態改變為取消
    ”-->
        <delegation class="kellerdu.jbpm.action.RequestCancel"/>
       </action>
      </transition>
     </state>
     <state name="Chief Approve">
      <assignment swimlane="chief"/>
      <transition name="approve" to="NeedBossApprove">
       <action>
        <!--
    將請假的狀態改變為主管批準
    ”-->
        <delegation class="kellerdu.jbpm.action.ChiefApprove"/>
       </action>
      </transition>
      <transition name="disapprove" to="Decided">
       <action>
        <!--
    將請假的狀態改變為主管否決
    ”-->
        <delegation class="kellerdu.jbpm.action.ChiefDisapprove"/>
       </action>
      </transition>
     </state>
     <state name="Boss Approve">
      <assignment swimlane="boss"/>
      <transition name="approve" to="Decided">
       <action>
        <!--
    將請假的狀態改變為老板批準
    ”-->
        <delegation class="kellerdu.jbpm.action.BossApprove"/>
       </action>
      </transition>
      <transition name="disapprove" to="Decided">
       <action>
        <!--
    將請假的狀態改變為老板否決
    ”-->
        <delegation class="kellerdu.jbpm.action.BossDisapprove"/>
       </action>
      </transition>
     </state>
     <decision name="NeedBossApprove">
      <!--
    請假天數大于10天的要老板批準
      -->
      <delegation class="kellerdu.jbpm.delegation.NeedBossApproveDecision"/>
      <transition name="need" to="Boss Approve"/>
      <transition name="notNeed" to="Decided"/>
     </decision>
     <join name="Decided">
      <description>
    有一個先到達即進行父
    Token</description>
      <delegation class="kellerdu.jbpm.delegation.DecidedJoin"/>
      <transition to="Do Something"/>
     </join>
     <decision name="Do Something">
      <description>
       
    根據請求的狀態決定。

       
    1主管或者老板批準‘approve’:修改員工休假的總天數,設定發給用戶E-Mail的信息。
       
    2主管或者老板否決”-“disapprove”:設定發給用戶EMail的信息。
       
    3撤銷”-"cancel"-設定發給用戶EMail的信息。如果主管批準,要發給主管消息說明已經撤銷。
        </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">
      <!--
    發送EMail消息給申請者,記錄請假日志 -->
      <delegation class="kellerdu.jbpm.action.ProcessEndAction"/>
     </action>
    </process-definition>

     


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

    轉自: 百度

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

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


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

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

    1.     JPDL的流程定義元素

    1)        第一層:GraphElement

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

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

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

    (3)name 名字

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

    2)        第二層:node、processDefinition、TransitionTask

    它們都繼承自GraphElement

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

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

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

    (4)Task 定義任務

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

    它們都繼承自node DecisionEndStateForkJoin、Merge、Milestone InterleaveEnd、InterleaveStart、ProcessState、State

     

    posted @ 2007-09-11 13:29 jbpm 閱讀(576) | 評論 (0)編輯 收藏
         摘要: 1概述
    一個流程定義是對一個業務流程的正式說明,以及它是基于有向圖的。該圖是結點(node)與流向(transition)的組合。圖中每一個結點都是一個特殊的類型,結果的類型決定了該結點的運行時的行為。一個流程定義有且僅有一個開始狀態。
    一個令牌(token)是執行的軌跡。令牌是一個運行時的概念,其維護著速個圖中指向結點的指針。
      閱讀全文
    posted @ 2007-09-11 13:27 jbpm 閱讀(725) | 評論 (0)編輯 收藏
    主站蜘蛛池模板: 日本免费人成视频播放| XXX2高清在线观看免费视频| 亚洲av无码久久忘忧草| 亚洲小说图片视频| 亚洲国产电影在线观看| 亚洲三级中文字幕| 亚洲中文久久精品无码1| 亚洲av乱码一区二区三区| 亚洲中文久久精品无码1| 一本色道久久88亚洲精品综合| 中文无码亚洲精品字幕| 亚洲综合av一区二区三区不卡| 亚洲人片在线观看天堂无码| 亚洲熟妇无码AV| 亚洲AV无码一区二区三区久久精品 | 亚洲日韩国产二区无码 | 久久99亚洲综合精品首页| 亚洲日韩VA无码中文字幕| 久久夜色精品国产亚洲av| 国产亚洲精品资源在线26u| 亚洲好看的理论片电影| 亚洲美女免费视频| 亚洲日日做天天做日日谢| 亚洲av无一区二区三区| 人妻巨大乳hd免费看| a级男女仿爱免费视频| 2021精品国产品免费观看| 成年轻人网站色免费看| 免费大黄网站在线观看| 国产亚洲人成无码网在线观看| 亚洲第一永久在线观看| 亚洲av午夜国产精品无码中文字| CAOPORM国产精品视频免费| 97在线视频免费公开观看| 我要看免费的毛片| 国产亚洲精品成人a v小说| 亚洲第一二三四区| 另类专区另类专区亚洲| 很黄很污的网站免费| 免费看韩国黄a片在线观看| 亚洲国产香蕉人人爽成AV片久久|