zoukankan      html  css  js  c++  java
  • Activiti工作流学习-----基于5.19.0版本(8)

    8.1.5 Start Event

    继续上一篇的事件的分享笔记,Start Event指明该处是流程开始,至于开始事件的类型(消息到达开始,指定的事件循环开始等),定义如何开始是在开始事件圆圈图标里面的小图标表示,具体反映到xml中就是子元素的不同。

    Start Event总是进行捕获:在任何时候等待相应的触发器触发。

    下面展示start event的xml,其中initiator指的是流程发起人,流程开始后他将会被保存起来:

    <startEvent id="request" activiti:initiator="xxx" />

    而用户“xxx”在代码中实现同样的功能可以:

    1 try {
    2   identityService.setAuthenticatedUserId("bono");
    3   runtimeService.startProcessInstanceByKey("someProcessKey");
    4 } finally {
    5   identityService.setAuthenticatedUserId(null);
    6 }

    使用在try-catch中使用IdentityService.setAuthenticatedUserId(String)方法。

    8.1.6 None Start Event

    一个none start event说的是在流程定义中没有没有定义触发器。意味着流程引擎不会让流程实例自动开始,需要由开发人员调用API实现(一般子流程就是这个样子):

    1 ProcessInstance processInstance = runtimeService.startProcessInstanceByXXX();

    一个none start event在activiti可视化插件中的样子:

    而bpmn文件中则是

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

    可以配置formKey属性:

    <startEvent id="request" activiti:formKey="org/activiti/examples/taskforms/request.form" />

    8.1.7 Timer Start Event

    timer start event作用是在指定的时间启动流程实例。它主要用在在流程只需要启动一次或者流程循环启动。注意:子流程是不能有timer start event。一般的在流程发布后就启动流程,这时没有必要调用startProcessInstanceByXXX方法了,尽管调用是没有限制的,但是导致同一时刻有多个流程实例运行。同时如果流程有新的版本发布,timer start event只会启动最新的版本的流程定义。

    在activiti可视化插件中的样子:

    pbmn文件的xml格式中:

    <startEvent id="theStart">
      <timerEventDefinition>
        <timeCycle>R4/2011-03-11T12:13/PT5M</timeCycle>
    </timerEventDefinition>
    </startEvent>

    或者指定事件启动:

    <startEvent id="theStart">
      <timerEventDefinition>
        <timeDate>2011-03-11T12:13:14</timeDate>
      </timerEventDefinition>
    </startEvent>

    8.1.7  Message Start Event

    一个Message Start Event会使用命名的消息启动流程实例,在有很多start event时候通过消息命名可以选择正确的start event来启动流程实例用到。

    在发布流程定义一个或者多个的时候,需要注意一些问题:

    每个message start event的名称在流程定义中确保唯一的,在流程定义中没有必要使得多个message start event的名字相同。在多个message start event引用的消息都相同的时候,工作流会抛出异常。

    升级流程版本后,此前的message start event将会被新版本的message start event代替。

    调用RunTimeService的API:

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

    其中messageName是messageEventDefinition中messageRef引用message节点中name的值。message start event只支持顶层流程,不支持子流程。调用runtimeService.startProcessInstanceByMessage(…​)可以选定message event。对于使用方法runtimeService.startProcessInstanceByKey(…​) 和runtimeService.startProcessInstanceById(…​)是使用了none start event,如果此时定义了多个message event会抛出异常。

     例如在messageEventDefinition节点中配置:

    <definitions id="definitions"
      xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"
      xmlns:activiti="http://activiti.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>

     8.1.8 Signal Start Event

    使用命名的信号进行启动流程实例,信号在在流程中间信号抛出或者调用API(runtimeService.signalEventReceivedXXX方法)触发,所有的流程定义如果有相同名称的信号事件,都会被启动。另外在这两种情况下,都可以选择同步或异步的方式启动流程实例。

    其中调用API的参数signalName来自流程定义中signalEventDefinition节点的signalRef的配置,而signalRef来自signal的属性name。signal start event的可视化符号为下图所示:

    解析为xml:

     1 <signal id="theSignal" name="The Signal" />
     2 
     3 <process id="processWithSignalStart1">
     4   <startEvent id="theStart">
     5     <signalEventDefinition id="theSignalEventDefinition" signalRef="theSignal"  />
     6   </startEvent>
     7   <sequenceFlow id="flow1" sourceRef="theStart" targetRef="theTask" />
     8   <userTask id="theTask" name="Task in process A" />
     9   <sequenceFlow id="flow2" sourceRef="theTask" targetRef="theEnd" />
    10       <endEvent id="theEnd" />
    11 </process>

    8.1.9 Error Start Event

    一个error start event在子流程中常用,并且它并不能用在启动一个流程实例。错误开始事件都是中断事件。error start event的可视化符号为下图所示:

    解析为xml为:

    1 <startEvent id="messageStart" >
    2     <errorEventDefinition errorRef="someError" />
    3 </startEvent>

    一个结束事件常常用在流程和子流程中,并且end event总是往外抛出信息,意味着流程执行到结束事件的时候会有结果抛出。

    8.2.1 None End Event

    空的结束事件意味着并没有指定的结果抛出,所以流程引擎在当前执行路径下面并不会执行任何额外的事情。一个none end event的可视化效果。

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

    8.2.2 Error End Event

    如果流程执行到error end event,当前路径执行将会提前结束并抛出一个错误,这个错误会被匹配的边界事件所捕获,如果没有找到对应的边界事件,将会抛出异常,他具体的可视化效果下图所示:

    xml解析为:

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

    errorRef引用的myError是在error中配置的:

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

    其中error的errorCode将会被匹配边界事件,如果errorRef并没有找到对于的error,errorRef将会作为errorCode的短名,这在Activiti中是特有的,比如:

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

    等效于:

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

    8.2.3 Terminate End Event

     当流程执行到terminate end event的时候,当前流程和子流程都将会终止结束。从概念上讲,当执行到终止结束事件的时候,流程实例和子流程会结束,在BPMN2.0中,一个子流程会可以嵌入到子流程、含事务的子流程中,这适用于一般情况。当例如有多实例调用活动或嵌入的子流程,此时只有该实例将结束,其他实例和流程实例不受影响。流程设计器中设计可视化效果为:

    解析为xml的话:

    <endEvent id="myEndEvent >
      <terminateEventDefinition activiti:terminateAll="true"></terminateEventDefinition>
    </endEvent>
  • 相关阅读:
    一个贼基础的 编码解码方式
    SQL 中循环、for循环、游标
    sql中判断是否存在 数据库、表、存储过程、函数
    sql 同步表或同步表的时候更改部分字段
    sql存储过程的建立
    POJ
    UCloud 的安全秘钥 (计蒜客初赛第五场)(待解决)
    UCloud 机房的网络搭建(计蒜客初赛第五场)
    2017 计蒜之道 初赛 第四场
    腾讯课堂的物理实验(2017计蒜客初赛第三场)
  • 原文地址:https://www.cnblogs.com/liujie037/p/5807521.html
Copyright © 2011-2022 走看看