最近由于接触到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的方法:

    	public static ActivityImpl getActivity(ProcessEngine processEngine, String processDefId, String activityId)
    {
    ProcessDefinitionEntity pde = (ProcessDefinitionEntity) ((RepositoryServiceImpl) processEngine
    .getRepositoryService()).getDeployedProcessDefinition(processDefId);
    return (ActivityImpl) pde.findActivity(activityId);
    }

    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<String>

    而TaskDefinition.getCandidateGroupIdExpressions()返回的是Set<Expression>

    task.Task有如下方法:
    TaskDefinition	getTaskDefinition() 

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

      protected void executeParse(BpmnParse bpmnParse, UserTask userTask) {
    ActivityImpl activity = createActivityOnCurrentScope(bpmnParse, userTask, BpmnXMLConstants.ELEMENT_TASK_USER); activity.setAsync(userTask.isAsynchronous());
    activity.setExclusive(!userTask.isNotExclusive()); TaskDefinition taskDefinition = parseTaskDefinition(bpmnParse, userTask, userTask.getId(), (ProcessDefinitionEntity) bpmnParse.getCurrentScope().getProcessDefinition());
    activity.setProperty(PROPERTY_TASK_DEFINITION, taskDefinition);
    activity.setActivityBehavior(bpmnParse.getActivityBehaviorFactory().createUserTaskActivityBehavior(userTask, taskDefinition));
    }

    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的信息保存入库

    Activiti源码浅析:Activity与Task的更多相关文章

    1. Activiti源码浅析:Activiti的活动授权机制

      1. IdentityLink与TaskEntity An identity link is used to associate a task with a certain identity. For ...

    2. Android开发之Theme、Style探索及源码浅析

      1 背景 前段时间群里有伙伴问到了关于Android开发中Theme与Style的问题,当然,这类东西在网上随便一搜一大把模板,所以关于怎么用的问题我想这里也就不做太多的说明了,我们这里把重点放在理解 ...

    3. Android源码浅析(四)——我在Android开发中常用到的adb命令,Linux命令,源码编译命令

      Android源码浅析(四)--我在Android开发中常用到的adb命令,Linux命令,源码编译命令 我自己平时开发的时候积累的一些命令,希望对你有所帮助 adb是什么?: adb的全称为Andr ...

    4. 【深入浅出jQuery】源码浅析--整体架构

      最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美. 其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性,在浏览器的兼容性(功能缺陷.渐 ...

    5. 【深入浅出jQuery】源码浅析2--奇技淫巧

      最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美. 其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性,在浏览器的兼容性(功能缺陷.渐 ...

    6. Struts2源码浅析-ConfigurationProvider

      ConfigurationProvider接口 主要完成struts配置文件 加载 注册过程 ConfigurationProvider接口定义 public interface Configurat ...

    7. (转)【深入浅出jQuery】源码浅析2--奇技淫巧

      [深入浅出jQuery]源码浅析2--奇技淫巧 http://www.cnblogs.com/coco1s/p/5303041.html

    8. HashSet其实就那么一回事儿之源码浅析

      上篇文章<HashMap其实就那么一回事儿之源码浅析>介绍了hashMap,  本次将带大家看看HashSet, HashSet其实就是基于HashMap实现, 因此,熟悉了HashMap ...

    9. Android 手势识别类 ( 三 ) GestureDetector 源码浅析

      前言:上 篇介绍了提供手势绘制的视图平台GestureOverlayView,但是在视图平台上绘制出的手势,是需要存储以及在必要的利用时加载取出手势.所 以,用户绘制出的一个完整的手势是需要一定的代码 ...

    随机推荐

    1. 2014-02-27WPF学习笔记

      //StackPanel布局 //创建时间:11:33 页面布局:Orientation默认纵向:Vertical水平为:Horizontal <Button> <Button.Co ...

    2. BNUOJ-29365 Join in tasks 简单数学

      题目链接:http://www.bnuoj.com/bnuoj/problem_show.php?pid=29365 首先排序,然后维护一个后缀,等差求下和就可以了.. //STATUS:C++_AC ...

    3. cadence16.6 中orcad导出网表时ERROR (ORCAP-5004)(win7 旗舰版32位)

      1,选择开始>运行,打开运行窗口.2,输入cmd,打开命令行窗口.3,进入cmd,找到orpxllite.ocx和orTrueReuse.ocx的所在的目录4,输入以下命令:regsvr32 & ...

    4. hdoj 5194 DZY Loves Balls【规律&&gcd】

      题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5194 题意:给你n个黑球,m个白球,每次从中随机抽取一个,如果抽到黑球记为1如果抽出来白球记为0,让你 ...

    5. session 重写进入redis测试

      在实际业务中,当session存储过多 或者操作频繁,业务逐渐扩展的时候,文件存储已经无法满足session操作速度和需求,可以考虑用数据库或者nosql的redis来存储session,本文讲解如何 ...

    6. 【STL源码学习】细品vector

      第一节:vector简介 vector是一种典型的类模板,使用的时候必须进行实例化. vector的数据存储在数组上,支持随机访问迭代器,支持下标操作[]和at操作,支持手动扩容和自动容量增长. ve ...

    7. ECSHOP在线手册布局参考图--文章列表页 article_cat.dwt

          A.购物车 1,设置方法 程序自动读取购物车的商品数量 2,代码相关 cart.lbi 中 {insert_scripts files='transport.js'} <div clas ...

    8. MySQL的安装——源码方式(实验环境下测试用,真实环境请忽略此文)

      #虚拟机是最初的的系统,我们在虚拟机里安装scp [root@serv01 ~]# yum install /usr/bin/scp -y #安装过程略 #我们拷贝MySQL的源码包到目标机的/roo ...

    9. 【转】phpmyadmin万能密码漏洞

      影响版本:2.11.3 / 2.11.4 利用方法:用户名处写入‘localhost’@'@”则登录成功. (注意全部是英文标点符号,最后一个为英文双引号) 附上几个php爆绝对路径的办法: phpM ...

    10. 别名的应用(New-Alias)

      New-Alias -name appcmd -value $env:windir\system32\inetsrv\appcmd.exe 这样就可以在当前PS环境下直接使用appcmd了