Activiti之《BPMN2分析》

来源:互联网 发布:淘宝网什么东西最火 编辑:程序博客网 时间:2024/06/01 09:36

BPMN:业务流程建模表示法。

一、流对象

流对象是定义业务流程的主要元素,是流程图的节点对象。有三种流对象:事件,活动,网关。

事件

事件用来表明流程生存期间发生的事情。在BPMN 2.0中, 事件有两大分类:捕获(catching) 或 触发(throwing) 事件。

  • 捕获(Catching):当流程执行到事件, 它会等待被触发。触发的类型是由内部图表或XML中的类型声明来决定的。 捕获事件与触发事件在显示方面是根据内部图表是否被填充来区分的(白色)。

  • 触发(Throwing):当流程执行到事件, 会触发一个事件。触发的类型是由内部图表或XML中的类型声明来决定的。 触发事件与捕获事件在显示方面是根据内部图表是否被填充来区分的(黑色)。

事件定义

事件定义决定了事件的语义。如果没有事件定义,这个事件就不做什么特别的事情。

定时器事件定义

定时器事件是由指定的时间触发的事件。可用于开始事件,中间事件或边界事件。

错误事件定义

错误事件是由指定错误触发的事件。

信号事件定义

信号事件是引用一个命名信号的事件。信号是全局范围的事件(广播语义)。 会发送给所有激活的处理器。

消息事件定义

消息事件是引用一个命名消息的事件。每个消息都有名称和内容。与信号不同,消息事件总会直接发送给一个接收者。

开始事件

开始事件表明流程在哪里开始。开始事件的类型(流程在接收事件时启动, 还是在指定时间启动,等等),定义了流程如何启动。 在XML中,这些类型是通过声明不同的子元素来区分的。

 

开始事件都是捕获事件: 最终这些事件都是(一直)等待着,直到对应的触发时机出现。

空开始事件

空开始事件技术上意味着没有指定启动流程实例的触发条件。 也就是说引擎不能预计什么时候流程实例会启动。 空开始事件用于,当流程实例要通过API启动的场景, 通过调用startProcessInstanceByXXX方法。

ProcessInstance processInstance = runtimeService.startProcessInstanceByXXX();

 

注意: 子流程总是有一个空开始事件。

定时开始事件

定时开始事件用来在指定的时间创建流程实例。 它可以用于只启动一次的流程和在特定时间间隔启动多次的流程。

注意:子流程不能使用定时开始事件。

注意:定时开始事件在流程发布后就会开始计算时间。 不需要调用startProcessInstanceByXXX,虽然也可以调用启动流程的方法, 但是那会导致调用startProcessInstanceByXXX时启动过多的流程。

注意:当包含定时开始事件的新版本流程部署时, 对应的上一个定时器就会被删除。这是因为通常不希望自动启动旧版本流程的流程实例。

消息开始事件

消息开始事件可以使用一个命名的消息来启动流程实例。 这样可以帮助我们使用消息名称来选择正确的开始事件。

部署包含一个或多个消息开始事件的流程定义时,需要考虑下面的条件:

  • 消息开始事件的名称在给定流程定义中不能重复。流程定义不能包含多个名称相同的消息开始事件。 如果两个或以上消息开始事件应用了相同的事件,或两个或以上消息事件引用的消息名称相同,activiti会在发布流程定义时抛出异常。

  • 消息开始事件的名称在所有已部署的流程定义中不能重复。 如果一个或多个消息开始事件引用了相同名称的消息,而这个消息开始事件已经部署到不同的流程定义中, activiti就会在发布时抛出一个异常。

  • 流程版本:在发布新版本的流程定义时,之前订阅的消息订阅会被取消。 如果新版本中没有消息事件也会这样处理。

信号开始事件

信号开始事件,可以用来通过一个已命名的信号来启动一个流程实例。 信号可以在流程实例内部使用“中间信号抛出事务”触发, 也可以通过API(runtimService.signalEventReceivedXXX 方法)触发。两种情况下, 所有流程实例中拥有相同名称的信号开始事件都会启动。

注意,在两种情况下,都可以选择同步或异步的方式启动流程实例。

必须向API传入signalName, 这是signal元素的name属性值, 它会被signalEventDefinitionsignalRef属性引用。

错误开始事件

错误开始事件可以用来触发一个事件子流程。 错误开始事件不能用来启动流程实例

