1. 程式人生 > 其它 >jbpm5.1介紹(2)

jbpm5.1介紹(2)

快速開始 

首先下載jBPM,http://sourceforge.net/projects/jbpm/files/

可以有選擇性的下載:

  • bin:jBPM的二進位制檔案和它們的依賴包
  • src:核心模組的原始碼
  • gwt-console:jBPM的控制檯,包括服務端和客戶端
  • docs:文件
  • examples:一些jBPM的例子,可以匯入到Eclipse
  • installer: jBPM的安裝,下載和安裝一個jBPM的示例
  • installer-full:所有的包括demo,jar包等待的完整工程

一些有用的連結 

原始碼 

jBPM的,現在使用它的原始碼版本控制系統的git。可以在這裡找到jBPM專案的來源(包括所有版本從jBPM5.0- CR1開始):

https://github.com/droolsjbpm/jbpm

安裝所需條件

 JDK 1.5+ (set as JAVA_HOME)

 Ant 1.7+

演示環境安裝

到安裝目錄下執行

ant install.demo

將會執行

  • 下載JBoss AS
  • 下載Eclipse
  • JBoss的安裝Drools的Guvnor
  • 到JBoss Oryx安裝設定
  • 安裝到JBoss jBPM的控制檯
  • 安裝jBPM的Eclipse外掛
  • 安裝Drools的Eclipse外掛

如果你想看到報告在jBPM控制檯上,那麼需要修改build.properties檔案的jBPM.birt.download屬性設定為true

ant start.demo

啟動示例

  • 啟動H2資料庫
  • 啟動了JBoss AS
  • 啟動Eclipse
  • 啟動人工任務服務

使用Eclipse tools

匯入示例工程下的sample/evaluation

匯入之後可以看到工程中的示例程式

雙擊開啟Evaluation.bpmn

可以執行ProcessTest進行測試

使用jBPM控制檯

啟動後輸入如下連結

http://localhost:8080/jbpm-console

使用 krisv / krisv 登入

可以看到如下介面

你可以啟動一個新的流程,檢視一個正在執行的流程的例項的狀態,檢視你的任務,完成任務,監控流程的執行

使用Guvnor倉庫和設計

作為一個過程庫的Guvnor庫可用於儲存業務流程。它還提供了一個基於Web的介面來管理您的程序。

輸入如下地址可以進入

http://localhost:8080/drools-guvnor

核心引擎API

本節介紹的API,你需要載入過程並執行它們。對於如何界定的過程本身更詳細,檢視檢出的BPMN 2.0的章節。

你可以在知識庫中定義一個流程例項,然後在知識庫中產生一個例項的session物件,如下圖所示

知識庫可以共享會話之間,通常只建立一次,在啟動應用程式。知識庫可以動態改變(這樣你就可以在執行過程中新增或刪除)。

會話可以建立基於一個知識庫,用於執行過程,並與引擎互動。你想建立一個會話被認為是相對較輕的,你可以創造儘可能多的獨立會議。如何建立許多會議是由你。在一般情況下,最簡單的情況下開始建立一個會話,然後在您的應用程式的各個地方。你可以決定建立多個會話,例如,如果你想有多個獨立的處理單元(例如,你想要的所有程序,從一個客戶的完全獨立於另一個客戶的過程,使您可以建立一個為每個客戶獨立會議),或如果你需要多個會話,可擴充套件性的原因。如果你不知道做什麼,只要簡單地啟動一個知識庫,其中包含你所有的流程定義和建立會話,然後使用執行你所有的流程。

正如上文所述,jBPM的API,因此可用於:(1)建立一個知識庫,其中包含您的流程定義(2)建立一個會話啟動新的程序例項,訊號現有註冊偵聽等。

1)知識庫

通過知識庫載入流程定義,通過以下程式碼實現

KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
kbuilder.add(ResourceFactory.newClassPathResource("MyProcess.bpmn"), ResourceType.BPMN2);
KnowledgeBase kbase = kbuilder.newKnowledgeBase();

ResourceFactory有類似的方法來載入檔案系統的檔案,從URL,InputStream中,等

2)Session

一旦你載入你的知識庫,你應該建立一個會話與引擎互動。本次會議可以被用來啟動新的程序,訊號事件等,下面的程式碼片段顯示了它是多麼容易建立較早建立的知識庫為基礎的會話,並啟動一個程序(ID)。

StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
ProcessInstance processInstance = ksession.startProcess("com.sample.MyProcess");

