activiti实战读书笔记——第十章 之 调用活动与事件子流程

有些话、适合烂在心里 提交于 2019-12-06 09:10:25

1、调用活动是在一个流程中调用另一个独立的流程,这样可以到达流程的通用性的目的(被调用的流程可以在各处重复使用)。

使用callActiviti元素调用活动,属性calledElement的值定义了外部流程的流程ID,使用activiti:in标签定义输入变量。

<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>

使用普通的顺序流就可以把调用活动和其他元素连接起来:

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




2、调用活动是一个独立的流程实例,在调用活动中设置的变量会和主流程分离开来。


3、调用活动的启动事件也设定了activiti:initiator="applyUserId"属性,由于它与主流程的变量是分离的,所以不能获取到当前操作人。需要在任务开始前调用identityService.setAuthenticatedUserId指定当前操作人。


4、事件子流程和子流程类似,把一系列活动归结到一起处理,不同的是事件子流程不能直接启动,而要被动的由其他的事件触发启动。在子流程中使用了异常结束事件并定义异常编码:

<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表示此子流程只能由事件触发启动。


5、子流程和调用活动都可以支持多实例特性:

<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>





易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!