iMatrix平臺的子流程中的事件處理情況分析
0
針對iMatrix平臺的子流程中的事件處理研究所得,分享給大家:
![]() 獲得子流程實體的spring bean
當子流程的表單為標準表單時,子表單對應的實體實例是流程引擎通過回調該bean獲得的。這里的bean必須實現接口com.norteksoft.wf.engine.client.OnStartingSubProcess 進入子流程前spring bean
開始子流程前回調該bean。如果該bean不存在,則直接啟動子流程;如果該bean存在,則調用該bean的isIntoSubProcess ()方法。如果該方法返回true,啟動子流程;如果該方法返回false,不進入啟動子流程,主流程將跳過子流程繼續向下執行。這里的bean必須實現接口com.norteksoft.wf.engine.client.BeforeStartSubProcess 子流程結束后返回時的spring bean
當子流程結束返回主流程時,流程引擎將回調該bean。這里的bean必須實現接口com.norteksoft.wf.engine.client.AfterSubProcessEnd。 1 子流程實現是使用了jbpm的custom節點,如下:
<custom name="子流程" g="191,243,80,40" class="com.norteksoft.wf.engine.core.SubProcessService">
… … … …
</custom>
2 當走到該節點時根據jbpm對custom的處理,會自動調用com.norteksoft.wf.engine.core.SubProcessService中的execute方法,同時給jbpm信號,等待子流程結束,當子流程結束時在給主流程繼續流轉的信號,如下:
紅色字體代碼段為:獲得執行的bean名稱、獲得spring容器中的bean、執行該bean中的方法。
”進入子流程前”的處理實現:
public voidexecute(ActivityExecution execution) throws Exception {
… … … …
String beforeStartSubProcessName= DefinitionXmlParse.getBeforeStartSubProcess(subprocessParse.getParentDefinitionId(),subprocessParse.getActivityName());
log.info("實現類的beforeStartSubProcessName:"+beforeStartSubProcessName);
BeforeStartSubProcess beforeStartSubProcess = null;
if(StringUtils.isNotEmpty(beforeStartSubProcessName)){
beforeStartSubProcess = (BeforeStartSubProcess)ContextUtils.getBean(beforeStartSubProcessName);
log.debug("beforeStartSubProcess:"+beforeStartSubProcess);
}
if(beforeStartSubProcess==null || beforeStartSubProcess.isIntoSubProcess(parentWorkflow.getDataId())){
… … … …
//給jbpm信號,等待子流程結束
execution.waitForSignal();
}
… … … …
}
“獲得子流程實體的spring bean”的處理實現:
com.norteksoft.wf.engine.core.SubProcessService中的execute方法為入口,
public voidexecute(ActivityExecution execution) throws Exception {
… … … …
taskService.startSubProcessWorkflow(transactor,subprocessParse,null);
… … … …
}
public void startSubProcessWorkflow(Map<TaskTransactorCondition,String> transactor,SubProcessParse subprocessParse,Collection<String>transcators){
… … … …
String beanName =DefinitionXmlParse.getSubProcessBeginning(subprocessParse.getParentDefinitionId(),subprocessParse.getActivityName());
log.info("實現類的beanname:"+beanName);
OnStartingSubProcessbeginning = (OnStartingSubProcess)ContextUtils.getBean(beanName);
… … … …
//獲得子流程對應的實體
FormFlowable subFormEntity =eginning.getRequiredSubEntity(param);
… … … …
}
“子流程結束后”的處理實現:當子流程結束時,給主流程繼續流轉的信號:
com.norteksoft.wf.engine.core.ProcessEndListener中,
public voidnotify(EventListenerExecution execution) {
… … … …
//設置繼續流轉的信號
executionService.signalExecutionById(workflow.getParentExcutionId(),transitionName);
… … … …
}
當給了該信號后,會走com.norteksoft.wf.engine.core.SubProcessService中的signal方法,在該方法中處理“子流程結束后”的事件:
public voidsignal(ActivityExecution execution, String signalName, Map<String, ?>parameters) throws Exception {
… … … …
String subProcessEndName = DefinitionXmlParse.getSubProcessEnd(subprocessParse.getParentDefinitionId(),subprocessParse.getActivityName());
log.info("實現類的subProcessEndName:"+subProcessEndName);
if(StringUtils.isNotEmpty(subProcessEndName)){
AfterSubProcessEnd afterSubProcessEnd = (AfterSubProcessEnd)ContextUtils.getBean(subProcessEndName);
log.info("subProcessEnd:"+afterSubProcessEnd);
if(afterSubProcessEnd!=null) afterSubProcessEnd.execute(parentWorkflow.getDataId());
}
… … … …
}
|