ProcessRuntime介面定義了所有的會議方法與流程互動,如下所示。

/**
     * Start a new process instance.  The process (definition) that should
     * be used is referenced by the given process id.
     * 
     * @param processId  The id of the process that should be started
     * @return the ProcessInstance that represents the instance of the process that was started
     */
    ProcessInstance startProcess(String processId);

    /**
     * Start a new process instance.  The process (definition) that should
     * be used is referenced by the given process id.  Parameters can be passed
     * to the process instance (as name-value pairs), and these will be set
     * as variables of the process instance. 
     * 
     * @param processId  the id of the process that should be started
     * @param parameters  the process variables that should be set when starting the process instance 
     * @return the ProcessInstance that represents the instance of the process that was started
     */
    ProcessInstance startProcess(String processId,
                                 Map<String, Object> parameters);

    /**
     * Signals the engine that an event has occurred. The type parameter defines
     * which type of event and the event parameter can contain additional information
     * related to the event.  All process instances that are listening to this type
     * of (external) event will be notified.  For performance reasons, this type of event
     * signaling should only be used if one process instance should be able to notify
     * other process instances. For internal event within one process instance, use the
     * signalEvent method that also include the processInstanceId of the process instance
     * in question. 
     * 
     * @param type the type of event
     * @param event the data associated with this event
     */
    void signalEvent(String type,
                     Object event);

    /**
     * Signals the process instance that an event has occurred. The type parameter defines
     * which type of event and the event parameter can contain additional information
     * related to the event.  All node instances inside the given process instance that
     * are listening to this type of (internal) event will be notified.  Note that the event
     * will only be processed inside the given process instance.  All other process instances
     * waiting for this type of event will not be notified.
     * 
     * @param type the type of event
     * @param event the data associated with this event
     * @param processInstanceId the id of the process instance that should be signaled
     */
    void signalEvent(String type,
                     Object event,
                     long processInstanceId);

    /**
     * Returns a collection of currently active process instances.  Note that only process
     * instances that are currently loaded and active inside the engine will be returned.
     * When using persistence, it is likely not all running process instances will be loaded
     * as their state will be stored persistently.  It is recommended not to use this
     * method to collect information about the state of your process instances but to use
     * a history log for that purpose.
     * 
     * @return a collection of process instances currently active in the session
     */
    Collection<ProcessInstance> getProcessInstances();

    /**
     * Returns the process instance with the given id.  Note that only active process instances
     * will be returned.  If a process instance has been completed already, this method will return
     * null.
     * 
     * @param id the id of the process instance
     * @return the process instance with the given id or null if it cannot be found
     */
    ProcessInstance getProcessInstance(long processInstanceId);

    /**
     * Aborts the process instance with the given id.  If the process instance has been completed
     * (or aborted), or the process instance cannot be found, this method will throw an
     * IllegalArgumentException.
     * 
     * @param id the id of the process instance
     */
    void abortProcessInstance(long processInstanceId);

    /**
     * Returns the WorkItemManager related to this session.  This can be used to
     * register new WorkItemHandlers or to complete (or abort) WorkItems.
     * 
     * @return the WorkItemManager related to this session
     */
    WorkItemManager getWorkItemManager();

3)Events

可以使用ProcessEventListener註冊自己的監聽器

public interface ProcessEventListener {

  void beforeProcessStarted( ProcessStartedEvent event );
  void afterProcessStarted( ProcessStartedEvent event );
  void beforeProcessCompleted( ProcessCompletedEvent event );
  void afterProcessCompleted( ProcessCompletedEvent event );
  void beforeNodeTriggered( ProcessNodeTriggeredEvent event );
  void afterNodeTriggered( ProcessNodeTriggeredEvent event );
  void beforeNodeLeft( ProcessNodeLeftEvent event );
  void afterNodeLeft( ProcessNodeLeftEvent event );
  void beforeVariableChanged(ProcessVariableChangedEvent event);
  void afterVariableChanged(ProcessVariableChangedEvent event);

}

預設支援下面的記錄器實現:

1。 控制檯記錄器:此記錄寫入控制檯的所有事件。 2。 檔案記錄器:此記錄寫入到一個檔案中使用XML表示的所有事件。此日誌檔案可能被用來在IDE中生成一個基於樹的視覺化,在執行過程中發生的事件。 3。 執行緒檔案記錄器:因為檔案記錄器的事件寫入到磁碟中,只有當關閉記錄儀或記錄器中的事件數量達到預定水平時,它不能被用來除錯時,在執行過程。一個執行緒檔案記錄器的事件寫入到一個檔案後,在指定的時間間隔,使得它可以使用記錄器以視覺化的實時進展,而除錯過程。

