最近由于接觸到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,如需轉載請自行聯系原作者