zoukankan      html  css  js  c++  java
  • 【Activiti学习之五】BPMN事件

    环境
      JDK 1.8
      MySQL 5.6
      Tomcat 7
      Eclipse-Luna
      activiti 6.0

    一、事件定义
    1、定时器事件
    (1)timeDate:指定时间触发
    <timerEventDefinition>
    <timeDate>2019-09-12T07:30:00</timeDate>
    </timerEventDefinition>
    ISO8601时间格式,如果要加时间需要前面加T。

    (2)timeDuration:指定一个时间段之后执行
    <timerEventDefinition>
    <timeDuration>PT1S</timeDuration>
    </timerEventDefinition>
    S表示秒,M表示分,D表示天;P表示时间段,T表示精确到时间的时间段;

    (3)timeCycle:指定定时器的运行周期
    <timerEventDefinition>
    <timeCycle>R2/PT1M</timeCycle>
    </timerEventDefinition>
    R表示需要执行的次数,R2/PT1M表示执行两次,每次持续1分钟
    支持cron表达式:秒 分钟 小时 月份中的日期 月份 星期中的日期 年份

    2、错误事件
    处理流程中出现的异常。
    举例:
    <error id="myerror" errorCode="123"></error>
    <process id="testp" name="testp">
    <endEvent id="myerrorevent">
    <errorEventDefinition errorRef="myerror"></errorEventDefinition>
    </endEvent>
    </process>

    3、信号事件
    使用信号给流程发送广播。
    <signal id="signalA" name="signalA"></signal>
    <process id="testp" name="testp">
    ...
    <signalEventDefinition signalRef="signalA"></signalEventDefinition>
    ...
    </process>

    4、消息事件
    消息指向某个接收人,而不是整个流程。
    <message id="mymessage" name="mymessage"></message>
    <process id="testp" name="testp">
    ...
    <messageEventDefinition messageRef="mymessage"></messageEventDefinition>
    ...
    </process>

    5、取消事件
    取消事件使用在事务子流程中。
    <cancelEventDefinition></cancelEventDefinition>

    6、补偿事件
    补偿事件对于已经完成的流程做回退处理。
    <componsateEventDefinition></componsateEventDefinition>

    7、其他事件
    条件事件:<ConditionalEventDefinition>
    升级事件:<EscalationEventDefinition>
    连接事件:<LinkEventDefinition>
    终止事件:<TerminateEventDefinition>

    参考:BPMN事件分类与事件定义

    二、开始事件
    1、无指定开始事件
    不为开始事件指定任何触发条件。
    <startEvent id="s" name="s"></startEvent>

    2、定时器开始事件
    <startEvent id="s" name="s">
    <timerEventDefinition id="ss" name="ss">
    <timeCycle>PT1S</timeCycle>
    </timerEventDefinition>
    </startEvent>

    3、消息开始事件
    <message id="mymessage" name="mymessage"></message>
    <process id="testp" name="testp">
    <startEvent id="s" name="s">
    <messageEventDefinition messageRef="mymessage"></messageEventDefinition>
    </startEvent>


    4、错误开始事件
    错误开始事件只能用在事件子流程中。
    <error id="errorId" errorCode="MyErrorCode"></error>
    <process id="errorStartEventTest01" name="错误开始事件测试01" isExecutable="true">
    <startEvent id="start"></startEvent>
    <serviceTask id="serviceTask01" name="Service Task" activiti:class="com.bug315.event.ErrorStartEventDelegate"></serviceTask>
    <endEvent id="end"></endEvent>

    <sequenceFlow id="sid-1EAADC30-396A-4E19-B181-C688B909510B" sourceRef="serviceTask01" targetRef="end"></sequenceFlow>
    <sequenceFlow id="sid-07875D4F-D2C7-47E0-B4C3-6866F110206F" sourceRef="start" targetRef="serviceTask01"></sequenceFlow>

    <subProcess id="sid-DDBC6BA0-A097-4FC9-8023-C40E6AD0B499" name="subProcess" triggeredByEvent="true">
    <startEvent id="subStart">
    <errorEventDefinition errorRef="errorId"></errorEventDefinition>
    </startEvent>
    <serviceTask id="subServiceTask01" name="Sub Task" activiti:class="com.bug315.event.ErrorHandlerDelegate"></serviceTask>
    <endEvent id="subEnd"></endEvent>
    <sequenceFlow id="sid-24413ADF-BD05-4BB7-9FA8-E70154B94767" sourceRef="subServiceTask01" targetRef="subEnd"></sequenceFlow>
    <sequenceFlow id="sid-A130E45F-9A0B-4362-908E-C8FEB3F640E7" sourceRef="subStart" targetRef="subServiceTask01"></sequenceFlow>
    </subProcess>
    </process>

    参考:开始事件

    三、结束事件
    1、无指定结束事件
    <endEvent id="subEnd" name=""></endEvent>

    2、错误结束事件
    错误结束事件一般用在子流程中,一般和错误边界事件一起使用才有意义。
    <endEvent id="subEnd">
    <errorEventDefinition errorRef="errorId"></errorEventDefinition>
    </endEvent>

    3、取消结束事件和取消边界事件
    取消结束事件只能用在事务子流程中,该事件表示事务将会取消,并且会触发附在事务子流程上的取消边界事件。

    参考:结束事件
    四、边界事件
    附属于某个流程元素(如任务、子流程等)的事件为边界事件。边界事件是Catching事件,会等待被触发,当边界事件被触发,当前的活动会被中断,并且当前的顺序流会发生转移。
    1、定时器边界事件
    需要注意的是:需要开启JobExecutor,cancelActivity属性为true表示原先的流程被中断,false表示不中断,继续执行
    示例:
    <process id="myProcess" name="My process" isExecutable="true">
    <startEvent id="startevent1" name="Start"></startEvent>
    <userTask id="usertask1" name="初级工程师处理"></userTask>
    <userTask id="usertask2" name="中级工程师处理"></userTask>
    <endEvent id="endevent1" name="End"></endEvent>
    <boundaryEvent id="boundarytimer1" name="Timer"
    attachedToRef="usertask1" cancelActivity="true">
    <timerEventDefinition>
    <timeDuration>PT5S</timeDuration>
    </timerEventDefinition>
    </boundaryEvent>
    ....
    </process>

    2、错误边界事件
    错误边界事件依附在某个流程活动中,用于捕获子流程中抛出的错误,因此错误边界事件使用在嵌入子流程或调用子流程中。
    <process id="ebProcess" name="ebProcess">
    <startEvent id="startevent1" name="Start"></startEvent>
    <endEvent id="endevent1" name="End"></endEvent>
    <subProcess id="subprocess1" name="Sub Process">
    <startEvent id="startevent2" name="Start"></startEvent>
    <serviceTask id="servicetask1" name="Throw Error Task"
    activiti:class="org.crazyit.activiti.ThrowErrorDelegate"></serviceTask>
    <endEvent id="endevent2" name="ErrorEnd"></endEvent>
    <sequenceFlow id="flow4" name="" sourceRef="startevent2"
    targetRef="servicetask1"></sequenceFlow>
    <sequenceFlow id="flow5" name="" sourceRef="servicetask1"
    targetRef="endevent2"></sequenceFlow>
    </subProcess>
    <boundaryEvent id="boundaryerror1" cancelActivity="false"
    attachedToRef="subprocess1">
    <errorEventDefinition errorRef="abc"></errorEventDefinition>
    </boundaryEvent>
    ....
    </process>

    3、信号边界事件
    信号边界事件的触发条件是接收到信号,但是不一样的是,信号边界事件具有全局性,换言之,信号边界事件会进行全局范围的信号捕获。与定时器边界事件类似,信号边界事件同样存在可中断与不可中断两类,可以为boundaryEvent元素设置cancelActivity属性,如果设置为true,那么原来的执行流将会被中断,设置为false,则原来的执行流仍然存在。如果多个信号边界事件使用了相同的信号,当在某个地方发出信号时,即使在不同的流程实例中,这些信号边界事件均会捕获到该信号。
    <signal id="contactChangeSignal" name="contactChangeSignal"></signal>
    <process id="sbProcess" name="sbProcess">
    <startEvent id="startevent1" name="Start"></startEvent>
    <userTask id="usertask1" name="签订查看"></userTask>
    <userTask id="usertask2" name="合同确认"></userTask>
    <boundaryEvent id="boundarysignal1" cancelActivity="true"
    attachedToRef="usertask2">
    <signalEventDefinition signalRef="contactChangeSignal"></signalEventDefinition>
    </boundaryEvent>
    <userTask id="usertask3" name="合同变更"></userTask>
    <userTask id="usertask4" name="签订合同"></userTask>
    <endEvent id="endevent1" name="End"></endEvent>
    ...
    </process>


    4、补偿边界事件
    使用了取消结束事件和取消边界事件,当事务子流程被取消时,会触发事务子流程里面的补偿边界事件,这些补偿边界事件会依附在事务子流程的活动中,除了在事务子流程中可以使用取消事件来触发补偿边界事件外,还可以使用补偿中间事件来触发补偿边界事件。

    参考:边界事件

    五、中间事件
    中间事件是指可以单独作为流程元素的事件,BPMN2.0规范中所指的中间事件也包括边界事件。中间事件作为流程元素表示对事件的捕获与事件的触发,一类中间事件可以在流程中等待被触发,一类中间事件会在流程中自动被触发并抛出结果(触发信息)。
    除了无指定Throwing中间事件外,其他事件均需要加入事件定义。

    1、中间Catching事件
    (1)定时器(Timer)中间事件
    定时器中间事件一直等待被触发,当达到定义的时间条件后,该定时器中间事件会被触发,流程继续往下执行。
    <process id="tcProcess" name="tcProcess">
    <startEvent id="startevent1" name="Start"></startEvent>
    <userTask id="usertask1" name="发货"></userTask>
    <userTask id="usertask2" name="接收订单"></userTask>
    <intermediateCatchEvent id="timerintermediatecatchevent1"
    name="TimerCatchEvent">
    <timerEventDefinition>
    <timeDuration>PT1M</timeDuration>
    </timerEventDefinition>
    </intermediateCatchEvent>
    <endEvent id="endevent1" name="End"></endEvent>
    ...
    </process>

    (2)信号(Signal)中间事件
    一个信号中间Catching事件会等待被触发,直接到该事件接收到相应的信号,与其他事件不同的是,当信号事件接收到信号后,该信号不会被消耗掉,如果存在多个引用了相同信号的事件,那么当接收到信号时,这些事件被一并被触发,即使它们不在同一个流程实例中.


    (3)消息(Message)中间事件

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

    2、中间Throwing事件:
    (1)无指定(None)中间事件
    (2)信号(Signal)中间事件
    (3)补偿(Compensation)中间事件

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

    参考:中间事件 


    六、补偿中间事件

    参考:补偿中间事件

    参考:疯狂工作流讲义(第2版)基于Activiti6.x 

  • 相关阅读:
    【简单易懂】JPA概念解析:CascadeType(各种级联操作)详解
    [转] @JoinColumn 详解 (javax.persistence.JoinColumn)
    Feign二: @FeignClient 接口调用
    @Basic表示一个简单的属性 懒加载,急加载
    RPC接口测试(一)什么是 RPC 框架
    Mysql中 查询慢的 Sql语句的记录查找
    Mysql 查看连接数,状态 最大并发数
    ntp时间一致对与设备心跳的影响
    jmeter常用四种断言
    jmeter BeanShell断言(四)
  • 原文地址:https://www.cnblogs.com/cac2020/p/11635688.html
Copyright © 2011-2022 走看看