天天看點

Activiti源碼淺析:Activity與Task

最近由于接觸到Activiti工作流引擎,是以粗讀了一下它的源碼。

總結了一些内容如下,這些内容一般的doc上都是沒有提及的。

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

model.Task是模型時期的,task.TaskDefinition是部署時期的,task.Task是運作時期的 

TaskEntity是Task的一個實作類

一個可以了解model.Task和task.TaskDefinition的例子是:

model.UserTask.getCandidateGroups()傳回的是List 

而TaskDefinition.getCandidateGroupIdExpressions()傳回的是Set 

task.Task有如下方法:

TaskDefinition  getTaskDefinition()   

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

protectedvoid 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));  

Activiti使用UEL處理表達式。表達式可以用在很多場景下,比如Java服務任務,執行監聽器,任務監聽器和條件流。

ExpressionManager.createExpression()用以生成Expression

ProcessEngineConfigurationImpl.getExpressionManager()用以傳回ExpressionManager

表達式的值(來自于使用者手冊)

Value expression:解析為值。預設,所有流程變量都可以使用。所有spring bean(spring環境中)也可以使用在表達式中。 一些執行個體:

Method expression:調用一個方法,使用或不使用參數。當調用一個無參數的方法時,記得在方法名後添加空的括号(以區分值表達式)。 傳遞的參數可以是字元串也可以是表達式,它們會被自動解析。例子:

注意這些表達式支援解析原始類型(包括比較),bean,list,數組和map。

在所有流程執行個體中,表達式中還可以使用一些預設對象:

<code>execution</code>:<code>DelegateExecution</code>提供外出執行的額外資訊。

<code>task</code>:<code>DelegateTask</code>提供目前任務的額外資訊。注意,隻對任務監聽器的表達式有效。

<code>authenticatedUserId</code>:目前登入的使用者id。如果沒有使用者登入,這個變量就不可用。

假設是一個UserTask,

task.Task的execute()會

調用它的activityBehavior.execute(execution);

UserTaskActivityBehavior.execute()會根據TaskDefinition構造Task對象

注意這個過程中,會對Task的受托人、候選組、候選使用者等Expression進行getValue()的計算

最後,Task的資訊儲存入庫

本文轉自二郎三郎部落格園部落格,原文連結:http://www.cnblogs.com/haore147/p/5213547.html,如需轉載請自行聯系原作者