《Activiti实战》摘抄&笔记1

##背景-作流基础 BPM-业务流程管理,一套达成“企业各种业务环节”整合的全面管理模式(对一条业务流中每个环节任务活动的把控管理)。

随时间的推移,BPM的定义范围逐步扩展,不仅用来满足无纸化办公需求,现在BPM是一种企业集成技术,作为SOA、EAI、ESB的补充,用在一起存在流的场景中。

从概念上BPM包括2种含义:
1)管理规范角度看: 抽象业务流程,BPM流程图
2)软件工程角度看: 可以由BPMS执行的可执行业务流程

工作生命周期
1)定义 :收集业务需求并转化为流程定义。一般由业务需求人员进行,然后交由开发人员加工转化为计算机可识别的流程定义。
2)发布 :有开发人员打包各种资源,然后在系统管理平台中发布流程定义。在具体的流程引擎中包括流程定义文件、自定义表单、任务监听类。
3)执行 :具体的流程引擎(例如Activiti)按照事先定义好的流程处理路线以任务驱动的方式执行业务流程。
4)监控 :此阶段是依赖执行阶段。业务人员在办理任务的同时搜集每个任务的结果,然后根据结果作出相应的处理。例如,在采购办公用品流程中,在通过领导审批之后,采购人员就要根据申请单外出采购。
5)优化:类似软件开发中的迭代,优化业务流程。

BMPN:业务流程建模标注,用于流程建模,领域语言的感觉。
类比
BMP工作流--抽象工作流--BPMN--Activiti(工作流引擎+管理工具+建模工具)
程序算法 -- 伪代码 --JAVA--JDK(JRE)+IDE

工作流引擎的好处优点 :在早期原始的工作流(即没有工作流引擎的时候),整个流程均使用一系列单独为不同任务节点设计的页面串联起来,完成一个节点后在数据库标记当前任务的名称,以此做到“流程驱动”。引入工作流引擎后,可以分离了业务代码和控制流程的代码,并可以在整体上监控管理各个节点。

##Activiti Activiti是一个针对企业用户、开发人员、系统管理员的轻量级工作流业务管理平台。其核心是使用Java开发的快速、稳定的BPMN2.0流程引擎。它可以运行在任何类型的Java程序中,例如服务器、集群、云服务等,可以完美地与Spring集成,设计非常简约。(轻量级相对于jBPM5来说,Activiti采用的技术相对jBPM的企业级重量级的技术来说,可看Activiti与jBPM5的对比)

###特点
1)数据持久化: Activiti的设计思想是简洁、快速。介于应用的瓶颈位于和数据库交换数据的过程中,Activiti选择使用MyBatis通过最优的SQL语句执行command,使引擎在速度上保持最高性能。
2)引擎Service接口:Activiti引擎提供了7大Service接口,均通过ProcessEngine获取,并且支持链式API编程风格。
3) 流程设计器: 提供了流程设计器:Eclipse Designer,基于Web的Activiti Modeler
4)Activiti原生支持Spring
5)分离运行时与历史数据: Activiti继承自jBPM4,在表结构设计方面也遵循运行时与历史数据的分离,这样的设计可以快速读取运行时数据,仅当需要查询历史数据时再从专门的历史数据表中读取。这种设计方式可以大幅提高数据的存取效率,尤其是当数据日积月累时依然能够快速反应。

###架构与组件 1) Modeling : Activiti Modeler, Activiti Designer, Activiti Kickstart
2) Runtime : Activiti Egnine
3) Management : Activiti Explorer, Activiti REST

###环境搭建 1)下载Activiti
2)目录结构: database, docs, libs, wars
3)Javadocs结构,包说明
4)helloworld
5)Activiti Explorer

###流程设计工具 Activiti Modeler,在Signavio的基础上开发,由KISBPM提供开源版本,同时KISBPM也提供商业版支持更多功能:模型的版本控制、表单设计器、自定义属性、模板库、模型部署、角色控制等。

##BPMN 2.0规范 BPMN 2.0规范包含很多模型。目前Activiti可以支持大多数情况下常用的模型,并且在实现规范的基础上进行了功能和使用性扩展。

