乐趣区

关于工作流:Flowable实战四BPMN20-启动与结束事件

一、BPMN2.0

  BPMN2.0 标准是一个规范,开源框架和不同供应商都遵循这份规范,使得最终用户不会因为依赖专有解决方案,而被供应商“绑架”。有了 BPMN2.0 规范,不同解决方案之间的迁徙,变得非常简略平滑。

  毛病则是规范通常是不同观点大量探讨与斗争的后果,有些构造或办法会非常轻便。Flowable 在实现标准的根底上进行了性能和应用性扩大。

  • 自定义扩大是在规范形式的根底上进行简化。因而当你决定应用自定义扩大时,依然能够用规范形式。
  • 应用自定义扩大时,总是通过 flowable: 命名空间前缀,明确标识出 XML 元素、属性等。
  • Flowable 引擎也反对 activiti: 命名空间前缀。

  注:在官网文档中,启动和完结事件已有较具体的介绍,是英文版。启动和完结事件是流程里重要的内容,当初做个汇总整顿。

二、启动事件

  启动事件(start event)是流程的终点。

  • 启动事件在 XML 中,类型由子元素申明来定义。
  • 启动事件放弃等待状态,直到特定的触发器被触发。
  • 启动事件是细线图形。

2.1 空启动事件

2.1.1 形容

  空启动事件(none Start Event),指的是未指定触发器,由用户调用的启动事件。

2.1.2 图示

  空启动事件用空心圆圈示意,两头没有图标(也就是说,没有触发器)。

2.1.3 XML 示意

  空启动事件的 XML 示意格局,就是一般的启动事件申明,而没有任何子元素(其余品种的启动事件都有用于申明其类型的子元素)。

    <startEvent id="start" name="my start event" />

2.1.4 应用办法:

    ProcessInstance processInstance = runtimeService.startProcessInstanceByXXX();

2.1.5 自定义扩大

  formKey: 援用表单定义,用户须要在启动时填写的表单。(目前只需理解到启动事件能够绑定表单即可,具体内容在表单章节中解说。)

    <startEvent id="request" flowable:formKey="simpleForm" />

2.2 定时器启动事件

2.2.1 形容

  定时器启动事件(timer start event)在指定工夫内创立一次或屡次的流程实例。

  • 定时器启动事件,在流程部署的同时就开始计时。不须要调用 startProcessInstanceByXXX 就会在工夫启动。调用 startProcessInstanceByXXX 时会在定时启动之外额定启动一个流程。
  • 当部署带有定时器启动事件的流程的更新版本时,上一版本的定时器作业会被移除。这是因为通常并不心愿旧版本的流程依然主动启动新的流程实例。

2.2.2 图示

  定时器启动事件,用其中有一个钟表图标的圆圈来示意。

2.2.3 XML 示意

  定时器启动事件的 XML 示意格局,是一般的启动事件申明加上定时器定义子元素。

定时器定义必须且只能蕴含下列的一种元素:

  • timeDate。这个元素指定了 ISO 8601 格局的固定工夫。在这个工夫就会触发触发器。例如:
    <timerEventDefinition>
        <timeDate>2022-01-11T12:13:14</timeDate>
    </timerEventDefinition>
  • timeDuration。要定义定时器须要期待多长时间再触发,同样应用 ISO 8601 格局(BPMN 2.0 标准要求)。例如(期待 10 天):
    <timerEventDefinition>
        <timeDuration>P10D</timeDuration>
    </timerEventDefinition>
  • timeCycle。指定反复周期,可用于周期性启动流程。例如(反复三次启动,每次距离为 10 小时,到指定工夫时完结反复):

        <timerEventDefinition>
            <timeCycle>R3/PT10H/2022-01-12T23:59:59+00:00</timeCycle>
        </timerEventDefinition>

    也能够应用变量,如${EndDate}

        <timerEventDefinition>
            <timeCycle>R3/PT10H/${EndDate}</timeCycle>
        </timerEventDefinition>

2.3 音讯启动事件

