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 

  • 相关阅读:
    Advanced Configuration Tricks
    Reviewing the Blog Module
    Editing and Deleting Data
    Making Use of Forms and Fieldsets
    Understanding the Router
    SQL Abstraction and Object Hydration
    Preparing for Different Databases
    Java学习理解路线图
    Openstack学习历程_1_视频
    CentOS安装Nginx负载
  • 原文地址:https://www.cnblogs.com/cac2020/p/11635688.html
Copyright © 2011-2022 走看看