概念-图形-xml描述-实例讲解-Avtiviti扩展属性

###一些概念 外置表单 : 表单的内容都存放在一个单独的“.form”文件中,可以是任何文本字符,一般用HTML书写,并可以使用UEL占位符已达到动态填充的目的。activiti:formKey属性就是用来制定使用哪个表单文件(扩展名为.form)
动态表单 : 在流程定义文件中设置表单中元素集合包括各种输入框、下拉框等。对应的XML标示如下:<activiti:formProperty id="" name="" type=""></activiti:formProperty> activiti:formProperty可以有多个,对应一个表单中的多个字段。在实际应用中可以通过引擎提供的API读取、提交这些表单元素。
UEL表达式 :有涉及表达式,一般都指UEL

###启动与结束事件Event ####启动事件 每个流程总是以启动事件作为入口(可以是不同类型的启动事件)。启动事件都是捕获型的,等待第三方触发后才可以启动。在Activiti中可以通过调用API触发启动事件。

1)空启动事件
XML描述<startEvent id="" name=""></startEvent>
Activiti扩展属性 : activiti:formKey(用来指定空启动事件关联的表单文件),activiti:initiator(记录启动流程的人的ID,启动流程之后次属性制定的变量缩回自动设值当前人的名称)

2)定时启动事件 :用于一次性定时启动、特定时间间隔后启动。常用于定期循环流程或一次性流程,例如公司每个月要产生一次业绩报表。
XML描述 :

<startEvent id="" name="">  
	<timerEventDefinition>  <!--timeDate, timeDuration, timeCycle-->
		<timerCycle>R1/2012-02-01T00:00</timeCycle>  
	</timerEventDefinition>  
</startEvent>  

3)异常启动事件 : 触发一个异常子流程,但不能通过API方式启动,它总是在另外一个流程抛出异常结束事件的时候被触发。

<startEvent id="" name="">  
	<errorEventDefinition errorRef=""/>   
</startEvent>  

4)消息启动事件 :通过一个消息名称触发,从而启动一个流程实例;还可以结合消息抛出事件一起使用,由流程自动根据消息的名称启动对应的流程。借助这个功能在实际应用中可以为不同的业务处理启动不同的流程。

<startEvent id="" name="">  
	<messageEventDefinition messageRef=""/>  
</startEvent>  

可以通过Activiti提供的API触发消息启动事件,例如runtimeService.startProcessInstanceByMessage("重新发送文件") 可以启动一个包含消息名称为“重新发送文件”的流程。

####结束事件 结束事件表示流程的结束。结束事件总是抛出型的,也就是当前流程执行到结束事件时会抛出一个执行结果。

1)空结束事件 :结束时间是抛出型的,空结束事件不处理抛出结果,也可以理解为抛出一个“空”,所以没有什么需要流程引擎处理的。对于空结束事件,政策结束后流程引擎就不会再执行其他操作了,因为一切都已经结束了,而且没有后续处理(结束时间不能再有输出流)。 <endEvent id="" name=""> 空结束时间一般用于正常结束流程,也就是说流程的执行过程一切都符合预设的业务逻辑,如果需要处理异常就需要使用异常结束事件或边界事件处理。

2)异常结束事件 :是有抛出结果的,需要定义抛出的错误代码,如果找到异常开始事件定义的异常代码,则会触发异常开始事件,否则按照空结束事件规则处理。

<endEvent id="" name="">  
	<errorEventDefinition errorRef=""/>   
</endEvent>

3)终止结束事件 :终止一个流程实例的执行。空结束事件结束的仅仅是一条输出流,而终止事件结束的是整个流程实例。

<endEvent id="" name="">  
	<terminateEventDefinition/>   
</endEvent>

4)取消结束事件 :取消一个事务子流程的执行,同时也只能在子流程中使用。当子流程执行过程中出现异常需要取消时,可以设置一个取消结束事件,当输出流指向到取消结束事件时流程将会中断执行。取消结束事件还可以和取消边界事件配合使用正对取消操作做后续处理。

<endEvent id="" name="">  
	<cancelEventDefinition/>   
</endEvent>

###顺序流Sequence Flow 顺序流是2个模型之间的连接者。在BPMN 2.0规范中每个输出流连接到不同的活动、事件。如果一个元素在流程执行期间被访问,流程会沿着该元素所有输出顺序流继续执行。这意味着BPMN 2.0默认行为是并行的: 多个输出顺序流会创建多条独立、并行的执行路径。

顺序流 :用来连接2个或多个模型建立关系。Activiti还对顺序流进行了扩展,允许在顺序流上添加监听器。
<sequenceFlow id="" sourceRef="" targetRef="" />

条件顺序流 :在标准顺序流上添加了条件表达式,只有满足条件才能通过顺序流到达目标活动。

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

###任务Task 用户,脚本,服务,规则,手动,接收

1)用户任务 : userTask
用户任务需要人来参与,因为它必须被认为触发(完成动作)。用户任务可以定义任务的名称、优先级、到期日和任务处理人(可以是人、组或者两者的组合)。humanPerformer,potentialOwner
Activiti在BPMN 2.0的基础上进行扩展,可以简化设置用户、组的方式,而且支持动态(运行时)获取用户、组分配给用户任务;还可以为用户任务设置创建、分配、完成监听。
activiti:assinee
activiti:cadidateUsers
activiti:cadidateGroups
activiti:dueDate
activiti:priority
监听: extensionElements/activiti:taskListener 选项有create,assignment,complete

2)脚本任务 : scriptTask
scriptFormat: 用来指定符合JSR-233规范的脚本语言的类型:groovy, JavaScript, Juel
activiti:resultvariable: Activiti在原BPMN 2.0规范中的脚本任务基础上进行了扩展,可以把脚本处理的结果保存到一个变量中

3)WebService任务 : serviceTask implementation="##WebService"
通过WebService任务可以调用外部的Web Service资源,
ioSpecification: 定义输入、输出参数
dataInputAssociation: 定义数据输入关系
dataOutputAssociation: 定义数据输出关系

4)业务规则任务 :businessRuleTask
在企业应用中一般都会使用可维护的规则库来管理复杂多变的业务规则,可以把业务逻辑和规则分开维护,一旦规则有变动,只需要更改预设规则即可。业务规则任务可以根据流程变量的值处理预设的业务规则。Avtiviti对业务规则提供很好的支持,目前支持比较流行的JBoss规则引擎——Drools。只需要把含有业务规则的流程文件和规则引擎文件.drl一同打包部署到系统中,同时把Drools的jar添加到classpath即可实现Activiti驱动规则引擎。
avtiviti:rules: 在规则文件.drl中定义的规则名称,多个规则用逗号分隔,要执行规则文件中全部规则,将该属性设置为空即可
activiti:ruleVariablesInput:
activiti:resultVariableName:
activiti:execlude:

5)邮件任务 :serviceTask activiti:type="mail"
通过Avtiviti发送邮件,其中邮件信息通过变量方式传递。邮件任务不属于BPMN2.0也是和Java Script任务类似,由Activiti扩展而来专门用于处理邮件任务。
邮件任务配置统一使用activiti:field元素来配置,name不同表示不同的参数,均支持变量方式指定值: to, from, subject, cc, bcc, charset, text, html

6)Mule任务

7)Camel任务

8)手动任务 :manualTask

9)Java service任务 :serviceTask
Java Service不属于BPMN 2.0规范,而是Activiti扩展的专门应用于Java语言的 serviceTask。
Java Service任务允许定义一个实现了指定接口的Java类,或者执行一个表达式;还可以像脚本任务一样吧结果保存到一个变量中。 在指定一个Java类的同时还可以配置执行Service时传入的变量,这样在执行Java类的时候就可以读取预先设置的变量值。
activiti:class : 实现接口JavaDelegate, ActivityBehavior的Java类
activiti:expression : 使用UEL定义需要执行的任务内容;并且在执行任务的时候可以使用流程变量作为参数
activiti:delegateExpression :功能和activiti:class类似,值不是一个具体的实现类,而是在运行时动态设置。
activiti:resultVariable:

