• iMatrix平臺的子流程中的事件處理情況分析

    0
    針對iMatrix平臺的子流程中的事件處理研究所得,分享給大家:
    獲得子流程實體的spring bean
    當子流程的表單為標準表單時,子表單對應的實體實例是流程引擎通過回調該bean獲得的。這里的bean必須實現接口com.norteksoft.wf.engine.client.OnStartingSubProcess
      進入子流程前spring bean
    開始子流程前回調該bean。如果該bean不存在,則直接啟動子流程;如果該bean存在,則調用該beanisIntoSubProcess ()方法。如果該方法返回true,啟動子流程;如果該方法返回false,不進入啟動子流程,主流程將跳過子流程繼續向下執行。這里的bean必須實現接口com.norteksoft.wf.engine.client.BeforeStartSubProcess
    子流程結束后返回時的spring  bean
    當子流程結束返回主流程時,流程引擎將回調該bean。這里的bean必須實現接口com.norteksoft.wf.engine.client.AfterSubProcessEnd
    子流程實現是使用了jbpmcustom節點,如下:
    <custom   name="子流程"   g="191,243,80,40" class="com.norteksoft.wf.engine.core.SubProcessService">
    … … … …
    </custom>
    當走到該節點時根據jbpmcustom的處理,會自動調用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());
    }
    … … … …
    }

    相似問題

    相關經驗

    相關資訊

    相關文檔

  • sesese色