Activiti-06-.事件
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-.事件的更多相关文章
- JavaScript进阶系列06,事件委托
在"JavaScript进阶系列05,事件的执行时机, 使用addEventListener为元素同时注册多个事件,事件参数"中已经有了一个跨浏览器的事件处理机制.现在需要使用这个 ...
- Activiti结束事件(End Event)
Activiti结束事件(End Event) 作者:Jesai -2017.08.03T01:03 曾经,黑夜多么漫长,八月雨扰眠,缘何? 声明:版权所有,如需引用请注明出处,如发现抄袭,必追究法律 ...
- Activiti 启动事件(Start Event)
Activiti 启动事件(Start Event) 作者:Jesai 生活里,没有容易二字,忧伤是一种本能,而微笑是一种能力 版权所有,未经允许,禁止引用.如需引用,请注明出处. 前言: 启动事件是 ...
- 非常适合新手的jq/zepto源码分析06 -- 事件模型
复习下事件的有关内容: 1.现在用的绑定/删除: obj.addEventListener(type,fn,false) obj.removeEventListener(type) obj.attac ...
- Activiti的全局事件机制及其监听处理
概述 Activiti在5.15以后的版本后,增加了统一的事件入口,不需要再像以前那样,监听流程的事件时,在流程定义的BPMN文件中为每个节点及流程增加以下的配置,以实现监听事件的做法,这种做法导致我 ...
- 在Activiti中如何使用自定义的组织架构
1.概述 我们知道,activiti是一个不错的流程引擎,它有自身的人员组织架构,但仅限于用户.用户组的管理,流程产生的任务(UserTask),就涉及到任务的所属人(Owner),任务的执行人(as ...
- Activiti6事件及监听器配置(学习笔记)
1.事件及监听器原理 当流程引擎启动的时候,我们定义的监听器,就已经注册在一个事件类型上面. 注册的方式有多种,它可以注册在所有的事件类型上面.也可以注册在指定的几个事件类型上面,这样引擎启动的时候就 ...
- JavaScript进阶系列07,鼠标事件
鼠标事件有Keydown, Keyup, Keypress,但Keypress与Keydown和Keyup不同,如果按ctrl, shift, caps lock......等修饰键,不会触发Keyp ...
- JavaScript进阶系列05,事件的执行时机, 使用addEventListener为元素同时注册多个事件,事件参数
本篇体验JavaScript事件的基本面,包括: ■ 事件必须在页面元素加载之后起效■ 点击事件的一个简单例子■ 为元素注册多个点击事件■ 获取事件参数 ■ 跨浏览器事件处理 □ 事件必须在页面元素加 ...
- 使用C#开发数据库应用系统
第一章 初识Windows程序 01.浅谈控制台应用 解析:控制台应用程序:dos窗口中显示 Windows窗体应用程序:有控件参与的,支持事件的一种程序 02.关于窗体项目的注意点: /*01.一个 ...
随机推荐
- 一步步学习操作系统(2)——在STM32上实现一个可动态加载kernel的"my-boot"
如果要做嵌入式Linux,我们首先要在板子上烧写的往往不是kernel,而是u-boot,这时需要烧写工具帮忙.当u-boot烧写成功后,我们就可以用u-boot附带的网络功能来烧写kernel了.每 ...
- fedora23安装配置记录
一.安装fedora 1.下载fedora的镜像文件,个人比较喜欢gnome,因而直接下载工作站版本了! http://start.fedoraproject.org/这个是浏览器首页,提供了fedo ...
- 【Maven】 install:install-file
install jar to local fs mvn .jar -DgroupId=com.bonc -DartifactId=licenseVerify-.jar -Dversion= -Dpac ...
- Java 调用Azure认知服务Demo--Computer API
说明 本文主要介绍使用Java代码,基于HTTP请求调用Microsoft Azure的认知服务.图片来源分别介绍了使用公网的URL和上传本地图片. 依赖的jar包下载地址: key的获取需要登录到A ...
- Coursera无法正常提交作业
如下图,upload服务貌似被墙了,想要提交作业的话需要临时科学上网.
- wifi pineapple 外接USB无线网卡桥接外网
0:选择USB网卡 在没有有线网络的情况下,可以外挂一个usb无线网卡来桥接上网,目前支持3070L.8187L芯片的网卡,反正linux系统都用这些芯片, 免的安装驱动, 我选择的是 WN-722N ...
- Selenium 定位网页元素
第一 定位元素辅助工具 IE中在元素上右击 -> “检查元素”,或按F12键打开开发者工具: Chrome中在元素上右击 -> “审查元素”,或按F12键打开开发者工具: Firefox ...
- 手工删除crfclust.bdb文件
环境:RHEL 6.5 + Oracle 11.2.0.4 RAC 现象:巡检发现自己的测试环境节点2的空间使用率过高,进一步查询,发现大文件是GI目录下crfclust.bdb文件. crfclus ...
- setTimeout和setInterval不容易注意到的一些细节
今天没事翻了翻JS高程,看到了setTimeout部分有这么一句话:调用setTimeout()之后,该方法会返回一个数值ID,表示超时调用.这个超时调用ID是计划执行代码的唯一标识符,可以通过它来取 ...
- Java面试系列之HashMap大扫盲汇总
PS:整理的稍微有点急,不足之处,望各路道友指正,List相关可以查看前一篇随笔! HashMap的工作原理是近年来常见的Java面试题,几乎每个Java程序员都知道HashMap,都知道哪里要用Ha ...