1.BPMN2.0BPMN2.0规范是一个标准,开源框架和不同的供应商都遵循它,让最终用户不会依赖专有的解决方案,并被供应商“绑架”。有了BPMN2.0标准,不同解决方案之间的迁移变得非常简单顺畅。缺点是标准通常是不同观点广泛讨论和妥协的结果,有些结构或方法可能非常繁琐。Flowable在实现规范的基础上扩展了它的功能和可用性。自定义扩展在标准方法的基础上进行了简化。所以当你决定使用自定义扩展时,你仍然可以使用标准方式。使用自定义扩展时,始终使用flowable:命名空间前缀来清楚地标识XML元素、属性等。Flowable引擎还支持activiti:命名空间前缀。注:官方文档中已经详细介绍了开始和结束事件,为英文版。开始和结束事件是流程中很重要的内容,现在我们来总结一下。二、启动事件启动事件(startevent)是流程的起点。开始事件在XML中,类型由子元素声明定义。在触发特定触发器之前,启动事件将保持挂起状态。启动事件是细线图形。2.1NoneStartEvent2.1.1描述NoneStartEvent是指用户在没有指定触发器的情况下调用的启动事件。2.1.2图示空启动事件用空心圆圈表示,中间没有图标(即没有触发器)。2.1.3XML表示空开始事件的XML表示格式是普通的开始事件声明,没有任何子元素(其他类型的开始事件都有子元素来声明它们的类型)。2.1.4使用方法:ProcessInstanceprocessInstance=runtimeService.startProcessInstanceByXXX();2.1.5自定义扩展formKey:指表单定义,用户需要填写启动表格。(目前只需要知道start事件可以绑定到窗体,具体在窗体章节讲解。)2.2定时器启动事件2.2.1说明定时器启动事件(timerstartevent)在指定时间内创建一个或多个流程实例。定时器启动事件,在部署流程时开始计时。它会在不调用startProcessInstanceByXXX的情况下启动。当调用startProcessInstanceByXXX时,除了预定的启动之外,还会启动一个额外的进程。在部署具有计时器启动事件的流程的较新版本时,先前版本的计时器作业将被删除。这是因为通常不希望旧版本的流程仍然自动启动新的流程实例。2.2.2图示一个定时器启动事件,用圆圈表示,圆圈内有一个时钟图标。2.2.3XML表示定时器启动事件的XML表示格式为普通启动事件声明加上定时器定义子元素。计时器定义必须且只能包含以下元素之一:timeDate。此元素指定ISO8601格式的固定时间。这时触发器触发。例如:2022-01-11T12:13:14timeDuration。要定义计时器在触发前需要等待多长时间,请使用ISO8601格式(BPMN2.0规范要求)。例如(等待10天):P10DtimeCycle。指定重复周期,可用于定期启动该过程。例如(重复启动3次,每次间隔10小时,在指定时间重复结束):R3/PT10H/2022-01-12T23:59:59+00:00也可以使用变量,如${EndDate}R3/PT10H/${EndDate}2.3消息开始事件2.3.1说明消息启动事件(messagestartevent)启动一个带有命名消息的流程实例。消息名称用于定位指定的启动事件。在部署具有一个或多个消息启动事件的流程定义时,会进行如下判断:一个流程定义不得包含多个同名的消息启动事件。在一个流程定义中,如果一个或多个消息启动事件引用了另一个已部署的流程定义中消息启动事件的消息名称,则会抛出异常。流程版本:部署新版本的流程定义时,会取消之前版本的消息订阅,即使新版本不存在消息事件。2.3.2示意图消息开始事件用圆圈表示,圆圈内有消息事件标志。此标志未填充以指示捕获(接收)行为。2.3.3XML表示消息启动事件的XML表示格式,在通用启动事件声明中添加messageEventDefinition子元素:...2.3.4用法启动流程实例时,您可以使用以下RuntimeService中的方法触发消息启动事件:ProcessInstancestartProcessInstanceByMessage(StringmessageName);ProcessInstancestartProcessInstanceByMessage(StringmessageName,MapprocessVariables);ProcessInstancestartProcessInstanceByMessage(StringmessageName,StringbusinessKey,Map2.4.4用法Signals可以由流程实例中的信号抛出中间事件(intermediarysignalthrowevent),或者API(runtimeService.signalEventReceivedXXX方法)触发。这两种方法都将启动具有相同名称信号启动事件的所有流程定义。请注意,您可以选择异步或同步启动流程实例。需要传递给API的signalName是由信号元素的name属性确定的名称。信号元素由signalEventDefinition的signalRef属性引用。注意:消息和信号的区别:消息是一对一的,一条消息只能启动一个流程事件。信号是全局的和广播的,一个信号可以启动多个进程事件。2.5异常启动事件2.5.1描述?一个异常启动事件(errorstartevent),可以用来触发一个事件子流程(EventSub-Process)。异常启动事件不能用于启动流程实例。2.5.2图解异常启动事件用圆圈表示,圆圈内有异常事件标志。此标志未填充以指示捕获(接收)行为。2.5.3XML表示异常启动事件的XML表示格式,在通用启动事件声明中加入errorEventDefinition子元素:3.结束事件end结束事件标志着流程或子流程中分支的结束。结束事件总是抛出(类型)事件。这意味着当流程执行到结束事件时,将抛出一个结果。结果类型由事件内的黑色图标指示。在XML表示中,类型由子元素声明给出。3.1无结束事件3.1.1说明无结束事件(noneendevent),表示到达该事件时,没有抛出指定的结果。因此,引擎只会结束当前的执行分支。3.1.2图示空结束事件,用粗圆圈表示,里面没有图标(没有结果类型)。3.1.3XML表示空事件的XML表示格式是一个普通的结束事件声明,没有任何子元素(其他类型的结束事件都有子元素来声明它们的类型)。3.2异常结束事件3.2.1说明当流程执行到异常结束事件(error结束事件)时,当前分支执行结束并报错被抛出。3.2.2图异常结束事件事件由一个标准的结束事件(粗圆圈)表示,里面有一个异常图标。异常图标全黑,代表抛出的意思。3.2.3XML表示异常结束事件表示为结束事件,加上errorEventDefinition子元素:errorRef属性可以引用一个错误定义进程外元素:......error的errorCode用于查找匹配的异常捕获边界事件。如果errorRef不匹配任何已定义的错误,则errorRef将用作errorCode的快捷方式。此快捷方式特定于Flowable。下面的代码片段在功能上是相同的。......。..与以下代码功能相同请注意errorRef必须符合BPMN2.0规范。3.3Terminate结束事件3.3.1说明当到达terminate结束事件(terminateendevent)时,当前流程实例或子流程将被终止。也就是说,当执行到达terminate结束事件时,第一个作用域(流程或子流程)被评估并终止。请注意,在BPMN2.0中,子流程可以是嵌入式子流程、调用活动、事件子流程或事务性子流程。有一个通用规则:当调用过程或嵌入子流程有多个实例时,只有一个实例会被终止,其他实例和流程实例不受影响。可以添加可选属性terminateAll。为真时,(根)流程实例将被终止,无论终止结束事件位于流程定义中的何处,也无论它是否在子流程(甚至嵌套子流程)中。3.3.2图终止一个结束事件由一个标准的结束事件(粗圆圈)表示,里面有一个全黑的圆圈。3.3.4XML表示terminate结束事件,表示为结束事件,加上terminateEventDefinition子元素。请注意,terminateAll属性是可选的(默认为false)。3.4取消结束事件3.4.1描述事务子流程)。当到达取消结束事件时,抛出取消事件并且必须被取消边界事件捕获。取消边界事件会取消交易并触发补偿。3.4.2图显示取消结束事件用标准的结束事件(粗圈)表示,里面有一个取消图标。取消图标全黑,代表抛出的意思3.4.3XML代表取消结束事件,表示为结束事件,加上cancelEventDefinition子元素。4.总结理论是实践的基础。本文总结了BPMN2.0规范和Flowable扩展下的起止事件,为后面的实战做准备。