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的方法:

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

    posted on 2014-10-30 23:14  白乔  阅读(...)  评论(...编辑  收藏

    导航

    统计