<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
     
         摘要: 是一張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 閱讀(3490) | 評論 (1)編輯 收藏
         摘要: 業務日歷是關于業務時間的,并且被用于為任務和定時器計算預期的時間。 業務日歷能夠通過對一個期限和日期進行增加來計算日期。我們先看看業務日歷的語法:

    xml 代碼

    [business]


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

       轉換是活動之間的直接連接, 許多的轉換進出一個活動.。一旦某個實例完成了一項活動件,外發轉換將被評估, 其中之一被選中,以使實例轉向下一活動。條件轉換包含一個布爾表達式,該表達式將被計算,要使實例繼續沿流程前進,結果必須為true。有些轉換是基于時間的,這就意味著如果到了預期時間,實例還在那里,這些轉換將會觸發到目標活動的自動路由。流程也可以有狀態:可為流程定義屬性,接受每個實例的一個值,這能幫助您保持實例狀態,以  閱讀全文
    posted @ 2007-09-11 17:40 jbpm 閱讀(532) | 評論 (0)編輯 收藏
    僅列出標題
    共3頁: 上一頁 1 2 3 下一頁 
    主站蜘蛛池模板: 狼友av永久网站免费观看| 噼里啪啦电影在线观看免费高清| 四虎免费久久影院| 亚洲AV日韩综合一区尤物| AV片在线观看免费| 亚洲日韩精品A∨片无码加勒比| 男人的好看免费观看在线视频| 精品丝袜国产自在线拍亚洲| 成年男女男精品免费视频网站 | 久久一区二区三区免费播放| 亚洲国产精品无码专区在线观看| 性xxxxx大片免费视频| 亚洲欧洲另类春色校园小说| 免费精品国产自产拍在线观看图片| 色天使亚洲综合在线观看| 日韩高清在线免费观看| 国产亚洲福利精品一区二区| 久久影视综合亚洲| 无码日韩精品一区二区免费暖暖| 亚洲国产综合自在线另类| 免费鲁丝片一级在线观看| 一级做a爰黑人又硬又粗免费看51社区国产精品视 | 亚洲国产天堂久久综合网站| 免费下载成人电影| 看全免费的一级毛片| 亚洲欧洲成人精品香蕉网| 国产福利视精品永久免费| jizzjizz亚洲日本少妇| 亚洲va无码手机在线电影| 手机在线看永久av片免费| 无人视频免费观看免费视频 | 亚洲Av高清一区二区三区| 亚洲不卡无码av中文字幕| 午夜免费福利片观看| 亚洲精品女同中文字幕| 亚洲熟妇无码另类久久久| 日韩版码免费福利视频| 一边摸一边爽一边叫床免费视频| 亚洲国产综合专区电影在线| 国产精品成人无码免费| 最近中文字幕大全中文字幕免费 |