http://wenku.baidu.com/view/6fc5a85ee53a580217fcfebd.html
-》Pracess(该流程的基本数据,流程名字等)
-----------------------------------------------------
<process id="Process" name="请假流程-普通表单" isExecutable="true">
<documentation>请假流程演示</documentation>
</process>
-----------------------------------------------------
-》Data Objects(插入一条可以公用的数据)
-----------------------------------------------------
<process id="myProcess" name="My process" isExecutable="true">
<documentation>这是一个演示</documentation>
<dataObject id="wsy" name="wsy" itemSubjectRef="xsd:string">
<extensionElements>
<activiti:value>汪诗雨</activiti:value>
</extensionElements>
</dataObject>
</process>
-----------------------------------------------------
-》Listeners(执行监听器)
Java class ,Expression,Delegate expression都有域,其中的值可以传给监听器
-----------------------------------------------------
<extensionElements>
<activiti:executionListener event="start" class="org.xdemo.example.activiti.Cdi.event.ABC">
<activiti:field name="user"> <activiti:string><![CDATA[HelloWord]]>
</activiti:string>
</activiti:field>
</activiti:executionListener>
</extensionElements>
-----------------------------------------------------
-》--》Java class
注意:class需要实现接口
org.activiti.engine.delegate.ExecutionListener
-----------------------------------------------------
<process id="myProcess" name="My process" isExecutable="true">
<documentation>这是一个演示</documentation>
<extensionElements>
<activiti:executionListener event="start" class="org.xdemo.example.activiti.Cdi.event.ABC">
</activiti:executionListener>
</extensionElements>
</process>
-----------------------------------------------------
-》--》Expression
定义一个表达式类似EL语法。这里的pojo是一个Bean的名称(可以用spring代理),还可以子expression中通过计算一个表达式配置监听器的名称
-----------------------------------------------------
<process id="myProcess" name="My process" isExecutable="true">
<documentation>这是一个演示</documentation>
<extensionElements>
<activiti:executionListener event="end" expression="${pojo.method(executionListenerForStart)}"></activiti:executionListener>
</extensionElements>
</process>
-----------------------------------------------------
-》--》Delegate Expression
这里指定的是一个spring代理的业务bean,业务bean必须实现接口:
org.activiti.engine.delegate.ExecutionListener
-----------------------------------------------------
<process id="myProcess" name="My process" isExecutable="true">
<documentation>这是一个演示</documentation>
<extensionElements>
<activiti:executionListener event="start" delegateExpression="${aBean}"></activiti:executionListener>
</extensionElements>
</process>
-----------------------------------------------------
-》启动节点(每一个流程都有一个启动节点,此节点是流程进如的地方)
启动时间的三种类型:1.空启动事件
2.定时启动事件
3.邮件启动事件
4.异常启动事件
*注:其中第四个异常启动事件和另为3个又不相同
-》--》General
-----------------------------------------------------
<process id="myProcess" name="My process" isExecutable="true">
<documentation>这是一个演示</documentation>
<startEvent id="startevent1" name="Start"></startEvent>
</process>
-----------------------------------------------------
-》--》Main config
*注:
Initiator:可以用来记录启动流程人的id(也可以是用户的名称)启动流程之后次属性指定的变量就会自动设置当前人的名称
Form key:可以用来指定空启动事件关联表单
-----------------------------------------------------
<process id="myProcess" name="My process" isExecutable="true">
<documentation>这是一个演示</documentation>
<startEvent id="startevent1" name="Start" activiti:initiator="applyUserId" activiti:formKey="startUserId"></startEvent>
</process>
-----------------------------------------------------
-》--》Documentation
-----------------------------------------------------
<process id="myProcess" name="My process" isExecutable="true">
<documentation>这是一个演示</documentation>
<startEvent id="startevent1" name="Start"
activiti:initiator="applyUserId"
activiti:formKey="startUserId">
</startEvent>
<documentation>abc</documentation> </process>
-----------------------------------------------------
-》--》Form(表单)
*注:Activiti的空启动事件和任务事件都是以表单的形式提交给流程引擎
作用 :
当我们要打开任务表单的时候可以重定向到任务表单,重定向的action如:
formKey + "?id=" +objId + "&taskId=" +taskId;
objId为业务对象Id,taskid为任务id,这样就可以在任务表单获取到想要的信息
一般使用的表单大概有三种:
1、动态表单(在流程文件里定义)
-----------------------------------------------------
<process id="myProcess" name="My process" isExecutable="true">
<documentation>这是一个演示</documentation>
<startEvent id="startevent1" name="Start"
activiti:initiator="applyUserId"
activiti:formKey="startUserId">
<extensionElements>
<activiti:formProperty id="id" name="id" type="string" expression="${leave.reason}" variable="aUser" default="abc"></activiti:formProperty>
</extensionElements>
</startEvent> </procss>
-----------------------------------------------------
2、外置表单(在流程文件里定义)
这种方式常用于基于工作流平台开发的方式,代码写的很少,开发人员只要把表单内容写好保存到.form文件中即可,然后配置每个节点需要的表单名称(form key),实际运行时通过引擎提供的API读取Task对应的form内容输出到页面。
此种方式对于在经常添加新流程的需求比较适用,可以快速发布新流程,把流程设计出来之后再设计表单之后两者关联就可以使用了。例如公司内部各种简单的审批流程,没有业务逻辑处理,仅仅是多级审批是否通过等等情况
当流程需要一些特殊处理时可以借助Listener或者Delegate方式实现。
Activiti Explorer就是使用的这种方式,表单信息都配置在流程定义文件中。
-----------------------------------------------------
<process id="myProcess" name="My process" isExecutable="true">
<documentation>这是一个演示</documentation>
<startevent id="startevent" name="Start"
activiti:formkey="diagrams/form/start.form"> </startevent>
</startEvent> </procss>
-----------------------------------------------------
3、普通表单(jsp,html,jsf文件里)
这个是最灵活的一种方式,常用于业务比较复杂的系统中,或者业务比较固定不变的需求中,例如ERP系统。
普通表单的特点是把表单的内容存放在一个页面(jsp、jsf、html等)文件中,存放方式也有两种(一体式、分离式):
1.一体式:把整个流程涉及到的表单放在一个文件然后根据处理的任务名称匹配显示,demo的普通表单模式就是一体式的做法,把表单内容封装在一个div里面,div的ID以节点的名称命名,点击“办理”按钮时用对话框的方式把div的内容显示给用户。
2.分离式:对于非Ajax应用来说比较常用,每个任务对应一个页面文件,点击办理的时候根据任务的ID动态指定表单页面。
和以上两种方式比较有两点区别:
表单:和第二种外置表单类似,但是表单的显示、表单字段值填充均由开发人员写代码实现。
数据表:数据表单独设计而不是和前两种一样把数据以key、value形式保存在引擎表中。
-----------------------------------------------------
-》Listeners(执行监听器)
*注:这里的监听器和流程的执行监听器是一样的
-》任务(流程中最重要的组成部分,根据业务的不同也分为很多种类型)
-》!--》User Task
-》--》General
*注:与空启动事件相比General下多了两个属性
Asynchronous :是否异步(当流程执行到并行网关如上图,其后面有多个User Task节点时,是否异步执行这些任务节点)
Exclusive : 是否独占(同一个流程实例在同一时刻只能执行一个任务)
-----------------------------------------------------
<process id="myProcess" name="My process" isExecutable="true">
<documentation>这是一个演示</documentation>
<userTask id="usertask1" name="User Task"></userTask>
</startEvent> </procss> -----------------------------------------------------
-》--》Main config
-----------------------------------------------------
<process id="myProcess" name="My process" isExecutable="true">
<documentation>这是一个演示</documentation>
<userTask id="usertask1" name="User Task" activiti:assignee="徐总" activiti:dueDate="${overDate}" activiti:priority="${priority}"></userTask>
</startEvent> </procss>
-----------------------------------------------------
-》-》Listeners(任务监听器)
*注:这里叫做任务监听器,和执行监听器大体相同,只是类实现的接口不同。
注意:class需要实现接口
org.activiti.engine.delegate.TaskListener
-》-》Multi instance(多实例)(*重要*)
-----------------------------------------------------
<process id="myProcess" name="My process" isExecutable="true">
<documentation>这是一个演示</documentation>
<userTask id="usertask1" name="User Task" activiti:assignee="徐总" activiti:dueDate="${overDate}" activiti:priority="${priority}">
<multiInstanceLoopCharacteristics isSequential="false" activiti:collection="${users}" activiti:elementVariable="user">
<loopCardinality>3</loopCardinality>
<completionCondition>
${index/a=1}</completionCondition>
</multiInstanceLoopCharacteristics>
</userTask>
</startEvent> </procss>
-----------------------------------------------------
-》网关
-》--》General
Default flow:默认线路
-----------------------------------------------------
<process id="myProcess" name="My process" isExecutable="true">
<documentation>这是一个演示</documentation>
<parallelGateway id="parallelgateway1" name="Parallel Gateway"></parallelGateway>
</procss> -----------------------------------------------------
-》Listeners(执行监听器)
*注:这里的监听器和流程的执行监听器是一样的