Events 事件

1, 事件用于对发生在流程生命周期的事情进行建模。事件总是被形象成一个圆圈。在BPMN 2.0 中,存在两种主要的事件类型:捕获事件和抛出事件。

捕获:流程执行到该事件时,会等待事件触发。事件触发类型由内部图标或XML中的类型声明来定义。捕获事件视觉上可以通过里面没有填充的内部图标与抛出事件进行区分(也就是说,图标是白色的)。
  抛出:流程执行到该事件时,事件就会被触发。该事件触发的类型由内部图标或XML中的类型声明来定义。抛出事件视觉上可以通过内部图标与抛出的事件进行区分,抛出事件的图标使用黑色填充。

Timer Event Definitions 定时器事件

定时器事件是被定义的定时器触发的事件。可以作为启动事件、中间事件或边界事件来使用。

定时器的定义只能有以下的一个元素:

timeData:该格式以ISO 8601格式指定了触发事件的确定时间(译注,即,在确定时刻触发定时器事件)。示例:

<timerEventDefinition>
    <timeDate>2011-03-11T12:13:14</timeDate>
</timerEventDefinition>

timeDuration:指定定时器事件在触发前运行多长时间,timeDuration可以作为timerEventDuration的子元素来指定。使用的格式是ISO 8601格式(这是BPMN 2.0规范所要求的)。示例(间隔10天 ):

<timerEventDefinition>
<timeDuration>P10D</tim
</timerEventDefinition>

timeCycle:指定循环的时间间隔(译注,即,每隔多长时间执行一次循环),这对于周期性的启动流程或者给过期的用户任务发送提示是很有帮助的。时间循环元素可以使用两种格式来指定。首先是循环次数的持续的格式,这是ISO 8601所规定的。示例(循环3次,每次循环持续10小时)

<timerEventDefinition>
<timeCycle>R3/PT10H</timeCycle>
</timerEventDefinition>

此外,你也可以使用cron表达式来指定循环次数,下面的示例展示了每5分钟触发一次

0 0/5 * * * ?

循环持续的次数更适合处理那些在时间上相对于某个特定的时间点(如,用户任务开始时)来计算的相对定时器,
然而cron表达式可以处理绝对定时器,这对于timer start events是特别有用的。

你可以在定义定时器事件时使用表达式,这样你就可以基于流程变量来影响定时器的定义。流程变量必须包含恰当定时
器类型的ISO 8601 字符串(或循环类型cron)。

  <boundaryEvent id="escalationTimer" cancelActivity="true" attachedToRef="firstLineSupport">
     <timerEventDefinition>
      <timeDuration>${duration}</timeDuration>
    </timerEventDefinition>
  </boundaryEvent>

注意:只有在开启作业执行器时,定时器事件才能被触发(即,需要在activiti.cfg.xml中将jobExecutorActivat 设置为true),
因为默认job executor 是被禁用的。

Start Events 启动事件

启动事件表示流程的开始。定义了流程如何被启动的启动事件类型(当收到消息、特定的时间间隔、等等,启动流程)是以一个小图标来形象表示事件的。在XML表示中,类型是由子元素的声明给出的。启动事件总是捕获型的:从概念上讲,该事件(任何时候)会一直等待直到触发发生。

启动事件中,可以指定以下Activiti 所特有的属性:
  formKey:指向一个用户必须在启动新流程实例时填写的表单模板。更多信息见表单一节。示例:

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

initiator:指明在流程启动时存储被认证的用户id 的变量名。示例:

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

被认证的用户必须必须在tye-finally块中使用方法IdentityService.setAuthenticatedUserId(String)来设置,如下

try{  identityService.setAuthenticatedUserId("bono");  runtimeService.startProcessInstanceByKey("someProcessKey");}finally{  identityService.setAuthenticatedUserId(null);}

None Start Event 空启动事件

从技术上讲,‘空’启动事件意味着不给启动流程实例指定触发器。空启动事件使用在通过调用startProcessInstanceByXXX方法启动流程实例的时候。

ProcessInstance processInstance= runtimeService.startProcessInstanceByXXX();

注意:子流程总是有一个空启动事件。

空启动事件被形象化成不带内图标的圆(即,没有触发器类型)。

空启动事件的XML表示是不带子元素的普通启动事件声明(其它启动事件类型都有声明类型的子元素)。<startEventid="start"name="my start event"/>

Timer Start Event 定时器启动事件

定时器启动事件用于在给定的时间点创建流程实例。它可以用在只启动一次的流程中,也可以用在特定时间间隔下启动的流程。

定时器启动事件被形象化成带有时钟内图标的圆。

从2011年3月11日12:13开始,流程将启动4次,每次间隔5分钟。
  <startEvent id="theStart">       <timerEventDefinition>               <timeCycle>R4/2011-03-11T12:13/PT5M</timeCycle>       </timerEventDefinition>   </startEvent>   流程将在选定的时间上启动一次
     <startEventid="theStart">            <timerEventDefinition>                <timeDate>2011-03-11T12:13:14</timeDate>            </timerEventDefinition>        </startEvent>
 

