activiti實戰讀書筆記——第十章 之 調用活動與事件子流程

一、調用活動是在一個流程中調用另外一個獨立的流程,這樣能夠到達流程的通用性的目的(被調用的流程能夠在各處重複使用)。 express

使用callActiviti元素調用活動,屬性calledElement的值定義了外部流程的流程ID,使用activiti:in標籤訂義輸入變量。 app

<callActivity id="callactivity-payment" name="付款" calledElement="payment">
      <extensionElements>
        <activiti:in source="applyUserId" target="applyUserId"></activiti:in>
        <activiti:in source="listing" target="usage"></activiti:in>
        <activiti:in source="amountMoney" target="amountMoney"></activiti:in>
      </extensionElements>
    </callActivity>

使用普通的順序流就能夠把調用活動和其餘元素鏈接起來: ide

<sequenceFlow id="flow24" sourceRef="contactSupplier" targetRef="callactivity-payment"></sequenceFlow>
    <sequenceFlow id="flow29" sourceRef="callactivity-payment" targetRef="confirmReceipt"></sequenceFlow>




二、調用活動是一個獨立的流程實例,在調用活動中設置的變量會和主流程分離開來。


三、調用活動的啓動事件也設定了activiti:initiator="applyUserId"屬性,因爲它與主流程的變量是分離的,因此不能獲取到當前操做人。須要在任務開始前調用identityService.setAuthenticatedUserId指定當前操做人。 oop


四、事件子流程和子流程相似,把一系列活動歸結到一塊兒處理,不一樣的是事件子流程不能直接啓動,而要被動的由其餘的事件觸發啓動。在子流程中使用了異常結束事件並定義異常編碼: 編碼

<endEvent id="errorendevent1" name="TerminateEndEvent">
        <errorEventDefinition errorRef="PAYMENT_REJECT"></errorEventDefinition>
      </endEvent>



在事件子流程中的開始事件能夠捕獲該異常編碼,啓動事件子流程:

<subProcess id="catchErrorForPayment" name="捕獲付費子流程異常" triggeredByEvent="true">
      <startEvent id="errorstartevent1" name="Error start">
        <errorEventDefinition errorRef="PAYMENT_REJECT"></errorEventDefinition>
      </startEvent>
      <serviceTask id="recordErrorInfo" name="記錄異常信息" activiti:expression="${execution.setVariable('ERROR_INFO', message)}"></serviceTask>
      <endEvent id="endevent6" name="End"></endEvent>
      <sequenceFlow id="flow29" sourceRef="recordErrorInfo" targetRef="endevent6"></sequenceFlow>
      <sequenceFlow id="flow34" sourceRef="errorstartevent1" targetRef="recordErrorInfo"></sequenceFlow>
    </subProcess>

在子流程中添加了triggeredByEvent屬性=true表示此子流程只能由事件觸發啓動。 code


五、子流程和調用活動均可以支持多實例特性:

<subProcess id="subprocess1" name="員工子任務">
	<multiInstanceLoopCharacteristics isSequential="false" activiti:collection="${users}" activiti:elementVariable="user"/>
	<startEvent id="startevent2" name="start" activiti:initiator="subProcessStartUser"/>
	<userTask id="usertask1" activiti:assignee="${user}"/>
</subProcess>
相關文章
相關標籤/搜索