最近由於接觸到Activiti工作流引擎,因此粗讀了一下它的源碼。
總結了一些內容如下,這些內容一般的doc上都是沒有提及的。
1. model.Activity與model.Task
- org.activiti.bpmn.model.Task)
- 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
TaskActivityBehavior是一種類型的ActivityBehavior
2. task.Task與task.TaskDefinition
而TaskDefinition.getCandidateGroupIdExpressions()返回的是Set
- 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));
- }
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。
在所有流程實例中,表達式中還可以使用一些默認對象:
-
execution
:DelegateExecution
提供外出執行的額外信息。 -
task
:DelegateTask
提供當前任務的額外信息。注意,只對任務監聽器的表達式有效。 -
authenticatedUserId
:當前登錄的用戶id。如果沒有用戶登錄,這個變量就不可用。
4. task.Task的執行過程
假設是一個UserTask,
task.Task的execute()會
調用它的activityBehavior.execute(execution);
UserTaskActivityBehavior.execute()會根據TaskDefinition構造Task對象
注意這個過程中,會對Task的受托人、候選組、候選用戶等Expression進行getValue()的計算
最后,Task的信息保存入庫