中间事件
顾名思义,中间事件表明在进程的开始和结束之间发生某些事情的位置(事件)。它将影响流程的流程,但不会启动或(直接)终止流程。
中间事件可用于:
●指示在流程中需要或发送消息的位置,
●显示过程中预期的延迟,
●通过异常处理中断正常流,或
●显示为补偿所需的额外工作。
中间事件与开始事件和结束事件的基本形状相同,即一个具有开放中心的圆,以便可以在圆中放置标记,以指示事件的变化。
◇中间事件是必须用双细线绘制的圆(参见图10.72)。
◇中间事件使用文本、颜色、大小和行必须遵循“使用文本、颜色、大小和行”中定义的规则,第39页除了行的厚度必须保持两倍,以便中间事件与开始和结束事件区分开来。
图10.72-中间事件
中间事件的一个用途是表示异常或补偿处理。这将通过将中间事件放置在任务或子进程的边界上(折叠或展开)来显示。中间事件可以附加到活动边界的任何位置,并且输出的序列流可以向任何方向流动。然而,为了清晰的清晰,我们建议建模者在边界上选择一个一致的位置。例如,如果图表的方向是水平的,那么中间事件可以附加到活动的底部,序列流指向向下,然后向右侧。如果图表方向是垂直的,则中间事件可以附加到活动的左侧或右侧,序列流指向左或右,然后向下。
中间事件触发器
在BPMN中有12种类型的中间事件:无类型(None)、消息(Message)、定时器(Timer)、升级(Escalation)、错误(Error)、取消(Cancel)、补偿(Compensation)、条件(Condition)、链接(Link)、信号(Signal)、多重(Multiple)和并行多重(Parallel Multiple)。每种类型的中间事件都将在中间事件形状的中心放置一个不同的图标,以区分彼此。
在BPMN中使用中间事件有两种方式:
1.放置在进程的正常流程中的中间事件可用于以下两个目的之一。事件可以响应事件触发器(“catch”),或者事件可以用于启动(“抛出”)事件触发器。
2.附加到活动边界的中间事件只能用于“捕获”事件触发器。
正常序列流中的中间事件
当令牌到达位于进程的正常流程中的中间事件时,将会发生两件事中的一件。
●如果事件用于“抛出”事件触发器,那么事件的触发器将立即发生(例如,消息将被发送),并且令牌将向下移动到传出的序列流中。
●如果事件用于“捕获”事件触发器,则令牌将保持在事件中,直到触发器发生(例如,接收到消息)。然后,令牌将向下移动到传出的序列流中。
12个中间事件中的10个可以在正常流量中使用,如表10.89所示。
表10.89-正常流量中的中间事件类型
触发器 | 描述 | 标记 |
无类型 | 无类型中间事件仅在正常流中有效,即,它不能在活动的边界上使用。虽然此事件没有特定的触发器,但它被定义为抛出事件。它用于建模使用事件来指示进程中的某些状态变化的方法。 无类型中间事件没有特定的 事件定义(EventDefinition)子类(见第259页)。如果(抛出)中间事件没有关联的 事件定义(EventDefinition),则该事件必须没有标记即可显示(请参见右图)。 | 抛出 |
消息 | 消息中间事件可用于发送消息或接收消息。用于“抛出”消息时,必须填充事件标记(请参见右侧上图)。当用于“捕获”消息时,必须镂空事件标记(参见右侧下图)。如果进程正在等待消息,或者更改异常处理的流程,则会导致进程继续。 通过使用流程的定义协作中使用消息流将事件连接到参与者,可以识别接收消息的实际参与者——参见表10.1。有关消息的更多细节,请参见第91页。 | 抛出 捕捉 |
计时器 | 在正常流程中,定时器中间事件作为一种基于特定时间日期或特定周期(例如,每周一上午9点)的延迟机制,可以被设置为将触发该事件。此事件必须使用时钟标记来显示(见右图)。 | 捕捉 |
升级 | 在正常流中,升级中间事件会引发升级。因为这是一个抛出事件,所以箭头标记将被填充(见右边的图)。 | 抛出 |
补偿 | 在正常流量中,此中间事件表示补偿是必要的。因此,它被用于“抛出”补偿事件,并且必须填充事件标记(见右图)。如果识别了一个活动,并且它已成功完成,则该活动将得到补偿。该活动必须从补偿中间事件中可见,即,以下内容之一必须为真: ●补偿中间事件包含在子流程的同一级别的正常流程中。 ●补偿中间事件被包含在补偿事件子过程中,且被包含在持有该活动的子过程中。 如果没有识别出任何活动,则从补偿中间事件中可见的所有成功完成的活动都将被补偿,补偿顺序与它们的顺序流相反。可见性是指下列情况之一: ●补偿中间事件包含在正常流程中,并处于与活动相同的子流程级别中。 ●补偿中间事件被包含在补偿事件子过程中,且被包含在持有这些活动的子过程中。要获得补偿,一个活动必须有一个边界补偿事件,或包含一个补偿事件子流程。 | 抛出 |
条件 | 当一个条件变为真时,将触发这种类型的事件。条件是一种表达式的类型。一个表达式的属性可以在第82页上找到。 | 捕捉 |
链接 | 链接中间事件仅在正常流中有效,即,它们不能在活动的边界上使用。链接是一种用于连接流程的两个部分的机制。链接事件可用于创建循环情况或避免长序列流行。链接事件的使用仅限于单个进程级别(即,它们不能将父进程与子进程链接起来)。配对的中间事件也可以用作“页面外连接器”,用于跨多个页面打印进程。它们还可以用作进程级别中的通用“转到”对象。可以有多个源链接事件,但只能有一个目标链接事件。 当用于“抛出”到目标链接时,事件标记将被填充(见右边的上图)。 当用于从源链接“捕获”时,事件标记将被镂空(参见右侧底部图)。 | 抛出 捕捉 |
信号 | 这种类型的事件用于发送或接收信号。信号用于在流程级别内和跨流程级别、跨池以及业务流程图之间的一般通信。BPMN信号类似于一种信号闪光,让任何感兴趣的人注意到,然后做出反应。因此,有一个信号源,但没有特定的预期目标。如果中间事件是正常流的一部分,则这种类型的中间事件可以发送或接收信号。事件在附加到活动的边界时只能接收到信号。信号事件与错误事件的不同之处在于,信号定义了一个更通用的中断活动的条件(如成功完成另一个活动),以及比错误事件更大的范围。 当用于“捕捉”信号时,事件标记将被镂空(见右侧中间图)。 当用来“抛出”信号时,事件标记将被填充(见右边的上图)。一个信号的属性可以在第272页找到。 | 抛出 捕捉 |
多重 | 这意味着有多个触发器。如果在正常流中使用,事件可以“捕获”触发器或“抛出”触发器。当附加到一个活动的边界时,事件只能“捕获”触发器。当用于“捕获”触发器时,只需要其中一个触发器是必须激活的,并且事件标记将被取消填充(见右边的中间图)。当用于“抛出”触发器时(与多个结束事件相同)时,将抛出所有分配的触发器,并且事件标记将被填充(请参见右侧的上图)。 对于多个中间事件,没有特定的 事件定义(EventDefinition)子类(见第259页)。如果中间事件有多个关联的 事件定义(EventDefinition),则该事件将显示为多重事件标记。 | 抛出 捕捉 |
平行多重 | 这意味着有多个触发器。如果在正常流中使用,则事件只能“捕获”触发器。当附加到一个活动的边界时,事件只能“捕获”触发器。与普通的多中间事件不同,该事件需要触发所有分配的触发器。事件标记将是一个未填充的加号(请见右图)。 对于并行多个中间事件,没有特定的 事件定义(EventDefinition)子类(参见第259页)。中间事件的 事件定义(parallelMultiple)属性为真,那么事件将用并行多重事件标记显示。 | 捕捉 |
连接到活动边界的中间事件
表10.90描述了可以附加到一个活动的边界上的中间事件。
表10.90-附加到活动边界的中间事件类型
触发器 | 描述 | 标记 |
消息 | 一条消息从参与者处到达并触发该事件。如果消息事件附加到活动的边界,它将在触发时将正常流更改为异常流。 对于中断其附加的活动的消息事件,事件的边界是实线的(参见右上图)。注意,如果使用此表示法,事件附加的活动的“cancelActivity”属性隐式设置为true。对于不中断其附加的活动的消息事件,事件的边界为虚线(见右下图)。注意,如果使用此表示法,事件附加的活动的“cancelActivity”属性隐式设置为false。通过使用流程的定义协作中使用消息流将事件连接到参与者,可以识别接收消息的实际参与者——参见表10.1。 | 中断 不中断 |
计时器 | 可以设置一个特定的时间-日期或一个特定的周期(例如,每周一上午9点)来触发该事件。如果定时器事件附加到活动的边界,它将在被触发时将正常流更改为异常流。 对于中断其附加的活动的计时器事件,事件的边界是实线的(参见右上图)。注意,如果使用此表示法,事件附加的活动的“cancelActivity”属性隐式设置为true。 对于不中断其附加的活动的计时器事件,事件的边界为虚线(见右下图)。注意,如果使用此表示法,事件附加的活动的“cancelActivity”属性隐式设置为false。 | 中断 不中断 |
升级 | 这种类型的事件用于处理已命名的升级。如果附加到一个活动的边界,中间事件将捕获一个升级。与错误相反,默认情况下假设升级不会中止边界事件所附加的活动。但是,建模者可以通过使用以下内容中描述的符号来决定覆盖此设置: ●对于中断其附加的活动的升级事件,事件的边界是实线的(见右上图)。注意,如果使用此表示法,事件附加的活动的“cancelActivity”属性隐式设置为true。 ●对于不中断其附加的活动的升级事件,事件的边界为虚线(见右下图)。注意,如果使用此表示法,事件附加的活动的“cancelActivity”属性隐式设置为false。 | 中断 不中断 |
错误 | 一个捕获中间错误事件只能附加到一个活动的边界上,即,它不能在正常流中使用。如果在此上下文中使用,它会对(捕获)命名错误进行反应,如果没有指定名称,则响应任何错误。 请注意,错误事件总是会中断它所附加的活动,即,没有此事件的非中断版本。因此,事件的边界总是实线的(见右图)。 | 中断 |
取消 | 这种类型的中间事件在事务子进程中使用。这种类型的事件必须附加到子进程的边界上。如果在事务处理子进程中达到了取消结束事件,则应触发它。如果在执行事务时收到 TransactionProtocol“取消”消息,也应触发。 请注意,取消事件总是会中断它所附加的活动,即,没有此事件的非中断版本。因此,事件的边界总是实线的(见右图)。 | 中断 |
补偿 | 当附加到活动的边界时,此事件用于“捕获”补偿事件,因此必须镂空事件标记(见右图)。该事件将由针对该活动的抛出补偿触发。当事件被触发时,将执行与事件关联的补偿活动(参见第301页)。请注意,中断其他事件的非中断方面并不适用于补偿事件。补偿只能在其附加的活动完成后触发。因此,他们不能中断该活动。事件的边界总是实线的。 | |
条件 | 当一个条件变为真时,将触发这种类型的事件。条件是一种表达式(Expression)的类型。一个表达式的属性可以在第82页找到。如果条件事件附加到活动的边界,它将在触发时将正常流更改为异常流。 对于中断附加的活动的条件事件,事件的边界是实的(参见右上图)。注意,如果使用此表示法,事件附加的活动的“cancelActivity”属性隐式设置为true。 对于不中断其附加的活动的条件事件,事件的边界为虚线(见右下图)。注意,如果使用此表示法,事件附加的活动的“cancelActivity”属性隐式设置为false。 | 中断 不中断 |
信号 | 信号信号事件当附加到活动的边界时,可以接收到信号。在此上下文中,它将在被触发时将正常流更改为异常流。信号事件与错误事件的不同之处在于,信号定义了一个更通用的中断活动条件(如成功完成另一个活动),以及比错误事件更大的范围。当用来“捕获”信号时,事件标记将被镂空。一个信号的属性可以在第272页找到。 对于中断附加的活动的信号事件,事件的边界是实线的(见右上图)。注意,如果使用此表示法,事件附加的活动的“cancelActivity”属性隐式设置为true。 对于不中断其附加的活动的信号事件,事件的边界为虚线(见右下图)。注意,如果使用此表示法,事件附加的活动的“cancelActivity”属性隐式设置为false。 | 中断 不中断 |
多重 | 多个事件表示为该事件分配了多个触发器。当附加到一个活动的边界时,事件只能“捕获”触发器。在这种情况下,只需要一个指定的触发器,并且事件标记将在被触发时被镂空,所发生的事件将使正常流更改为异常流。 对于多重中间事件,没有特定的事件定义(EventDefinition)子类(见第259页)。如果中间事件有多个关联的事件定义(EventDefinition),则该事件将显示为多重事件标记。 对于中断其附加的活动的多重事件,事件的边界是实线的(参见右上图)。注意,如果使用此表示法,事件附加的活动的“cancelActivity”属性隐式设置为true。 对于不中断其附加的活动的多个事件,事件的边界为虚线(见右下图)。注意,如果使用此表示法,属性取消“cancelActivity”属性隐式设置为false。 | 中断 不中断 |
平行多重 | 这意味着有多个触发器。当附加到一个活动的边界时,事件只能“捕获”触发器。与普通的多重中间事件不同,该事件需要触发所有分配的触发器。事件标记将是一个镂空的加号(请参见右边的图形)。 对于并行多重中间事件,没有特定的事件定义(EventDefinition)子类(参见第259页)。如果中间事件具有多个关联的事件定义( EventDefinition),并且中间事件的多重属性(parallelMultiple)为真,则该事件将使用并行多事件标记显示。 对于中断其附加的活动的并行多事件,事件的边界是实线的(请参见右上图)。注意,如果使用此表示法,事件附加的活动的“cancelActivity”属性隐式设置为true。 对于不中断其所附加的活动的并行多重事件,事件的边界为虚线(请参见右下图)。注意,如果使用此表示法,事件附加的活动的“cancelActivity”属性隐式设置为false。 | 中断 不中断 |
边界事件的属性
对于边界事件,还存在以下附加属性:
●边界事件元素继承了捕获事件的属性和模型关联(请参见表8.44)。表8.46给出了边界事件元素的附加属性和模型关联。
表10.91-边界事件属性
属性名 | 描述/用途 |
attachedTo: Activity | 表示边界事件所附加到的活动。 |
cancelActivity: boolean | 表示是否应该取消活动,即边界捕获事件是作为错误还是升级。如果没有取消该活动,则该处理程序的多个实例可以并发地运行。此属性不能应用于错误事件(其中它始终为真)或补偿事件(其中它不适用)。 |
表10.92指定了取消活动属性。
表10.92-取消活动属性的可能值
触发器 | 取消活动属性的可能值 |
无类型 | 无,因为此事件不能附加到活动边框。 |
消息 | True/false |
计时器 | True/false |
升级 | True/false |
错误 | True |
取消 | True |
补偿 | 无值,因为过程已经执行完成,在触发补偿时不能再取消。 |
条件 | True/false |
信号 | True/false |
多重 | 如果所有事件触发器都允许此选项,则为True/false(有关详细信息,请参阅此表)。否则,限制更严格的选项,即,以使用任何错误或取消触发器。 |
活动边界连接
在以下条件下,中间事件可以附加到活动的边界:
◇(一个或多个)中间事件可以直接附加到活动的边界上。
◇要附加到活动的边界,中间事件必须是以下触发器之一(事件定义):消息、计时器、错误、升级、取消、补偿、条件、信号、多重和并行多重。
◇只有当子进程的事务处理属性设置为true时,具有取消触发器的中间事件才能附加到子进程边界。
序列流连接
请参阅第40页上的“序列流连接规则”,以了解整个对象集,以及它们如何成为序列流的源或目标。
◇如果中间事件附加到活动的边界:
◇中间事件不能是序列流的目标;它不能有一个传入的序列流。
◇中间事件必须是序列流的源。
◇多个序列流可能起源于一个中间事件。对于以中间事件为源的每个序列流,应生成一个新的并行路径。
◇一个例外:具有补偿触发器的中间事件不能具有传出序列流(它可能具有传出关联)。
◇具有以下触发器(事件定义)的中间事件可以在正常流中使用:无事件、消息事件、定时器事件、升级事件、补偿事件、条件事件、链接事件、信号事件、多重事件和并行多重事件。因此,以下内容不能不做:取消和错误。
如果在正常流中使用中间事件:
◇中间事件必须是序列流的目标。
↑注意:这是对BPMN 1.2语义的改变,它允许一些中间事件没有传入的序列流。
◇一个中间事件可能有多个传入的序列流。
注意:如果事件有多个传入的序列流,则认为这是不受控制的流。这意味着,当令牌从其中一个路径到达时,该事件将被启用(以捕获或抛出)。它不会等待来自其他路径的令牌的到来。如果另一个令牌来自同一路径或另一个路径,则将创建一个单独的事件实例。如果需要控制流,那么流应该与事件之前的网关收敛(有关网关的更多信息,请参见第286页)。
◇中间事件必须是序列流的源。
◇多个序列流可能起源于一个中间事件。对于以中间事件为源的每个序列流,应生成一个新的并行路径。
◇一个例外:源链接中间事件(如下定义如下),不需要具有传出序列流。
◇链路中间事件不能同时是序列流的目标和源。
要将链接中间事件的使用定义为“页外连接器”或“转到”对象:
◇链接中间事件可以是序列流的目标(目标链路)或源(源链路),但不能同时是目标和源。
◇如果有一个源链接,则必须有一个匹配的目标链接(它们具有相同的名称)。
◇对于一个目标链接,可能有多个源链接。
◇对于一个源链接,不能有多个目标链接。
消息流连接
请参阅第41页上的“消息流连接规则”,以了解整个对象集以及它们如何成为消息流的源或目标。
注意:所有的消息流都必须连接两个单独的池。它们可以连接到池边界或池边界内的流对象。它们不能在同一个池中连接两个对象。
◇消息中间事件可以是消息流的目标;它可以有一个传入的消息流。
◇消息中间事件可以是消息流的源;它可以有一个传出的消息流。
◇消息中间事件可能具有传入消息流或传出消息流,但不是两者都具有。
发表回复