KnowledgeRuntimeLoggerFactory 可以新增logger到你的session中

KnowledgeRuntimeLogger logger =
    KnowledgeRuntimeLoggerFactory.newFileLogger( ksession, "test" );
// add invocations to the process engine here,
// e.g. ksession.startProcess(processId);
...
logger.close();

業務流程建立

使用eclipse建立流程

可以在生成好的檔案上定義業務流程

節點型別描述

BPMN 2.0規範定義了三種主要型別的節點

事件:它們用於模型中的特定事件的發生。這可能是一個開始事件(即用來指示的過程中開始),結束事件(定義過程結束,或該子流)和中間事件(指示的執行過程中可能出現的事件過程)。

活動:這些定義,需要在執行過程中執行不同的動作。存在不同型別的任務,對活動的型別取決於您嘗試模型(如人工的任務,服務任務等)和actvities也可以巢狀(使用不同型別的子程序)。

閘道器:可以被用來定義多個路徑的過程中。根據閘道器型別,這些可能表明並行執行,選擇等

流程屬性

一個BPMN2過程是不同型別的節點與使用連線流程圖。這個過程本身暴露了以下屬性:

  • id:過程中的唯一的ID。
  • name:過程中的顯示名稱。
  • Version: 版本號的過程。
  • Package: 過程的包(名稱空間)
  • Variables:變數可以被定義為資料儲存過程的執行期間
  • Swimlanes:指定在這個過程中用於分配人工任務的泳道

事件

1)開始事件

程序的開始。一個過程應該有一個起始節點,沒有傳入的連線只有傳出的連線

每當一個程序啟動後,將開始執行此節點,並自動繼續與這個啟動事件的第一個節點,並依此類推。它包含以下屬性:

  • Id: 節點的ID(這是一個節點容器內唯一)
  • Name: 節點的顯示名稱

2)結束事件

所有流程的結束,應該只有傳入的連線沒有傳出的連線。它包含以下屬性:

  • Id: 節點的ID(這是一個節點容器內唯一)
  • Name: 節點的顯示名稱

Terminate: 結束事件可以在整個過程中或終止路徑。當一個流程例項被終止,這意味著它的狀態設定為完成和所有其他節點可能仍然活躍在這個過程例項(並行路徑)被取消。非終止結束事件只是這個路徑(執行這個分支將在這裡結束)結束,但仍然可以繼續其他平行的路徑。如果有流程例項內,沒有更積極的的路徑(例如,如果一個流程例項到達結束節點,但非終止流程例項內有沒有更活躍的分支,將完成的過程例項,一個流程例項將自動完成反正)。終止結束事件的視覺化的事件節點內使用一個完整的圓,非終止事件節點是空的。請注意,如果您使用一個子程序內的終止事件節點,你是終止流程例項的頂層,不只是子程序。

3)出錯事件

錯誤處理事件,只能有傳入事件沒有傳出事件,錯誤事件包含以下屬性:

  • Id: 節點的ID(這是一個節點容器內唯一)
  • Name: 節點的顯示名稱
  • FaultName: 故障名稱,使用些名稱來處理故障
  • FaultVariable: 名稱的變數,它包含與此故障相關的資料。這個資料也是通過異常處理程式(如果找到)。

4)定時器事件

表示定時器後,可以觸發一個特定的時間內一次或多次。計時器事件應該有一個傳入的連線和一個外向連線。計時器延遲指定計時器之前應等待多久引發的第一次。當計時器事件的過程中達到的,它會啟動相關的定時器。如果定時器節點被取消(例如,通過完成或中止封閉的過程例項),定時器就會被取消。

