前面我們通過BPMN20.xsd和Activiti自定義的XML Schema文件初步了解了業務流程模型的定義,那么現在我們來了解一下流程文檔的解析過程,這個過程主要是通過代碼解析來完成。
代碼解析過程
就代碼解析還是承接《業務流程部署》一篇的“代碼10”的片段來說吧。在解析之前我們先來看看Activiti5.3的微內核類圖結構

圖1
(一)解析StartEvents
根據“代碼10”的代碼片段,我們先看parseStartEvents(scopeElement, parentScope)的解析過程,該解析過程主要是創建startEventActivity實例,並將其放入流程定義processDefinition內。
parseStartEvents執行的主要過程:
- 解析並創建startEventActivity實例。
- 設置流程定義的初始化節點。
- 解析並創建startFormHandler實例。
- 設置流程定義的startFormHandler。
- 解析Activiti-5.2擴展的initiator屬性,並將其設置到流程定義的屬性列表里。
- 為startEventActivity設置活動行為執行器(NoneStartEventActivityBehavior)。
上面提到了活動行為執行器,活動行為執行器的作用主要是執行流程轉移的。這里我們查看一下activiti5.3流程引擎中的活動行為執行器的類結構圖

圖2

圖3

圖4

圖5

圖6
從圖2-圖6我們可以看出活動行為執行器的類結構及其相互關系。
(二)解析Activities
現在我們再看parseActivities(scopeElement,parentScope)的解析過程,該解析過程主要解析exclusiveGateway、 parallelGateway、scriptTask、serviceTask、businessRuleTask、task、manualTask、userTask、sendTask、receiveTask、subProcess、callActivity。現在我們一次看上面各種節點的解析過程。
parseExclusiveGateway執行的主要過程:
- 解析並創建ActivityImpl實例activity,創建的過程中主要依賴的屬性是“id”,該屬性在所有的Activity中不允許重復。
- 為activity對象設置活動行為執行器(ExclusiveGatewayActivityBehavior)。
- 解析並創建ExecutionListener的實例,同時將其設置到actvity實例內。
parseParallelGateway執行的主要過程:
- 解析並創建ActivityImpl實例activity,創建的過程中主要依賴的屬性是“id”,該屬性在所有的Activity中不允許重復。
- 為activity對象設置活動行為執行器(ParallelGatewayActivityBehavior)。
- 解析並創建ExecutionListener的實例,同時將其設置到actvity實例內。
parseScriptTask執行的主要過程:
- 解析並創建ActivityImpl實例activity,創建的過程中主要依賴的屬性是“id”,該屬性在所有的Activity中不允許重復。
- 獲取子元素script及其文本內容,獲取scriptFormat屬性值,默認為juel,獲取resultVariable屬性值,這步主要是為第3步做准備。
- 為activity對象設置活動行為執行器(ScriptTaskActivityBehavior)。
- 解析並創建ExecutionListener的實例,同時將其設置到actvity實例內。
parseServiceTask執行的主要過程:
- 解析並創建ActivityImpl實例activity,創建的過程中主要依賴的屬性是“id”,該屬性在所有的Activity中不允許重復。
- 分別獲取元素屬性type、class、expression、delegateExpression、resultVariable、implementation、operationRef的值。
- 為activity對象設置活動行為執行器(ScriptTaskActivityBehavior)。
- 解析並創建ExecutionListener的實例,同時將其設置到actvity實例內。
parseBusinessRuleTask執行的主要過程:
- 解析並創建ActivityImpl實例activity,創建的過程中主要依賴的屬性是“id”,該屬性在所有的Activity中不允許重復。
- 初始化BusinessRuleTaskActivityBehavior實例ruleActivity並為其設置相關屬性。
- 為activity對象設置活動行為執行器(BusinessRuleTaskActivityBehavior)。
- 解析並創建ExecutionListener的實例,同時將其設置到actvity實例內。
parseTask執行的主要過程:
- 解析並創建ActivityImpl實例activity,創建的過程中主要依賴的屬性是“id”,該屬性在所有的Activity中不允許重復。
- 為activity對象設置活動行為執行器(TaskActivityBehavior)。
- 解析並創建ExecutionListener的實例,同時將其設置到actvity實例內。
parseManualTask執行的主要過程:
- 解析並創建ActivityImpl實例activity,創建的過程中主要依賴的屬性是“id”,該屬性在所有的Activity中不允許重復。
- 為activity對象設置活動行為執行器(ManualTaskActivityBehavior)。
- 解析並創建ExecutionListener的實例,同時將其設置到actvity實例內。
parseUserTask執行的主要過程:
- 解析並創建ActivityImpl實例activity,創建的過程中主要依賴的屬性是“id”,該屬性在所有的Activity中不允許重復。
- 初始化UserTaskActivityBehavior實例userTaskActivity並為其設置相關屬性。
- 為activity對象設置活動行為執行器(UserTaskActivityBehavior)。
- 解析並創建ExecutionListener的實例,同時將其設置到actvity實例內。
parseSendTask執行的主要過程:
- 解析並創建ActivityImpl實例activity,創建的過程中主要依賴的屬性是“id”,該屬性在所有的Activity中不允許重復。
- 為activity對象設置活動行為執行器(WebServiceActivityBehavior)。
- 解析並創建ExecutionListener的實例,同時將其設置到actvity實例內。
parseReceiveTask執行的主要過程:
- 解析並創建ActivityImpl實例activity,創建的過程中主要依賴的屬性是“id”,該屬性在所有的Activity中不允許重復。
- 為activity對象設置活動行為執行器(ReceiveTaskActivityBehavior)。
- 解析並創建ExecutionListener的實例,同時將其設置到actvity實例內。
parseSubProcess執行的主要過程:
- 解析並創建ActivityImpl實例activity,創建的過程中主要依賴的屬性是“id”,該屬性在所有的Activity中不允許重復。
- 為activity對象設置活動行為執行器(SubProcessActivityBehavior)。
- 解析並創建ExecutionListener的實例,同時將其設置到actvity實例內。
parseCallActivity執行的主要過程:
- 解析並創建ActivityImpl實例activity,創建的過程中主要依賴的屬性是“id”,該屬性在所有的Activity中不允許重復。
- 初始化CallActivityBehavior實例callActivityBehaviour並為其設置相關屬性。
- 為activity對象設置活動行為執行器(CallActivityBehavior)。
- 解析並創建ExecutionListener的實例,同時將其設置到actvity實例內。
parseIntermediateCatchEvent執行的主要過程:
- 解析並創建ActivityImpl實例activity,創建的過程中主要依賴的屬性是“id”,該屬性在所有的Activity中不允許重復。
- 為activity對象設置活動行為執行器(IntermediateCatchEventActivitiBehaviour)。
(三)解析EndEvents
parseEndEvents執行的主要過程:
- 解析並創建ActivityImpl實例activity,創建的過程中主要依賴的屬性是“id”,該屬性在所有的Activity中不允許重復。
- 為activity對象設置活動行為執行器(NoneEndEventActivityBehavior)。
(四)解析BoundaryEvents
(五)解析SequenceFlow
(六)解析ExecutionListeners