10)Shell任务 : 允许流程运行过程中执行本地操作系统中的脚本、命令,是Activiti基于serviceTask扩展的一种任务activiti:type=shell,使用到的属性:command,arg0-5,wait,redirectError,cleanEnv,outputVariable,errorCodeVariable,errorCodeVariable,directory

11) 接收任务 : receiverTask
在任务创建之后开始等待消息的到来,直到被触发才会完成任务。Activiti实际上把接受任务作为一个Java类型的接受任务,仅能通过RuntimeService接口的singnal()方法发送信号(signal)触发接收任务。原理类似线程的等待和恢复执行,只不过线程是在内存中操作,而接受任务的状态保存在数据库中,在调用Activiti的API触发流程的接受任务后,引擎把当前流程由等待状态恢复为可执行状态。

多实例 :循环
多实例允许业务流程中某一个任务甚至子流程可以重复执行多次,在实际应用中一个申请由多人审批时多实例的典型应用场景。多个实例可以选择顺序执行,还可以选择并行执行多实例任务或子流程。
可获取的变量: nrOfInstances, nrOfActiveInstances, nrOfCompletedInstances, loopCounter.
配置项: loopCardinality, loopDataInputRef, inputDataItem, completionCondition, isSequential, activiti:collection, activiti:elementVariable

###网关Gateway 1)排他网关 : XOR exclusiveGateway
流程执行到该网关,按照输出流的顺序逐个计算,当条件计算结果为true时,继续执行当前网关的输出流。 如果多个线路的计算值都为true,则只会执行第一个true的网关,忽略其他。 如果计算结果都为false,则引擎抛出异常,或默认执行default属性指定的条件顺序流。
排他网关需要和条件顺序配合使用,一个排他网关可以连接多个条件顺序流,每个条件顺序流设置一个条件在运行时由引擎计算并根据结果是否为true决定执行与否。 可以用 if..else if...else来理解XOR

2)并行网关 :parallelGateway
用来对并发的任务进行流程建模,它能把单条路线拆分成多个路径并执行或将多条线路合并。
拆分: 并行执行所有的输出顺序流,并且为每一条顺序流创建一个并行执行路线。
合并: 所有从并行网关拆分并执行完成的线路均在此等候,直到所有的线路都执行完成才继续向下执行。

3)包容网关 :inclusiveGateway
融合了排他网关和并行网关的特性

4)事件网关 :eventBasedGateway
专门为中间捕获事件设置的,它允许设置多个输出流指向多个不同的中间捕获事件。在流程执行到事件网关后,流程处于“等待”状态,因为中间捕获事件需要依赖中间抛出事件触发才能更改“等待”状态为“活动”状态,定时器捕获事件除外(它由时间驱动)。

###子流程subprocess
1)子流程 : subProcess

限制:

  1. 只能且仅能包含一个空启动事件;
    2)至少要有一个结束事件(每个流程都要有始有终);
    3)在子流程中顺序流不能直接设置输出到子流程之外的活动上,如果需要的,可以通过边界事件代替。
    在实际运行中流程引擎会自动为主流程和子流程建立关联关系,子流程可以通过API获取主流程的一些信息及变量。

2)调用活动 : callActivity
调用活动解决的问题是流程的通用性。和子流程的作用一致,但是表现方式不同,使用一个调用活动取代嵌入子流程方式的活动即可,通过创建一个调用活动模型并指定外部流程ID的方式作为主流程的一个子活动。 需要指定输入、输出变量

3)事件子流程 :subProcess triggeredByEvent="true"
和子流程类似,把一系列活动归结到一起处理,不同的是事件子流程不能直接启动,而是要“被动”地由其他的事件触发启动
事件子流程在企业中使用频率很高,它可以由异常事件、信号事件、消息事件、定时事件、补偿事件等触发,从而启动一个子流程
事件子流程和子流程不同,子流程作为主流程中输出流的一个输出活动,而事件子流程是独立在主流程中

4)事务子流程 :transaction
也称事务块, 用来处理一组必须在同一个事务中完成的活动,这些活动要么一起成功,要么一起失败。事务子流程中的活动具有ACID特性,如果其中一个活动失败或取消,则整个事务子流程的所有活动全部回滚。

