activiti 源码笔记之startProcess
2016-02-24 16:23
851 查看
![](http://www.cnblogs.com/haore147/p/file:/C:/Users/ADMINI~1.MHP/AppData/Local/Temp/enhtmlclip/UKR$126%7BU3F0A_KH6T01WZM.jpg)
rumtimeService.startProcessInstanceByXX方法将启动流程的任务委派给StartProcessInstanceCmd,此时会根据rumtimeService.startProcessInstanceByXX的XX来用不同的变量构造StartProcessInstanceCmd实例然后执行execute方法,StartProcessInstanceCmd的构造器如下.
(1) processDefinitionKey
在bpmn20.xml中定义流程元素的id
[align=left] < process id ="loanReuqest" name ="Process to handle a loan request">[/align]
[align=left] [/align]
[align=left](2)processDefinitionId[/align]
[align=left] 对应流程数据库中act_re_procdef中的主键[/align]
![](http://www.cnblogs.com/haore147/p/file:/C:/Users/ADMINI~1.MHP/AppData/Local/Temp/enhtmlclip/BG$~%60%60$EA%%JM051F674~FO.jpg)
[align=left](3)businessKey[/align]
[align=left] 关联的业务主键,用于自定义扩展,引擎本身没有用到.[/align]
[align=left] [/align]
[align=left](4)variables[/align]
[align=left] 流程变量[/align]
[align=left] [/align]
[align=left]execute的执行逻辑如下[/align]
[align=left](1) 根据processDefinitionKey或proceeDefinitionId在已发布的流程定义中查找,它是先查找缓冲中的流程定义然后再去数据库中查找以便提高效率,如果找不到或找到的流程定义被挂起将抛出运行时异常ActivitiException.[/align]
[align=left]deploymentCache.findDeployedProcessDefinitionById?Key( processDefinitionId?Key);[/align]
[align=left](2)创建流程实例[/align]
[align=left]ExecutionEntity processInstance = processDefinition.createProcessInstance(businessKey);[/align]
[align=left]创建流程实例的过程是比较复杂的。[/align]
![](http://www.cnblogs.com/haore147/p/file:/C:/Users/ADMINI~1.MHP/AppData/Local/Temp/enhtmlclip/Image(1).png)
[align=left]首先流程在创建时必须有一个类型为ActivityImpl的initial变量.[/align]
![](http://www.cnblogs.com/haore147/p/file:/C:/Users/ADMINI~1.MHP/AppData/Local/Temp/enhtmlclip/Image(2).png)
[align=left]这里为了方便理解暂且可以把ActivityImpl理解为流程中的每个节点元素(除了任务外整个一个流程也可理解为一个节点)的抽象.[/align]
[align=left]它有如下属性:[/align]
[align=left]public class ActivityImpl extends ScopeImpl implements PvmActivity, HasDIBounds {[/align]
[align=left] [/align]
[align=left] private static final long serialVersionUID = 1L;[/align]
[align=left] protected List< TransitionImpl> outgoingTransitions = new ArrayList<TransitionImpl>();[/align]
[align=left] protected Map<String, TransitionImpl> namedOutgoingTransitions = new HashMap<String, TransitionImpl>();[/align]
[align=left] protected List< TransitionImpl> incomingTransitions = new ArrayList<TransitionImpl>();[/align]
[align=left] protected ActivityBehavior activityBehavior;[/align]
[align=left] protected ScopeImpl parent;[/align]
[align=left] protected boolean isScope ;[/align]
[align=left] protected boolean isAsync ;[/align]
[align=left] protected boolean isExclusive ;[/align]
[align=left] [/align]
[align=left] // Graphical information[/align]
[align=left] protected int x = -1;[/align]
[align=left] protected int y = -1;[/align]
[align=left] protected int width = -1;[/align]
[align=left] protected int height = -1;[/align]
[align=left] [/align]
[align=left]...........................................[/align]
[align=left]}[/align]
[align=left]比较重要的属性包括此流程元素的进入、离开路径和此活动对应的行为(有了这些我们甚至可以在运行时改变流程的运转和行为),每种不同的流程元素都有不同的行为,actityBehavior实现了当流转到此节点时对应的处理逻辑.[/align]
[align=left] [/align]
[align=left]创建流程时initial一般指各种开始事件,我这里单步调试时用了最简单的StartEvent,下面是它activitiBehavior类,[/align]
[align=left]public class NoneStartEventActivityBehavior extends FlowNodeActivityBehavior {[/align]
[align=left] [/align]
[align=left] // Nothing to see here.[/align]
[align=left] // The default behaviour of the BpmnActivity is exactly what[/align]
[align=left] // a none start event should be doing.[/align]
[align=left]}[/align]
[align=left]它只是为了语义而定义的类,它没在父类FlowNodeActivityBehavior的基础上添加任何额外属性和方法.FlowNodeActivityBehavior是所有bpmn元素的超类,FlowNodeActivityBehavior的默认只是离开此节点,而不做任何额外处理.[/align]
[align=left]ProcessDefinitionImpl的newProcessInstance是真正创建流程实例的地方,它使用下面这个以activityImpl为参数的构造器创建ExecutionEntity对象.这里和ProcessInstance的继承关系可以看到一个流程实例实际上也是一个执行实例,从逻辑上理解一个流程实例也就是一个可执行的路径.当然反过来说就不对了,执行实例不仅仅单指流程实例.[/align]
[align=left]public ExecutionEntity(ActivityImpl activityImpl) {[/align]
[align=left] this. startingExecution = new StartingExecution(activityImpl);[/align]
[align=left]}[/align]
[align=left]在创建流程后会在流程数据库中插入一条ExecutionEntity数据,在act_ru_execution表中可以看到这个execution的id和proc_inst_id的值是一样的[/align]
[align=left] [/align]
[align=left]在完成流程实基本例化后,对此流程实例的变量再进行一些初始化[/align]
[align=left] processInstance.setProcessDefinition( this);[/align]
[align=left] processInstance.setProcessInstance(processInstance);[/align]
[align=left] processInstance.initialize();[/align]
[align=left]前两行代码的操作很简单,第三行的initialize方法又是有些复杂的.它负责设置流程的变量、任务、调度任务、订阅事件等,它这涉及到流程引擎的范围体系,需要另开文章好好分析.[/align]
[align=left](3)启动流程[/align]
[align=left]processInstance.start();[/align]
[align=left] [/align]
[align=left]public void start() {[/align]
[align=left] if( startingExecution == null && isProcessInstanceType()) {[/align]
[align=left] startingExecution = new StartingExecution(processDefinition .getInitial());[/align]
[align=left] }[/align]
[align=left] performOperation (AtomicOperation. PROCESS_START);[/align]
[align=left]}[/align]
[align=left]在activiti里一个动作都将对应一种行为,启动流程的动作将执行PROCESS_START的原子操作[/align]
[align=left] if(executionOperation.isAsync( this )) {[/align]
[align=left] scheduleAtomicOperationAsync(executionOperation);[/align]
[align=left] } else {[/align]
[align=left] performOperationSync(executionOperation);[/align]
[align=left] } [/align]
[align=left]如果是异步的就在调度线程池中拿到线程执行,否则就在当前线程内执行[/align]
[align=left] [/align]
[align=left]以下是activiti原子操作的类型[/align]
[align=left] [/align]
[align=left] [/align]
[align=left] [/align]
[align=left]AtomicOperationProcessStart做的事情不多,它只是触发了所有它范围内绑定的所有监听,这也是所有原子操作的基本默认行为[/align]
相关文章推荐
- PHP-xml-1
- PHP与MySQL学习笔记9:创建Web数据库
- php对象在内存中创建于释放
- matplotlib Note
- PHP获取远程文件的几种方式
- 将H264码流打包成RTP包
- InputStream和OutputStream之间的区别
- PHP filesystem attack vectors
- PHP filesystem attack vectors - Take Two
- php 把数据导成excel格式
- PHP字符串函数(2)
- PhpStorm 10.0.3 破解
- Thinkphp 联表查询 表名要全名
- PHP Warning: PHP Startup: Unable to load dynamic library '/usr/lib64/php/modules/module.so'
- PhpExcel中文帮助手册|PhpExcel使用方法
- PHP PDO prepare()、execute()和bindParam()方法详解
- Yii 1.1 过滤器原理学习
- Model View Controller(MVC) in PHP
- [我的PHP之旅] YII框架学习 02.控制器 视图 模型
- PHP使用数据库的并发问题