End Events

终止事件表明流程或子流程(的执行路径)的结束。终止事件总是抛出型的。这意味着当流程执行到终止事件时,有一个结果会被抛出。结果的类型是以事件的内部黑色图标来表示的。XML表示中,类型是由子元素的声明给出的。

空终止事件 ‘空’终止事件意味着不指定当达到该事件时抛出的结果。这样,流程引擎除了结束当前的执行路径不会再执行任何其它操作。      空终止事件的XML表示为没有子元素的普通的终止事件的声明(其它终止事件类型都有声明类型的子元素)。
<endEventid="end"name="my end event"/>

Error End Event

当流程执行到异常终止事件时,会结束当前的执行路径,并抛出一个异常。异常可以被与之匹配的中间边界异常事件捕获。如果没有匹配的边界异常事件,默认会采用空终止事件对待。
    要点:BPMN异常与Java异常是不一样的。事实上,两者没有任何共同点。BPMN异常事件是对业务异常建模的一种方式。Java异常则是以它所特有的方式来进行处理。

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

errorRef 属性可以引用流程之外定义的error元素。

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

error元素的errorCode属性将用来查找与之匹配的捕获边界异常事件。如果errorRef与任何定义的异常都不匹配,那么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>  

顺序流

顺序流是两个流程元素的连接者。一个元素在流程执行期间被访问后,流程会沿着该元素所有输出顺序流继续执行。这意味着BPMN 2.0默认行为是并行的:两个输出顺序流会创建两条独立、并行的执行路径。

顺序流要有流程唯一的id,以及指向现有起始元素和目标元素的引用。

<sequenceFlowid="flow1"sourceRef="theStart"targetRef="theTask"/>

条件顺序流

可以在顺序流上定义条件。当顺序流程左侧是BPMN 2.0的活动时,默认会计算其输出顺序流上的条件。选取条件成立的输出顺序流来执行。如果选取了多个顺序流,就会创建多个执行路径,并且流程会以并行的方式来执行。
    注意:以上适用于BPMN 2.0的活动(以及事件),但是不适用于分支。根据分支的类型,其会以其特有的方式来处理带有条件的顺序流。

条件顺序流被形象化成始点为一个小菱形的普通顺序流。条件表达式紧挨着顺序流。

<sequenceFlow id="flow"sourceRef="theStart"targetRef="theTask">
<conditionExpressionxsi:type="tFormalExpression">
<![CDATA[${order.price > 100 && order.price < 250}]]>
</conditionExpression>
</sequenceFlow>

目前,conditionExpression只能使用UEL,关于此的详细信息见表达式一节。使用的表达式必须解析为布尔类型的值,否则在计算条件时会抛出异常。

下面的示例以典型的JavaBean风格通过getters来引用流程变量的数据。

<conditionExpressionxsi:type="tFormalExpression">
<![CDATA[${order.price > 100 && order.price < 250}]]>
</conditionExpression>

该示例调用了一个返回布尔类型值的方法

<conditionExpression xsi:type="tFormalExpression">
  <![CDATA[${order.isStandardOrder()}]]>
</conditionExpression>

默认顺序流

所有BPMN 2.0任务以及分支都可以有一个默认顺序流。当且仅当没有其它顺序流被选择时,才会选择该顺序流作为活动的输出顺序流。默认顺序流上的条件总是被忽略掉。
 默认顺序流被形象化成起点带‘斜线’的普通顺序流。

某个活动的默认顺序流是由那个活动上的default属性定义的。下面的XML片段展示了包含一个默认顺序流flow2的排他分支。只有当conditionA和conditionB都为false时,才会选取它作为分支的输出顺序流。

<exclusiveGatewayid="exclusiveGw"name="Exclusive Gateway"default="flow2"/>
<sequenceFlowid="flow1"sourceRef="exclusiveGw"targetRef="task1">
<conditionExpressionxsi:type="tFormalExpression">${conditionA}</conditionExpression>
</sequenceFlow>
<sequenceFlowid="flow2"sourceRef="exclusiveGw"targetRef="task2"/>
<sequenceFlowid="flow3"sourceRef="exclusiveGw"targetRef="task3">
<conditionExpressionxsi:type="tFormalExpression">${conditionB}</conditionExpression></sequenceFlow>

Gateways 分支

gateway用来控制执行流(或如BPMN 2.0描述的,执行令牌)。gateway可以回收或创建令牌。 gateway被形象化为里面有图标的菱形。图标说明了gateway的类型。

Exclusive Gateway 排它分支

