做过实际业务流程设计的人都知道,正常的、没有例外和出错处理的流程是最容易建模的。(所以正常的流程又称为happy flow)
处理流程中的例外和错误是流程建模中比较难的一部分。如果建模规范或语言对此支持好,使用起来自然会省力很多。
BPMN 2.0之前,已专门有Boundary Event(边界事件)来处理例外和错误,而BPMN 2.0规范中又新加了Event Sub-Process(事件子流程),用于非正常(例外)流程的处理。
事件子流程是设置为“事件触发(triggeredByEvent)”的一类子流程,它们可以出现在流程或子流程中。因为事件子流程只处理例外或错误流程,因此不能够有流入(incoming)或流出(outgoing)Sequence Flows。
下图中的流程包含了两个事件子流程:
[img]http://www.bpmn123.net/studio/ShenJ/share/event_sub_process_1.png[/img]
事件子流程和一般子流程在图形表现上的区别是:事件子流程的边界是虚线。
事件子流程必须有一个(且只能有一个)Start Event,同时这个Start Event的触发类型不能为空(None),必须是以下7种触发类型或它们的组合:
补偿(Compensation),升级(Escalation),错误(Error),消息(Message),信号(Signal),条件(Conditional),定时(Timer)。
当事件子流程包含的Start Event被触发时,事件子流程就启动了。
事件子流程启动后,它的父流程是终止还是继续运行呢? 这是由事件子流程的Start Event是否标注为“中断”决定的。
如果Start Event标注为中断(Start Event表现为实线的圆圈,如上图中第二个事件子流程),则事件子流程启动后,父流程终止;
如果Start Event没有标注为中断(Start Event表现为虚线的圆圈,如上图中第一个事件子流程),则事件子流程启动后,父流程继续运行。
事件子流程中的Start Event只在父流程开始运行后才开始监听触发事件,在父流程结束时停止监听。如果父流程有监听相同触发事件的边界事件,则事件子流程优先于边界事件,即事件子流程先捕获到触发事件。
如下图,事件子流程和边界事件监听同一个错误。当错误发生时,事件子流程被触发,对应的边界事件不会被触发。事件子例程处理完后,流程从父流程的正常Sequence flow流出(即图中上面的flow):
[img]http://www.bpmn123.net/studio/ShenJ/share/event_sub_process_3.png[/img]
事件子流程中也可以选择抛出捕获的事件或其他事件,从而触发父流程对应的边界事件。如下图,如果事件子流程选择抛出Error_1事件,父流程的边界事件将被触发,整个流程将在End_2结束,否则流程在End_1结束:
[img]http://www.bpmn123.net/studio/ShenJ/share/event_sub_process_4.png"[/img]
事件子例程可以是展开的,也可以是合拢的,如下图:
[img]http://www.bpmn123.net/studio/ShenJ/share/event_sub_process_2.png"[/img]
合拢的事件子流程在它的左上角显示内部Start Event标注。
事件子流程和包含它的父流程运行于同一个流程上下文(context),也就是事件子流程运行时可以直接访问父流程中的数据。
处理流程中的例外和错误是流程建模中比较难的一部分。如果建模规范或语言对此支持好,使用起来自然会省力很多。
BPMN 2.0之前,已专门有Boundary Event(边界事件)来处理例外和错误,而BPMN 2.0规范中又新加了Event Sub-Process(事件子流程),用于非正常(例外)流程的处理。
事件子流程是设置为“事件触发(triggeredByEvent)”的一类子流程,它们可以出现在流程或子流程中。因为事件子流程只处理例外或错误流程,因此不能够有流入(incoming)或流出(outgoing)Sequence Flows。
下图中的流程包含了两个事件子流程:
[img]http://www.bpmn123.net/studio/ShenJ/share/event_sub_process_1.png[/img]
事件子流程和一般子流程在图形表现上的区别是:事件子流程的边界是虚线。
事件子流程必须有一个(且只能有一个)Start Event,同时这个Start Event的触发类型不能为空(None),必须是以下7种触发类型或它们的组合:
补偿(Compensation),升级(Escalation),错误(Error),消息(Message),信号(Signal),条件(Conditional),定时(Timer)。
当事件子流程包含的Start Event被触发时,事件子流程就启动了。
事件子流程启动后,它的父流程是终止还是继续运行呢? 这是由事件子流程的Start Event是否标注为“中断”决定的。
如果Start Event标注为中断(Start Event表现为实线的圆圈,如上图中第二个事件子流程),则事件子流程启动后,父流程终止;
如果Start Event没有标注为中断(Start Event表现为虚线的圆圈,如上图中第一个事件子流程),则事件子流程启动后,父流程继续运行。
事件子流程中的Start Event只在父流程开始运行后才开始监听触发事件,在父流程结束时停止监听。如果父流程有监听相同触发事件的边界事件,则事件子流程优先于边界事件,即事件子流程先捕获到触发事件。
如下图,事件子流程和边界事件监听同一个错误。当错误发生时,事件子流程被触发,对应的边界事件不会被触发。事件子例程处理完后,流程从父流程的正常Sequence flow流出(即图中上面的flow):
[img]http://www.bpmn123.net/studio/ShenJ/share/event_sub_process_3.png[/img]
事件子流程中也可以选择抛出捕获的事件或其他事件,从而触发父流程对应的边界事件。如下图,如果事件子流程选择抛出Error_1事件,父流程的边界事件将被触发,整个流程将在End_2结束,否则流程在End_1结束:
[img]http://www.bpmn123.net/studio/ShenJ/share/event_sub_process_4.png"[/img]
事件子例程可以是展开的,也可以是合拢的,如下图:
[img]http://www.bpmn123.net/studio/ShenJ/share/event_sub_process_2.png"[/img]
合拢的事件子流程在它的左上角显示内部Start Event标注。
事件子流程和包含它的父流程运行于同一个流程上下文(context),也就是事件子流程运行时可以直接访问父流程中的数据。