错误开始事件总是中断。

结束事件

结束事件表示(子)流程(分支)的结束。 结束事件都是触发事件。 这是说当流程达到结束事件,会触发一个结果。 结果的类型是通过事件的内部黑色图标表示的。 在XML内容中,是通过包含的子元素声明的。

空结束事件

空结束事件意味着到达事件时不会指定抛出的结果。 这样,引擎除了结束当前执行的分支,不会做其他事情。

错误结束事件

当流程执行到错误结束事件, 流程的当前分支就会结束,并抛出一个错误。 这个错误可以被对应的中间边界错误事件捕获。 如果找不到匹配的边界错误事件,就会抛出一个异常。

终止结束事件

当到达终止结束事件时,当前流程实例或子流程将终止。从概念上讲,当执行到达终止结束事件时,第一个作用范围(流程或子流程)将被确定并结束。注意在BPMN 2.0,子流程可以是嵌入的子流程,调用活动,事件子流程或事务子流程。本规则一般适用于:比如有多实例调用活动或嵌入的子流程,只有范围内的实例将结束,其他实例和流程实例都不受影响。

取消结束事件

取消结束事件只能与BPMN事务子流程结合使用。 当到达取消结束事件时,会抛出取消事件,它必须被取消边界事件捕获。 取消边界事件会取消事务,并触发补偿机制。

边界事件

边界事件都是捕获事件,它会附在一个活动上。 (边界事件不可能触发事件)。这意味着,当活动运行时, 事件会监听对应的触发类型。 当事件被捕获,活动就会中断, 同时执行事件的后续连线。

边界事件是附着在活动上的捕获事件(边界事件决不能触发)。这意味着,当活动运行时,事件会监听某种类型的触发。当事件被捕获,活动就会中断,跟随事件流出的序列流继续执行。

定时边界事件

定时边界事件充当秒表和闹钟。当执行到达附在边界事件的活动时,定时器就启动了。当定时器触发(例如在指定间隔之后),活动中断,跟随边界事件的流出继续执行。

错误边界事件

错误边界事件,它会捕获活动范围内抛出的错误。

定义一个错误边界事件,大多用于内嵌子流程, 或调用活动,对于子流程的情况,它会为所有内部的活动创建一个作用范围。 错误是由错误结束事件触发的。 这个错误会传递给上层作用域,直到找到一个错误事件匹配的边界错误事件。

当捕获了错误事件时,边界事件绑定的活动就会销毁, 也会销毁内部所有的执行分支 (比如,同步节点,内嵌子流程,等等)。 流程执行会沿着边界事件的流出序列流继续执行。

信号边界事件

信号边界事件, 它会捕获一个命名的信号。

注意:与错误边界事件等其他事件不同,信号边界事件不仅捕获附加在其作用域上的信号事件。相反,信号事件具有全局范围(广播语义),这意味着信号可以从任何位置触发,甚至来自不同的流程实例。

注意:与其他事件不同,如错误事件,信号在被捕获时不会被消费。如果有两个活动的信号边界事件捕获相同的信号事件,则触发两个边界事件,即使它们是不同流程实例的一部分。

消息边界事件

消息边界事件,它会捕获一个命名的消息。

取消边界事件

取消边界事件, 当事务取消时触发。当取消边界事件触发时,首先中断当前作用域的所有执行。 然后开始补偿事务内的所有激活的补偿边界事件。 补偿是同步执行的。例如,离开事务栈,边界事务会等待补偿执行完毕。 当补偿完成后,事务子流程会沿着取消边界事件的流出序列流继续执行。

注意:每个事务子流程只能有一个取消边界事件。

注意:如果事务子流程包含内嵌子流程,补偿只会触发已经成功完成的子流程。

注意:如果取消边界子流程对应的事务子流程配置为多实例, 如果一个实例触发了取消,就会取消所有实例。

补偿边界事件

  • 补偿触发时,补偿边界事件对应的补偿处理器会调用相同次数,根据它对应的节点的成功次数。

  • 如果补偿边界事件关联到多实例节点, 补偿事件会订阅每个实例。

  • 如果补偿边界事件关联的节点中包含循环, 补偿事件会在每次节点执行时进行订阅。

  • 如果流程实例结束,订阅的补偿事件都会结束。

补偿边界事件,可用于将补偿处理程序附加到活动。

补偿边界事件必须直接引用一个补偿处理程序。