Activiti-06-.事件的更多相关文章

  1. JavaScript进阶系列06,事件委托

    在"JavaScript进阶系列05,事件的执行时机, 使用addEventListener为元素同时注册多个事件,事件参数"中已经有了一个跨浏览器的事件处理机制.现在需要使用这个 ...

  2. Activiti结束事件(End Event)

    Activiti结束事件(End Event) 作者:Jesai -2017.08.03T01:03 曾经,黑夜多么漫长,八月雨扰眠,缘何? 声明:版权所有,如需引用请注明出处,如发现抄袭,必追究法律 ...

  3. Activiti 启动事件(Start Event)

    Activiti 启动事件(Start Event) 作者:Jesai 生活里,没有容易二字,忧伤是一种本能,而微笑是一种能力 版权所有,未经允许,禁止引用.如需引用,请注明出处. 前言: 启动事件是 ...

  4. 非常适合新手的jq/zepto源码分析06 -- 事件模型

    复习下事件的有关内容: 1.现在用的绑定/删除: obj.addEventListener(type,fn,false) obj.removeEventListener(type) obj.attac ...

  5. Activiti的全局事件机制及其监听处理

    概述 Activiti在5.15以后的版本后,增加了统一的事件入口,不需要再像以前那样,监听流程的事件时,在流程定义的BPMN文件中为每个节点及流程增加以下的配置,以实现监听事件的做法,这种做法导致我 ...

  6. 在Activiti中如何使用自定义的组织架构

    1.概述 我们知道,activiti是一个不错的流程引擎,它有自身的人员组织架构,但仅限于用户.用户组的管理,流程产生的任务(UserTask),就涉及到任务的所属人(Owner),任务的执行人(as ...

  7. Activiti6事件及监听器配置(学习笔记)

    1.事件及监听器原理 当流程引擎启动的时候,我们定义的监听器,就已经注册在一个事件类型上面. 注册的方式有多种,它可以注册在所有的事件类型上面.也可以注册在指定的几个事件类型上面,这样引擎启动的时候就 ...

  8. JavaScript进阶系列07,鼠标事件

    鼠标事件有Keydown, Keyup, Keypress,但Keypress与Keydown和Keyup不同,如果按ctrl, shift, caps lock......等修饰键,不会触发Keyp ...

  9. JavaScript进阶系列05,事件的执行时机, 使用addEventListener为元素同时注册多个事件,事件参数

    本篇体验JavaScript事件的基本面,包括: ■ 事件必须在页面元素加载之后起效■ 点击事件的一个简单例子■ 为元素注册多个点击事件■ 获取事件参数 ■ 跨浏览器事件处理 □ 事件必须在页面元素加 ...

  10. 使用C#开发数据库应用系统

    第一章 初识Windows程序 01.浅谈控制台应用 解析:控制台应用程序:dos窗口中显示 Windows窗体应用程序:有控件参与的,支持事件的一种程序 02.关于窗体项目的注意点: /*01.一个 ...

随机推荐

  1. nGrinder 简易使用教程

    背景 性能压测工具之前使用的是jmeter,这次说的是nGrinder,先直接搬运两者之间的比较 比较点 JMeter nGrinder 结果 实现语言 Java Java = License Apa ...

  2. 【Centos7 GRUB】修改开机等待时间

    centos7与之前版本不同,在/boot/grub/下没有 grub.conf文件,但在/etc/grub2/grub.cfg可找到帮助信息 [root@za default]# cat /boot ...

  3. ASP.NET CORE 2.0 不小心踩得坑

    前言 我是跟着 https://github.com/FQLin/Docs 学习asp.net core 2.0 的 1.EF迁移 EF 的迁移方式有两种: Command-line interfac ...

  4. WeQuant交易策略—5日均线

    简单的价格突破策略.当前价格超过最近5个收盘价的均价,则全仓买入:低于均价,则全仓卖出 代码 # 简单的价格突破策略.当前价格超过最近5个收盘价的均价,则全仓买入:低于均价,则全仓卖出 # PARAM ...

  5. Ubuntu安装卸载anaconda

    安装要点: 1.在Anaconda官网https://www.continuum.io/downloads内下载需要的版本: 2.打开终端--进入下载安装包所在的文件夹(cd 文件名)--输入命令:b ...

  6. Servlet使用简介

    Servlet的使用基本包含三个步骤: 1.继承HttpServlet 或实现Servlet 接口 (根据源码分析最终都是对servlet接口的实现) 2.配置地址: 配置web.xml 或者用注解的 ...

  7. CSS-三栏响应式布局(左右固宽,中间自适应)的五种方法

    代码: <!-- 1 float --> <h3 class="block">第一种方法-float</h3> <div class=&q ...

  8. clob字段的值插入和查询N种方法【包括java调用存储过程传入clob参数】

    import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import jav ...

  9. selenium之handle学习 多窗口、句柄

    我们拿松勤软件测试的网站做例子: 直接获取all_handle这个list数据里面第二个handle的值:all_handle[1] # coding:utf-8 from selenium impo ...

  10. linux中文件I/O操作(系统I/O)

    我们都知道linux下所有设备都是以文件存在的,所以当我们需要用到这些设备的时候,首先就需要打开它们,下面我们来详细了解一下文件I/O操作. 用到的文件I/O有以下几个操作:打开文件.读文件.写文件. ...