10.3.2.2
事件
在基本元素一节中,我们知道,对一个事件来说,通常会有产生该事件的原因(触发器)和该事件所产生的影响(结果)。在本节中,我们将更加具体的讨论事件的行为,事件有两种行为:捕获触发器和抛出结果。
事件可以由触发器来指出产生该事件的原因,我们使用一个嵌入事件图形内部的图标来标识不同的触发器,存在不同种类的触发器,事件可以捕获触发器。
事件可以由结果来指出该事件所产生的影响,和触发器一样,我们使用一个嵌入事件图形内部的图标来标识不同的结果,事件可以抛出结果。
图10-32捕获事件与抛出事件
捕获事件等待它所指定的触发器并在捕获后产生Token;抛出事件等待Token并在捕获后产生一个结果。
图10-33消息开始事件与消息结束事件
核心开始事件
开始事件启动一个流程的新案例,它只有一个唯一的输出顺序流,没有输入顺序流。当它被触发后,会产生一个Token并顺着它的输出顺序流传出,有多种触发器可以触发开始事件,例如到一个预定的时间(定时触发器)、收到一个特定的消息(消息触发器)、收到一个特定的信号(信号触发器)等等。注意,开始事件只能捕获触发器不能抛出结果。
有3种核心开始事件:
- 定时开始事件(TimerStart Event):当满足时间条件时产生Token;
- 消息开始事件(MessageStart Event):当接受到特定的消息后产生Token;
- 信号开始事件(SignalStart Event):当接受到特定的信号后产生Token。
图10-34核心开始事件
当满足设定的时间条件时,定时开始事件被触发。有多种设定时间条件的方式:指定一个特定的时间点,例如明天早上9点;指定一个时间间隔,例如两周后;指定一个周期性的时间,例如每天晚上12点开始运行所有的自动化测试。
图10-35定时开始事件
消息开始事件和信号开始事件都是接受到特定的数据(消息/信号)后产生Token,它们的区别是什么呢?区别在于消息是一对一的,数据的发送和接受是点对点的形式;而信号是一对多的,数据的发送是广播的形式。
消息开始事件从流程外部参与者接受消息,并启动一个案例。
图10-36消息开始事件
信号开始事件从流程外部参与者或外部流程订阅信号,接受并启动一个案例。
图10-37信号开始事件
核心结束事件
结束事件可以结束其所在分支的执行,也可以结束整个案例,同时,可以产生并抛出一个结果,例如发送一个消息或信号。它只有输入顺序流,没有输出顺序流。注意,结束事件只能抛出结果不能捕获触发器。
有3种核心结束事件:
- 消息结束事件(MessageEnd Event):结束所在分支的执行并发送一个消息;
- 信号结束事件(SignalEnd Event):结束所在分支的执行并广播一个信号;
- 终止结束事件(TerminateEnd Event):结束整个案例的执行。
图10-38核心结束事件
消息结束事件接受一个Token,结束所在分支的执行,给指定的外部流程或参与者发送一个消息。
图10-39消息结束事件
信号结束事件接受一个Token,结束所在分支的执行,广播一个消息,所有对该信号感兴趣的流程和参与者都可以订阅并采取各自的行动。例子请参考图10-37。
终止结束事件结束整个案例的执行。当案例到达某个状态即意味着案例执行结束了,案例中如果存在正在执行的任务,这些任务被取消,这个状态由终止结束事件代表。终止结束事件实现了工作流控制模式里的显式结束(WCP_43)模式,具体该模式的描述请参考本书的工作流模式附录部分。
图10-40终止结束事件
核心即时事件
在开始事件和结束事件之间发生的事件称为即时事件,即时事件会影响流程的流转,但不会启动或直接终止流程的执行。即时事件即可以捕获触发器又可以抛出结果。
有两种使用即时事件的方式,第一种是将事件使用在流程顺序流中:
图10-41使用在流程顺序流中的即时事件
当事件使用在流程顺序流中时,事件既可以捕获触发器又可以抛出结果。当事件捕获触发器时,它首先等待一个Token,当Token到达后,它再等待一个触发器,当触发器被捕获后,它执行完毕,向后传递Token;当事件抛出结果时,它首先等待一个Token,当Token到达后,它抛出一个结果,然后执行完毕,如果存在输出顺序流的话就向后传递Token。
第二种是将事件附加在任务或子流程的边界上,此时的事件只能捕获触发器,根据捕获触发器后的不同行为边界事件又分为两种:边界中断事件和边界非中断事件。
图10-42边界中断事件
当在任务1执行过程中,如果边界中断事件捕获了触发器,那么任务1将被停止执行,转为执行任务3;如果边界中断事件没有捕获触发器,那么任务1正常执行,然后执行任务2。
图10-43边界非中断事件
当在任务1执行过程中,如果边界非中断事件捕获了触发器,那么任务1不会被停止执行,只是我们同时开始执行任务3,任务1完成后正常触发任务2;如果边界中断事件没有捕获触发器,那么任务1正常执行,然后执行任务2,任务3不会触发。我们使用虚线来标识这是一个非中断事件。
有4种核心即时事件:
- 普通即时事件(None IntermediateEvent):只支持使用在流程顺序流中,什么都不做立刻触发;
- 定时即时事件(Timer IntermediateEvent):支持使用在流程顺序流中捕获触发器,支持附加在任务/子流程边界上中断和非中断任务/子流程执行,满足时间条件时触发;
- 消息即时事件(MessageIntermediate Event):支持使用在流程顺序流中捕获触发器和抛出结果,支持附加在任务/子流程边界上中断和非中断任务/子流程执行,发送消息或等待消息触发;
- 信号即时事件(SignalIntermediate Event):支持使用在流程顺序流中捕获触发器和抛出结果,支持附加在任务/子流程边界上中断和非中断任务/子流程执行,广播信号或等待信号触发。
图10-44核心即时事件
普通即时事件收到Token后立刻触发,什么都不做,继续向后传递Token。我们使用普通即时事件来标识案例执行到一个特定的状态点或里程碑。
我们使用定时即时事件有两种用途:为任务限定期限以及为有时间要求的任务进行时间延迟。
图10-45定时即时事件
我们使用消息和信号即时事件对任务执行过程中的消息/信号进行处理,我们也使用它们向外发送消息/信号。
图10-46消息/信号即时事件 |