計時器事件包含以下屬性:

  • Id: 節點的ID(這是一個節點容器內唯一)
  • Name: 節點的顯示名稱
  • Timer delay:延遲,節點之前應等待觸發第一次。表達應的形式[#][#H] [#M] [#S] [#[MS]。這意味著,您可以指定天,小時,分鐘,秒和multiseconds(這是預設的,如果你不指定任何)的數量。例如,表達“1H”觸發定時器將等待一個小時。表示式也可以使用#{expr}的動態推導基於一些過程變數的延遲。 EXPR在這種情況下,可能是一個過程變數,或基於一個過程變數(如myVariable.getValue())的一個更復雜的表示式。
  • Timer period: 隨後的兩個觸發器之間的期間。如果期間為0時,定時器應只能觸發一次。表達應的形式[#][#H] [#M] [#S] [#[MS]。這意味著,您可以指定天,小時,分鐘,秒和multiseconds(這是預設的,如果你不指定任何)的數量。例如,表達“1H”再次觸發定時器將等待一個小時。也可以使用#{expr}的動態推導基於一些過程變數期間的表達。 EXPR在這種情況下,可能是一個過程變數,或基於一個過程變數(如myVariable.getValue())的一個更復雜的表示式。

5)訊號事件

可用於訊號事件,在執行過程中的內部或外部事件作出迴應。訊號事件有沒有傳入的連線和一個外向連線。它指定的事件型別,預計。每當檢測到這種型別的事件,此事件節點相連的節點將被觸發。它包含以下屬性:

  • Id: 節點的ID(這是一個節點容器內唯一)
  • Name: 節點的顯示名稱
  • EventType:事件的型別
  • VariableName: variablename的變數將包含與此事件相關的資料(如有),此事件發生時的名稱。

一個流程例項可以標誌著一個特定的事件發生

ksession.signalEvent(eventType, data, processInstanceId)

這將觸發所有在給定的程序例項(活動)訊號,等待該事件型別的事件節點。與事件相關的資料可以通過使用資料引數。如果事件節點指定一個變數名,這個資料將被複制到該變數在事件發生時。

您還可以產生一個流程例項內的訊號。可以使用一個指令碼(指令碼任務或進入或退出操作使用)

kcontext.getKnowledgeRuntime().signalEvent(
  eventType, data, kcontext.getProcessInstance().getId());

6)活動

表示,應該在這個過程中執行的指令碼。指令碼任務應該有一個傳入的連線和一個外向連線。指定應執行相關的操作,編碼的行動(即Java或MVEL)使用的方言,和實際行動程式碼。此程式碼可以訪問的任何變數和全域性。還有一個預定義的變數kcontext引用ProcessContext物件,例如,它可以被用來訪問當前流程例項或NodeInstance,並獲得和設定變數,或獲得ksession使用kcontext.getKnowledgeRuntime()。當一個指令碼任務的過程中達成的,它會執行的動作,然後繼續下一個節點。它包含以下屬性:

  • Id: 節點的ID(這是一個節點容器內唯一)
  • Name: 節點的顯示名稱
  • Action: 行動節點與此相關的動作指令碼

請注意,您可以編寫指令碼節點內的任何有效的Java程式碼。這基本上允許你做這樣一個指令碼節點內部任何。但是也有一些注意事項:

  • 當試圖建立一個更高級別的業務過程中,也應該由企業使用者瞭解,它可能是明智的,裡面的過程中避免低層次的實施細節,包括在這些指令碼任務。指令碼任務仍然可以用於快速操作變數等,但其他概念,如服務任務,可以用來在一個更高層次的方式更復雜的行為模式。
  • 應立即指令碼。他們使用的是引擎的執行緒來執行指令碼。也許應該仿照作為非同步服務任務,可能需要一些時間來執行的指令碼。
  • 您應儘量避免接觸外部服務,通過一個指令碼節點。這不僅平時違反前兩個警告,這也與外部服務互動的發動機,可問題沒有的知識,特別是當使用永續性和交易。在一般情況下,它可能是更明智的使用服務的任務與外部服務模式通訊。
  • 指令碼不應該丟擲異常。執行時異常應該被捕獲和管理裡面的指令碼或轉換成訊號或,然後將其內部的過程中處理錯誤的例子。

7)服務任務