2.3.1 形容

  音讯启动事件(message start event)应用具名音讯启动流程实例。音讯名用于定位指定的启动事件。

  当 部署 具备一个或多个音讯启动事件的流程定义时,会做如下判断:

  • 一个流程定义不得蕴含多个同名的音讯启动事件。
  • 在流程定义中,一个或多个音讯启动事件援用了曾经部署的另一流程定义中音讯启动事件的音讯名,则会抛出异样。
  • 流程版本:在部署流程定义的新版本时,会勾销上一版本的音讯订阅,即便新版本中并没有这个音讯事件。

2.3.2 图示

  音讯启动事件用其中有一个音讯事件标记的圆圈示意。这个标记并未填充,用以示意捕捉(接管)行为。

2.3.3 XML 示意

  音讯启动事件的 XML 示意格局,为一般启动事件申明加上 messageEventDefinition 子元素:

    <definitions id="definitions"
                 xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"
                 xmlns:flowable="http://flowable.org/bpmn"
                 targetNamespace="Examples"
                 xmlns:tns="Examples">

        <message id="newInvoice" name="newInvoiceMessage" />

        <process id="invoiceProcess">

            <startEvent id="messageStart" >
                <messageEventDefinition messageRef="tns:newInvoice" />
            </startEvent>
            ...
        </process>

    </definitions>

2.3.4 应用办法

  在 启动 流程实例时,能够应用下列 RuntimeService 中的办法,触发音讯启动事件:

    ProcessInstance startProcessInstanceByMessage(String messageName);
    ProcessInstance startProcessInstanceByMessage(String messageName, Map<String, Object> processVariables);
    ProcessInstance startProcessInstanceByMessage(String messageName, String businessKey,
        Map<String, Object< processVariables);

  messageName 是由 message 元素的 name 属性给定的名字。messageEventDefinition 的 messageRef 属性会援用 message 元素。

2.4 信号启动事件

2.4.1 形容

  信号启动事件(signal start event),应用具名信号启动流程实例。

2.4.2 图示

  信号启动事件用其中有一个信号事件标记的圆圈示意。这个标记并未填充,用以示意捕捉(接管)行为。

2.4.3 XML 示意

  信号启动事件的 XML 示意格局,为一般启动事件申明,加上 signalEventDefinition 子元素:

<signal id="theSignal" name="The Signal" />

<process id="processWithSignalStart1">
  <startEvent id="theStart">
    <signalEventDefinition id="theSignalEventDefinition" signalRef="theSignal"  />
  </startEvent>
  <sequenceFlow id="flow1" sourceRef="theStart" targetRef="theTask" />
  <userTask id="theTask" name="Task in process A" />
  <sequenceFlow id="flow2" sourceRef="theTask" targetRef="theEnd" />
  <endEvent id="theEnd" />
</process>

2.4.4 应用办法

  信号能够由流程实例中的信号抛出两头事件(intermediary signal throw event),或者 API(runtimeService.signalEventReceivedXXX办法)触发。

  两种形式都会启动所有领有雷同名字信号启动事件的流程定义。

  请留神能够抉择异步还是同步启动流程实例。

  须要为 API 传递的 signalName,是由 signal 元素的 name 属性决定的名字。signal 元素由 signalEventDefinition 的 signalRef 属性援用。

留神:音讯与信号的区别:音讯是一对一的,一个音讯只能启动一个流程事件。信号是全局的,广播式的,一个信号能够启动多个流程事件。

2.5 异样启动事件

2.5.1 形容

  异样启动事件(error start event),可用于触发事件子流程(Event Sub-Process)。谬误启动事件不能用于启动流程实例

2.5.2 图示

  异样启动事件用其中有一个异样事件标记的圆圈示意。这个标记并未填充,用以示意捕捉(接管)行为。

2.5.3 XML 示意

  异样启动事件的 XML 示意格局,为一般启动事件申明加上 errorEventDefinition 子元素:

    <startEvent id="messageStart" >
            <errorEventDefinition errorRef="someError" />
    </startEvent>

三、完结事件

  完结事件(end event)标记着流程或子流程中一个分支的完结。完结事件 总是抛出(型)事件 。这意味着当流程执行达到完结事件时,会抛出一个 后果。后果的类型由事件外部的彩色图标示意。在 XML 示意中,类型由子元素申明给出。

