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”在代码中实现同样的功能可以:
try {
identityService.setAuthenticatedUserId("bono");
runtimeService.startProcessInstanceByKey("someProcessKey");
} finally {
identityService.setAuthenticatedUserId(null);
}
使用在try-catch中使用IdentityService.setAuthenticatedUserId(String)方法。
8.1.6 None Start Event
一个none start event说的是在流程定义中没有没有定义触发器。意味着流程引擎不会让流程实例自动开始,需要由开发人员调用API实现(一般子流程就是这个样子):
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:
<signal id="theSignal" name="The Signal" /> <process id="processWithSignalStart1">
<startEvent id="theStart">
<signalEventDefinition id="theSignalEventDefinition" signalRef="theSignal" />
</startEvent>
<sequenceFlow id="flow1" sourceRef="theStart" targetRef="theTask" />
<userTask id="theTask" name="Task in process A" />
<sequenceFlow id="flow2" sourceRef="theTask" targetRef="theEnd" />
<endEvent id="theEnd" />
</process>
8.1.9 Error Start Event
一个error start event在子流程中常用,并且它并不能用在启动一个流程实例。错误开始事件都是中断事件。error start event的可视化符号为下图所示:

解析为xml为:
<startEvent id="messageStart" >
<errorEventDefinition errorRef="someError" />
</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>
Activiti工作流学习-----基于5.19.0版本(8)的更多相关文章
- Activiti工作流学习-----基于5.19.0版本(2)
二.activiti.cfg.xml的其他bean节点配置 2.1 新特性:Job Executor和Async Executor 从5.17.0版本的activiti开始提供作业执行者(Job Ex ...
- Activiti工作流学习-----基于5.19.0版本(5)
五.与Spring集成 实际项目中一般都有Spring的身影,与Spring集成使得Activiti的实用性得到提高.activiti和Spring整合需要activiti-spring的jar在类路 ...
- Activiti工作流学习-----基于5.19.0版本(6)
七. BPMN的简介 读者了解到这里,应付一般的工作流开发已经足够了.此处应该有华丽的分割线,在工作流项目中核心开发人员主要是对工作流业务设计以及实现,而初级开发人员是对业务功能的代码实现.以后将主要 ...
- Activiti工作流学习-----基于5.19.0版本(1)
该版本的Activiti运行须知: 1.JDK 6+,Eclipse最好是Kepler以上版本. 2.试验功能都有EXPERIMENTAL标注,被标注的部分不应该视为稳定的. 有兴趣的同学可以去了解下 ...
- Activiti工作流学习-----基于5.19.0版本(4)
四.使用工作流开发 org.activiti.engine.ProcessEngine提供的Service作用在工作流引擎上面,如果所示是模仿一个公司简单的审批流程,你可以下载这个Demo:Activ ...
- Activiti工作流学习-----基于5.19.0版本(7)
八.BPMN 2.0流程图详解 BPMN 2.0的标准的出现是好事,用户不在被某个工作流开发商绑架或者在工作流中开发妥协,Activiti作为BPMN标准的一套解决方案,使得用户在选择工作流框架时可以 ...
- Activiti工作流学习-----基于5.19.0版本(3)
前面关于eventType的属性值的配置简单的说了一下,activiti支持的值如下表所示:这是我摘抄的activiti官网的 Event 的名字 描述 Event的类名 ENGINE_CREATED ...
- Activiti工作流学习之流程图应用详解
Activiti工作流学习之流程图应用详解 1.目的 了解Activiti工作流是怎样应用流程图的. 2.环境准备2.1.相关软件及版本 jdk版本:Jdk1.7及以上 IDE:eclipse ...
- Activiti工作流学习之概述(一)
一.工作流介绍 我第一次听到这个词,是蒙逼的,再看百度百度,更傻眼了,完全说的不像人话啊,举几个生活中的例子,就明白多了比如:请假.报销等等,如果文字太过抽象,请看图: 二.工作流引擎 Process ...
随机推荐
- Android Canvas.drawText方法中的坐标参数的正确解释
摘要 canvas.drawText(www.jcodecraeer.com, x, y, paint); x和y参数是指定字符串中心的坐标吗?还是左上角的坐标?这个问题的直观印象应该是左上角的坐标, ...
- Graphviz-Gdot语言学习
GVEdit这个绘图软件呢我也是刚接触的,感觉画起图来还是很爽的...尤其很熟悉c++后很容易上手这门dot语言. 先看一下十分清新的编程界面: 没有天下最邪恶的语法加亮,没有缩进行...这又算什么! ...
- BZOJ3401: [Usaco2009 Mar]Look Up 仰望
3401: [Usaco2009 Mar]Look Up 仰望 Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 87 Solved: 58[Submit ...
- CH Round #54 - Streaming #5 (NOIP模拟赛Day1)
A.珠 题目:http://ch.ezoj.tk/contest/CH%20Round%20%2354%20-%20Streaming%20%235%20(NOIP模拟赛Day1)/珠 题解:sb题, ...
- tomcat主目录
简单显示天气预报js 代码
- iOS 蓝牙4.0开发
背景: 1.iOS的蓝牙不能用来传输文件.2.iOS与iOS设备之间进行数据通信,使用gameKit.framework3.iOS与其他非iOS设备进行数据通信,使用coreBluetooth.fra ...
- 使用boost中的线程池
#include <boost/thread/thread.hpp>#include <boost/bind.hpp>#include <iostream> u ...
- 将EXCEL中的列拼接成SQL insert插入语句
工作中经常需要将EXCEL文件中的数据导入到各种数据库,但是对于不熟悉数据库的人来说,如果直接使用命令执行导入,这无疑是一个难题,也是一个风险.这里我们直接在EXCEL文件中拼接成标准的SQL ins ...
- oracle之时间格式的应用
${,""," and rs.count_date >= '"+start_date+"'||' 00:00:00'")} ${,&q ...
- django: urlconfig
django 的 url 配置主要在 urls.py 中进行 urlconfig 中对 url 的处理方式主要在: 一 视图处理方式 如 上文 例子所示: url(r'^blog/index/$', ...