執行流程引擎之外的所有工作應派代表參加(以宣告方式)使用服務任務。不同型別的服務是預定義的,例如,傳送電子郵件,記錄資訊等,使用者可以定義域特定的服務或工作專案,採用了獨特的名稱和定義的引數(輸入)和相關的結果(輸出)這種型別的工作。檢查章特定於域的過程進行了詳細的解釋和例子說明如何定義和使用在你的流程的工作專案。當一個服務任務的過程中達成共識,相關的工作是執行。一個服務的任務應該有一個傳入的連線和一個外向連線。包含如下屬性:

  • Id: 節點的ID(這是一個節點容器內唯一)
  • Name: 節點的顯示名稱
  • Parameter mapping:允許過程變數的值複製到工作專案的引數。建立工作專案時,該值將被複制。
  • Result mapping: 允許複製工作專案的結果引數值的過程變數。每種型別的工作可以定義結果,將(可能)已經完成的工作專案後返回的引數。結果對映可用於複製的給定的結果引數值,在這個過程中給定的變數。例如,“FileFinder”工作專案返回結果引數檔案內匹配給定的搜尋條件的檔案清單。這個檔案的列表,然後可以繫結以便在使用過程中的一個過程變數。工作專案完成後,該值將被複制。
  • On-entry and on-exit actions:在進入或退出這個節點,分別執行的動作。
  • Additional parameters: 每個工作專案型別可以定義額外的引數,這種型別的工作有關。例如,“電子郵件”工作專案定義額外的引數,如發件人,收件人,主題和正文。使用者既可以提供這些引數的值,直接或定義一個引數的對映,將複製在這個過程中給定的變數給定的引數值,如果兩者都指定,對映將具有優先權。 String型別的引數,可以使用#{表示式}嵌入在字串值中。建立工作專案時,該值將被檢索和替換表示式將被替換變數上呼叫toString()方法的結果。表示式可以簡單地將一個變數的名字(在這種情況下,解析變數的值),但更先進的MVEL表示式儘可能,如#{person.name.firstname}。

8)使用者任務

過程也涉及使用者需要執行的任務。使用者任務代表一個原子由一個人執行的任務。它應該有一個傳入的連線和一個外向連線。可用於使用者任務與泳道分配多個人工任務相似的使用者組合。請參閱有關詳細資訊,對使用者的任務章。使用者任務實際上只是一個服務節點的具體型別(型別為“人工任務”)。使用者任務包含以下屬性:

  • Id: 節點的ID(這是一個節點容器內唯一)
  • Name: 節點的顯示名稱
  • TaskName: 任務的名稱
  • Priority: 一個整數,指示任務的優先順序
  • Comment:與任務相關的描述
  • ActorId: 負責執行人工任務的ID。一個演員的ID列表,可以指定使用一個逗號(',')作為分隔。
  • GroupId: 負責執行人工任務的組ID。作為分隔符使用一個逗號(',')可以指定一組ID的列表。
  • Skippable: 指定是否可以跳過人工任務,即,這個角色可能會決定不執行任務。
  • Content: 與此任務相關的資料。
  • Swimlane:泳道可以分配多個人工任務給相同的角色
  • On entry and on exit actions: 在進入和退出之前分別執行的動作
  • Parameter mapping: 允許人工任務的引數複製過程變數的值。創造人工的任務後,該值將被複制。
  • Result mapping: 允許複製工作專案的結果引數值的過程變數。每種型別的工作可以定義結果,將(可能)已經完成的工作專案後返回的引數。結果對映可用於複製的給定的結果引數值,在這個過程中給定的變數。例如,“FileFinder”工作專案返回結果引數檔案內匹配給定的搜尋條件的檔案清單。這個檔案的列表,然後可以繫結以便在使用過程中的一個過程變數。工作專案完成後,該值將被複制。

9)子流程

表示從這個過程中的另一個程序呼叫。一個子流程節點都應該有一個傳入的連線和一個傳出連線。當可重複使用的子流程節點的過程中達成的,該發動機將開始與給定ID的過程。它包含以下屬性:

  • Id: 節點的ID(這是一個節點容器內唯一)
  • Name: 節點的顯示名稱
  • ProcessId: 應執行的程序的ID
  • Wait for completion: 如果此屬性為true,這個子程序的節點只會繼續下去,如果啟動的子程序已終止其執行(完成或中止),否則將繼續啟動子後,立即(所以它不會等待它的完成)。
  • Independent: 如果此屬性為true,子程序開始作為一個獨立的過程,這意味著如果完成這個父程序,子程序將不會被終止(或其他一些原因取消此子流程節點);活躍​​的子程序將被取消(或取消子流程節點)父程序終止。
  • On entry and on exit actions: 在進入和退出之前分別執行的動作
  • Parameter in/out mapping: 子流程節點還可以定義和對映變數。啟動程序時,在“在”對映的變數將被用作引數(相關引數名稱)。所定義的“出”對映的子程序的變數將被複制到這個過程中,變數,當子程序已經完成。請注意,您可以使用“出”對映只有當“等待完成”設定為true。

10)業務規則任務

