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的方法:
 
[html]  view plain  copy  print  ?  在CODE上查看代碼片  派生到我的代碼片
  1. public static ActivityImpl getActivity(ProcessEngine processEngine, String processDefId, String activityId)  
  2. {  
  3.     ProcessDefinitionEntity pde = (ProcessDefinitionEntity) ((RepositoryServiceImpl) processEngine  
  4.             .getRepositoryService()).getDeployedProcessDefinition(processDefId);  
  5.     return (ActivityImpl) pde.findActivity(activityId);  
  6. }  

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 
而TaskDefinition.getCandidateGroupIdExpressions()返回的是Set 
 
task.Task有如下方法:
[html]  view plain  copy  print  ?  在CODE上查看代碼片  派生到我的代碼片
 
  1. TaskDefinition  getTaskDefinition()   

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

 

[java]  view plain  copy  print  ?  在CODE上查看代碼片  派生到我的代碼片
  1. protectedvoid executeParse(BpmnParse bpmnParse, UserTask userTask) {  
  2.   ActivityImpl activity = createActivityOnCurrentScope(bpmnParse, userTask, BpmnXMLConstants.ELEMENT_TASK_USER);  
  3.   activity.setAsync(userTask.isAsynchronous());  
  4.   activity.setExclusive(!userTask.isNotExclusive());   
  5.   TaskDefinition taskDefinition = parseTaskDefinition(bpmnParse, userTask, userTask.getId(), (ProcessDefinitionEntity) bpmnParse.getCurrentScope().getProcessDefinition());  
  6.   activity.setProperty(PROPERTY_TASK_DEFINITION, taskDefinition);  
  7.   activity.setActivityBehavior(bpmnParse.getActivityBehaviorFactory().createUserTaskActivityBehavior(userTask, taskDefinition));  
  8. }  

 

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM