Activiti源码浅析:Activity与Task

简介:

最近由于接触到Activiti工作流引擎,因此粗读了一下它的源码。

总结了一些内容如下,这些内容一般的doc上都是没有提及的。

1. model.Activity与model.Task

Activity是模型时期对象(想想BPMN文件的那些元素),它有3个子类:CallActivity, SubProcess, Task(注意是
  • org.activiti.bpmn.model.Task)
流程启动的那个活动可以理解成有一个StartEventActivity
Task有N个子类:BusinessRuleTask, ManualTask, ReceiveTask, ScriptTask, SendTask, ServiceTask, UserTask
 
PvmActivity是部署时期对象,ActivityImpl是它的实现类,注意ActivityImpl与Activity没有关系!获取ActivityImpl的方法:
 
[html]  view plain  copy  print  ?  在CODE上查看代码片  派生到我的代码片
  1. public static ActivityImpl getActivity(ProcessEngine processEngine, String processDefId, String activityId)  
  2. {  
  3.     ProcessDefinitionEntity pde = (ProcessDefinitionEntity) ((RepositoryServiceImpl) processEngine  
  4.             .getRepositoryService()).getDeployedProcessDefinition(processDefId);  
  5.     return (ActivityImpl) pde.findActivity(activityId);  
  6. }  

ActivityImpl.getActivityBehavior()可以获取到对应的ActivityBehavior
ActivityBehavior很显然不是一种模型设计时期的对象 
TaskActivityBehavior是一种类型的ActivityBehavior

2. task.Task与task.TaskDefinition

model.Task是模型时期的,task.TaskDefinition是部署时期的,task.Task是运行时期的 
TaskEntity是Task的一个实现类
 
一个可以理解model.Task和task.TaskDefinition的例子是:
model.UserTask.getCandidateGroups()返回的是List 
而TaskDefinition.getCandidateGroupIdExpressions()返回的是Set 
 
task.Task有如下方法:
[html]  view plain  copy  print  ?  在CODE上查看代码片  派生到我的代码片
 
  1. TaskDefinition  getTaskDefinition()   

另外有助于理解的是UserTaskParseHandler的executeParse()方法,它通过解析生成ActivityImpl对象和TaskDefinition对象:

 

[java]  view plain  copy  print  ?  在CODE上查看代码片  派生到我的代码片
  1. protectedvoid executeParse(BpmnParse bpmnParse, UserTask userTask) {  
  2.   ActivityImpl activity = createActivityOnCurrentScope(bpmnParse, userTask, BpmnXMLConstants.ELEMENT_TASK_USER);  
  3.   activity.setAsync(userTask.isAsynchronous());  
  4.   activity.setExclusive(!userTask.isNotExclusive());   
  5.   TaskDefinition taskDefinition = parseTaskDefinition(bpmnParse, userTask, userTask.getId(), (ProcessDefinitionEntity) bpmnParse.getCurrentScope().getProcessDefinition());  
  6.   activity.setProperty(PROPERTY_TASK_DEFINITION, taskDefinition);  
  7.   activity.setActivityBehavior(bpmnParse.getActivityBehaviorFactory().createUserTaskActivityBehavior(userTask, taskDefinition));  
  8. }  

 

3. Expression

Activiti使用UEL处理表达式。表达式可以用在很多场景下,比如Java服务任务,执行监听器,任务监听器和条件流。

ExpressionManager.createExpression()用以生成Expression

ProcessEngineConfigurationImpl.getExpressionManager()用以返回ExpressionManager

 

表达式的值(来自于用户手册)

  • Value expression:解析为值。默认,所有流程变量都可以使用。所有spring bean(spring环境中)也可以使用在表达式中。 一些实例:

    ${myVar}${myBean.myProperty}

     

  • Method expression:调用一个方法,使用或不使用参数。当调用一个无参数的方法时,记得在方法名后添加空的括号(以区分值表达式)。 传递的参数可以是字符串也可以是表达式,它们会被自动解析。例子:

    ${printer.print()}${myBean.addNewOrder('orderName')}${myBean.doSomething(myVar, execution)}

     

 

注意这些表达式支持解析原始类型(包括比较),bean,list,数组和map。

在所有流程实例中,表达式中还可以使用一些默认对象:

  • executionDelegateExecution提供外出执行的额外信息。

  • taskDelegateTask提供当前任务的额外信息。注意,只对任务监听器的表达式有效。

  • authenticatedUserId:当前登录的用户id。如果没有用户登录,这个变量就不可用。

4. task.Task的执行过程

假设是一个UserTask,

task.Task的execute()会

调用它的activityBehavior.execute(execution);

UserTaskActivityBehavior.execute()会根据TaskDefinition构造Task对象

注意这个过程中,会对Task的受托人、候选组、候选用户等Expression进行getValue()的计算

最后,Task的信息保存入库

本文转自二郎三郎博客园博客,原文链接:http://www.cnblogs.com/haore147/p/5213547.html,如需转载请自行联系原作者
相关文章
|
XML 存储 JavaScript
Flowable学习笔记(二、BPMN 2.0-基础 )
Flowable学习笔记(二、BPMN 2.0-基础 )
4741 0
Flowable学习笔记(二、BPMN 2.0-基础 )
|
存储 SQL JSON
Spark - 一文搞懂 parquet
parquet 文件常见于 Spark、Hive、Streamin、MapReduce 等大数据场景,通过列式存储和元数据存储的方式实现了高效的数据存储与检索,下面主要讲parquet 文件在 spark 场景下的存储,读取与使用中可能遇到的坑。......
3054 0
Spark - 一文搞懂 parquet
|
10月前
|
存储 分布式计算 算法
【交替方向乘子法】梯度下降法与交替方向乘子法(ADMM)求解LASSO问题研究(Matlab代码实现)
【交替方向乘子法】梯度下降法与交替方向乘子法(ADMM)求解LASSO问题研究(Matlab代码实现)
350 0
|
设计模式
SpringMVC常见组件之DataBinder数据绑定器分析
SpringMVC常见组件之DataBinder数据绑定器分析
807 0
|
druid Java 关系型数据库
SpringBoot 的多数据源配置
SpringBoot 的多数据源配置
2551 0
SpringBoot 的多数据源配置
|
分布式计算 监控 大数据
什么是 Spark Driver,它的职责是什么?
【8月更文挑战第14天】
1181 5
|
Windows
Windows 程序自启动实现方法详解
Windows 程序自启动实现方法详解
768 0
|
XML Java 数据库连接
MyBatis参数映射问题解决教程: org.apache.ibatis.type.TypeException: Error setting non null for parameter #1 wit
MyBatis参数映射问题解决教程: org.apache.ibatis.type.TypeException: Error setting non null for parameter #1 wit
2093 1
|
Web App开发 XML JavaScript
【原创】淘宝关键词搜索爬取与解析
【原创】淘宝关键词搜索爬取与解析
1303 0
【原创】淘宝关键词搜索爬取与解析