表示需要進行評估的規則,。到達節點時,規則進行評估。規則的任務應該有一個傳入的連線和一個外向連線。規則是被定義在單獨的檔案中使用Drools的規則格式。規則可以成 為一個特定的規則流使用規則流組屬性組規則頭的一部分。當一個規則任務達成的過程中,發動機將開始執行相應的規則流組的部分(如有)的規則。執行將自動繼續到下一個 節點,如果有沒有更積極的規則在這個規則流組。這意味著,在執行一個規則流組,有可能屬於當前活動的規則流組的新啟用新增其他規則的事實的變化,由於議程。請注意,這 一程序將立即繼續下一個節點,如果遇到一個規則流組,那裡有當時沒有活動的規則。如果規則流組已經啟動,規則流組將保持活躍,只會繼續執行規則流組的所有活動的規則, 如果已經完成。它包含以下屬性:

  • Id: 節點的ID(這是一個節點容器內唯一)
  • Name: 節點的顯示名稱
  • RuleFlowGroup: 表示這個RuleFlowGroup節點規則集的規則流組的名稱。

11)嵌入式子過程

一個子程序是一個節點,它可以包含其他節點,因此,它作為一個節點的容器行為。這使得不僅在這樣一個子流程節點的嵌入過程的一部分,而且此容器內部的所有節點訪問的額外的變數的定義。一個子程序應該有一個傳入的連線和一個外向連線。它也應該包含一個起始節點定義啟動(子程序內),當你到達子程序。它也應該包含一個或多個結束事件。需要注意的是,如果您使用裡面一個子程序終止的事件節點,則終止流程例項的頂層,不只是子程序,所以一般你應該使用一個子程序內非終止端節點。當有活動的節點內的子程序沒有子程序結束。它包含以下屬性:

  • Id: 節點的ID(這是一個節點容器內唯一)
  • Name: 節點的顯示名稱
  • Variables: 變數可以被定義為在執行此節點的資料儲存。

12)多例項的子程序

多例項的子程序是一種特殊的子程序,允許你執行所包含的過程中多次分部,為每一個集合中的元素一次。多例項子程序應該有一個傳入的連線和一個傳出連線。等待,直到完成嵌入式的過程片段是在給定集合的每個元素,然後再繼續。它包含以下屬性:

  • Id: 節點的ID(這是一個節點容器內唯一)
  • Name: 節點的顯示名稱
  • CollectionExpression: 一個變數,表示應該遍歷元素的集合的名稱。集合變數應該是一個數組或型別的java.util.Collection。如果集合表示式計算為null或空的集合,子程序將立即完成的多個例項,並按照其傳出連線。
  • VariableName:variablename的變數的名稱:包含從集合中的當前元素。這給選定的元素的複合節點訪問的節點。

13)流向不同的閘道器

允許你建立你的程序中的分支。發散閘道器應該有一個傳入的連線和兩個或兩個以上的傳出連線。目前支援的閘道器節點有三個型別:

  • 並行的手段,控制流將同時繼續在所有傳出連線。
  • 異或完全傳出連線將選擇的唯一手段。這個決定是由評估連結到每個傳出連線的約束。選擇優先順序最低的數量,計算結果為true的約束。約束可以指定使用不同的方言。請注意,您應始終確保至少一個傳出連線會在執行時評估為true(在規則流在執行時會丟擲一個異常,如果它不能找到至少一個傳出連線)。
  • OR或,選擇的條件計算結果為true的所有傳出連線的手段。條件相似的獨家閘道器,沒有重點考慮的除外。請注意,因為這個過程在執行時會丟擲一個異常,如果它不能確定傳出連線,你應該確保至少一個傳出連線將評估在執行時也是如此。

它包含以下屬性:

  • Id: 節點的ID(這是一個節點容器內唯一)
  • Name: 節點的顯示名稱
  • Type:分割節點,即和,異或OR(見上文)的型別
  • Constraints: 約束與每個傳出連線

14)合併閘道器

可以同步多個分支。融合閘道器應該有兩個或兩個以上的傳入連線和一個外向連線。有兩種型別的拆分目前支援:

  • 並行的手段或者說是將等待,直到所有傳入分支,然後再繼續完成。
  • 異或唯一手段,它繼續儘快傳入分支之一已經完成。如果它是從多個傳入的連線觸發時,它會觸發這些觸發器的下一個節點。

它包含以下屬性:

  • Id: 節點的ID(這是一個節點容器內唯一)
  • Name: 節點的顯示名稱
  • Type:分割節點,即和,異或OR(見上文)的型別