补偿边界事件与其他边界事件有不同的激活策略。其他边界事件,例如信号边界事件,在它们连接到的活动开始时被激活。当活动结束时,它们将被停用,相应的事件订阅也被取消。补偿边界事件是不同的。当附加的活动成功完成时,补偿边界事件被激活。此时,将创建对应于补偿事件的订阅。当触发补偿事件或相应的流程实例结束时,订阅将被删除。由此,它遵循:

  • 当触发补偿时,与补偿边界事件相关联的补偿处理程序被调用的次数与所附的活动成功完成的次数相同。
  • 如果将补偿边界事件附加到具有多个实例特性的活动中,则为每个实例创建补偿事件订阅。
  • 如果将补偿边界事件附加到包含在循环中的活动中,则每次执行活动时都会创建补偿事件订阅。
  • 如果流程实例结束,则取消对补偿事件的订阅。

注:补偿边界事件不支持内嵌子流程。

中间捕获事件

所有中间捕获事件都使用同样的方式定义:

<intermediateCatchEvent id="myIntermediateCatchEvent" >      <XXXEventDefinition/></intermediateCatchEvent>

 

中间捕获事件的定义包括

  • 唯一标识(流程范围内)

  • 一个结构为XXXEventDefinition的XML子元素 (比如TimerEventDefinition等) 定义了中间捕获事件的类型。参考特定的捕获事件类型, 获得更多详情。

定时中间捕获事件

定时中间事件充当秒表。当执行到达捕获事件活动时,启动定时器。当定时器触发(例如在指定的间隔之后),则跟随定时中间事件流出的序列流继续执行。

信号中间捕获事件

信号中间捕获事件,它会捕获一个命名的信号。

消息中间捕获事件

消息中间捕获事件,它会捕获一个命名的消息。

中间触发事件

所有中间触发事件的定义都是同样的:

<intermediateThrowEvent id="myIntermediateThrowEvent" >      <XXXEventDefinition/></intermediateThrowEvent>

 

中间触发事件定义包含

  • 唯一标识(流程范围)

  • 使用格式为XXXEventDefinition的XML子元素 (比如signalEventDefinition等) 定义中间触发事件的类型。 参考对应触发事件的类型,了解更多信息。

中间触发空事件

引擎不会为这个事件做任何事情, 它直接通过。

信号中间触发事件
为定义的信号触发一个信号事件。

补偿中间触发事件

用于触发补偿。

活动

活动是在业务流程执行过程中执行的工作。活动有两种类型:任务和子流程。

用户任务

脚本任务

java服务任务

web service 任务

业务规则任务

邮件任务

Mule任务

Camel任务

手工任务

java接收任务

Shell任务

执行监听器

任务监听器

多实例(循环)

补偿处理器

子流程

事件子流程

事务子流程

调用活动(子流程)

网关

用于控制业务流程的分支与合并。

排他网关

并行网关

包含网关

基于事件网关

二、连接对象

连接对象用来把各个流对象或流对象与其他信息连接起来。有三种连接对象:序列流,消息流,关联。

序列流

序列流表示流对象的先后执行顺序。

条件序列流

可以为序列流定义一个条件。离开一个活动时,默认会计算流出序列流的条件。如果条件结果为true,就会选择流出序列流继续执行。当多条序列流被选中时, 就会创建多条分支, 流程会以并行方式继续执行。

 

默认序列流

所以任务和网关都可以设置一个默认序列流。

消息流

消息流表示业务参与者之间发送和接收的消息流动。

关联

关联用于将相关的数据、文本和其它人工信息与流对象联系起来。

三、泳道

泳道用于描述不同业务参与者的功能和职责。泳道包含两种:池和道。

池用于描述业务流程的一个参与者,可以看做是将一系列活动区别于其它池的一个容器。

池与池之间的交互只能使用消息流表示。

道就是在池里面再细分,可以是垂直的也可以是水平的。道也是用于组织和分类活动。

四、人工制品

人工制品作为信息备注,添加到建模的业务流程上下文中,便于人员理解。有三种人工制品:数据对象,组,注释。

数据对象

数据对象用来表示一个活动如何产生和使用数据的,它们通过关联与活动连接起来。

组用于记录或分析的目的,但不影响序列流。

注释

注释是建模人员为业务流程的读者提供附加文本信息的机制。


原创粉丝点击