探讨一下iMatrix平台流程引擎时间处理之子流程事件处理

针对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());
}
… … … …
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值