###边界事件Boundary Event 边界事件是绑定在活动上的“捕获型”事件,会一直监听所有处于运行中活动的某种事件的触发,在捕获到事件之后中断活动,然后从边界事件类型的输出流继续执行。
一旦触发边界事件,当前的活动就会被中断,然后按照边界事件之后的输出流执行。边界事件和所关联的活动有一个特殊的关系“附加”,而且一个活动只能绑定一个边界事件;每个边界事件类型都是通过属性attachedToRef指定“附加”到抛出边界事件的活动上。 所有的边界事件子类型均需要包含在boundaryEvent标签中。cancelActiviti属性可以取true、false,用来指定在捕获到边界事件之后是否取消只需输出流指定的活动。
1)定时器边界事件:timerEventDefinition
需要附属在一个非自动任务、调用活动、子流程上,在上游任务执行完成之后开始倒计时预设的时间,到达预设时间之后触发定时器边界事件的输出流

2)异常边界事件 errorEventDefinition
捕获嵌入子流程或者调用活动抛出的异常。异常在抛出后被主流程的异常边界事件捕获,同时嵌入子流程或调用活动中的活动被中断执行。

3)信号边界事件
信号边界事件可以捕获流程执行过程中抛出的信号,可以“附加”在各种活动和子流程上。
信号边界事件不仅可以捕获本流程的信号,还可以捕获到其他流程的信号事件,而且如果在一个活动或子流程上定义多个信号边界事件并监听同一个信号,则会同时触发,因为对应的信号抛出事件是全局的。

4)取消边界事件
针对事务子流程所设立的,用来捕获子流程中抛出的取消事件,只能和事务子流程结合使用。
注意点: 一个事务子流程只允许附加一个取消边界事件;
如果事务子流程中嵌套了子流程,仅仅触发已经完成了的子流程的补偿事件
对于多实例的事务子流程,如果其中一个实例触发了取消事件,那么其他的实例也同样会被触发取消边界事件

5)补偿边界事件
用于事务子流程中针对事务失败后的业务逻辑进行补偿。

###中间事件Intermediate Event
中间捕获事件intermediateCatchEvent是流程中的“拦路虎”,根据事件的不同类型需要使用不同的方式才能继续执行后续的输出流的活动。

1)定时器中间捕获事件

2)信号中间捕获事件
用来捕获被当前流程或其他流程抛出的信号事件

3)消息中间捕获事件
和信号中间捕获事件类型,不同的是信号事件是“广播式传播,而消息中间捕获是定向一对一的传递,也就是说一次只能把一个消息发送给一个指定的流程实例。

中间抛出事件intermediateThrowEvent和中间捕获事件是2个相互依赖的关系,中间捕获事件需要有事件抛出才能被触发,而中间抛出事件需要有对应的捕获事件接受才有意义。
中间抛出事件一般用在一个任务完成后需要发送通知或执行其他系统任务的场景,工作流引擎会对抛出的事件进行传播(不同类型的事件有不同的作用范围)

1)空中间抛出事件
没有任何功能的事件,因此执行到空中间抛出事件时直接跳过。从业务层面对其理解,可以把它作为中间状态、结果的处理器,可以为它添加监听器

2)信号中间抛出事件
有异步同步的区分sync,决定是否等待信号事件的执行结果而继续执行信号中间抛出事件的输出流。

###监听器Listener
监听器是Avtiviti在BPMN2.0规范基础上扩展的功能,是业务和流程的“非侵入性粘合剂”。在Activiti中开发人员可以通过配置监听器的方式监听各种动作,例如流程启动、结束、任务创建、任务完成,甚至是经过某个顺序流时。
监听器分2类: 执行监听器和任务监听器,和其他的Activiti扩展模型一样,监听器需要包含在BPMN2.0规范的<extendsionElement>标签中。

执行监听器executionListener可以捕获的事件如下:start, end, take

流程实例启动、结束
输出流捕获
活动启动、结束
路由开始、结束
中间事件开始、结束
触发开始事件、触发结束事件

任务监听器taskListener只能用于用户,用来监听3种事件:create,assignment,complete

转载于:https://my.oschina.net/braveCS/blog/704910

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值