3.1 空完结事件

3.1.1 形容

  空完结事件 (none end event),意味着当达到这个事件时,没有特地指定抛出的 后果。因而,引擎除了完结以后执行分支之外,不会多做任何事件。

3.1.2 图示

  空完结事件,用其中没有图标(没有后果类型)的粗圆圈示意。

3.1.3 XML 示意

  空事件的 XML 示意格局为一般完结事件申明,没有任何子元素(其它品种的完结事件都有子元素,用于申明其类型)。

    <endEvent id="end" name="my end event" />

3.2 异样完结事件

3.2.1 形容

  当流程执行达到 异样完结事件(error end event)时,完结执行的以后分支,并抛出谬误。

3.2.2 图示

  异样完结事件事件用外部有一个异样图标的规范完结事件(粗圆圈)示意。异样图标是全黑的,代表抛出的含意。

3.2.3 XML 示意

  异样完结事件示意为完结事件,加上 errorEventDefinition 子元素:

    <endEvent id="myErrorEndEvent">
      <errorEventDefinition errorRef="myError" />
    </endEvent>

  errorRef属性能够援用在流程外定义的 error 元素:

    <error id="myError" errorCode="123" />
    ...
    <process id="myProcess">
    ...

  errorerrorCode 用于查找匹配的异样捕捉边界事件。如果 errorRef 不匹配任何已定义的 error,则该errorRef 会用做 errorCode 的快捷方式。这个快捷方式是 Flowable 特有的。上面的代码片段在性能上是雷同的。

    <error id="myError" errorCode="error123" />
    ...
    <process id="myProcess">
    ...
      <endEvent id="myErrorEndEvent">
        <errorEventDefinition errorRef="myError" />
      </endEvent>
    ...

  与上面的代码性能雷同

    <endEvent id="myErrorEndEvent">
      <errorEventDefinition errorRef="error123" />
    </endEvent>

  请留神 errorRef 必须听从 BPMN 2.0 标准。

3.3 终止完结事件

3.3.1 形容

  当达到 终止完结事件(terminate end event)时,以后的流程实例或子流程会被终止。也就是说,当执行达到终止完结事件时,会判断第一个 范畴 scope(流程或子流程)并终止它。请留神在 BPMN 2.0 中,子流程能够是嵌入式子流程,调用流动,事件子流程,或事务子流程。有一条通用规定:当存在多实例的调用过程或嵌入式子流程时,只会终止一个实例,其余的实例与流程实例不会受影响。

  能够增加一个可选属性 terminateAll。当其为true 时,无论该终止完结事件在流程定义中的地位,也无论它是否在子流程(甚至是嵌套子流程)中,都会终止(根)流程实例。

3.3.2 图示

  终止完结事件用外部有一个全黑圆的规范完结事件(粗圆圈)示意。

3.3.4 XML 示意

  终止完结事件,示意为完结事件,加上 terminateEventDefinition 子元素。

  请留神 terminateAll 属性是可选的(默认为false)。

    <endEvent id="myEndEvent >
      <terminateEventDefinition flowable:terminateAll="true"></terminateEventDefinition>
    </endEvent>

3.4 勾销完结事件

3.4.1 形容

  勾销完结事件(cancel end event)只能与 BPMN 事务子流程(BPMN transaction subprocess)一起应用。当达到勾销完结事件时,会抛出勾销事件,且必须由勾销边界事件(cancel boundary event)捕捉。勾销边界事件将勾销事务,并触发弥补(compensation)。

3.4.2 图示

  勾销完结事件用外部有一个勾销图标的规范完结事件(粗圆圈)示意。勾销图标是全黑的,代表抛出的含意。

3.4.3 XML 示意

  勾销完结事件,示意为完结事件,加上 cancelEventDefinition 子元素。

    <endEvent id="myCancelEndEvent">
      <cancelEventDefinition />
    </endEvent>

四、小结

  实践是实际的根底,本篇汇总 BPMN2.0 标准和 Flowable 扩大下的启动和完结事件,为前面的实战做筹备。

退出移动版