对iMatrix平台流程引擎事件处理之环节事件处理的进一步见解

随着对iMatrix平台的进一步认识,下面是对环节属性中的事件处理的进一步研究,给大家分享下,
环节的办理前、办理后事件处理。
1 提交前



   iMatrix平台的提交前执行url:用于交互完成任务,比如下一环节的办理人需要当前环节的办理人选择确定,选完办理人后调用交互完成任务的api  completeInteractiveWorkflowTask完成任务。
执行方法:设置任务完成前需要执行的处理类,在该类中可以对业务数据做处理等。处理类需要实现的接口为com.norteksoft.wf.engine.client.BeforeTaskSubmit。“spring bean的名称“表示设置对应处理类在spring容器中的bean名。当办理前接口返回true时,则任务正常办理;返回false时,任务将不能够正常完成,同时办理任务返回结果MESSAGE,其消息内容为设置的”执行失败后提示信息“(表示提示当前办理人的信息)。
代码解析如下:
TaskService.java中的complete方法是完成任务的最终实现方法,提交时关于事件的处理代码如下:
private CompleteTaskTipType complete(WorkflowTask task, TaskProcessingResult operation,TaskSetting setting){
… … … …
//办理前是否需要指定办理人。如果设置了提交前执行url,则以下代码返回值为枚举类CompleteTaskTipType .RETURN_URL,同时将设置的url放在该枚举的content变量中。
result = getBeforeTaskSubmitUrl(task,operation,setting);
… … … …
//办理前执行事件处理
result = beforSubmit(task,operation);

… … … …
}

红色字体代码段为:获得执行的bean名称、获得spring容器中的bean、执行该bean中的方法。
private CompleteTaskTipType beforSubmit(WorkflowTask task, TaskProcessingResult operation){
… … … …
String beanName = DefinitionXmlParse.getBeforeTaskSubmitImpClassName(wi.getProcessDefinitionId(), task.getName());
if(StringUtils.isNotEmpty(beanName)){
BeforeTaskSubmit obj = (BeforeTaskSubmit) ContextUtils.getBean(beanName);
if(obj==null){
log.debug("执行任务提交前事件 时,bean不能为null");
throw new RuntimeException("执行任务提交前事件 时,bean不能为null");
}
boolean result = obj.execute(wi.getDataId(),operation);
if(!result){
  return CompleteTaskTipType.MESSAGE.setContent(DefinitionXmlParse.getBeforeTaskSubmitResultMessage(wi.getProcessDefinitionId(), task.getName()));
}
}
return null;
}
2 提交后

设置任务完成时需要执行的处理类 ,在该类中可以对业务数据做处理等。处理类需要实现的接口为com.norteksoft.wf.engine.client.AfterTaskCompleted。“spring bean的名称“表示设置对应处理类在spring容器中的bean名。
代码解析如下:
private CompleteTaskTipType complete(WorkflowTask task, TaskProcessingResult operation,TaskSetting setting){
… … … …
result=executionCompanyTask(task, operation,setting);
… … … …
}

private CompleteTaskTipType executionCompanyTask(WorkflowTask task, TaskProcessingResult operation,TaskSetting setting){
… … … …
completeTaskTipType = completeWfTask(instance,task, parentExecutionId);
… … … …
}

Private  CompleteTaskTipType  completeWfTask(WorkflowInstance instance,WorkflowTask task, String parentExecutionId){
… … … …
completeTask(task);
… … … …
}

private void completeTask(WorkflowTask task){
.. … … …
executeAfterTaskCompleted(task);
}


红色字体代码段为:获得执行的bean名称、获得spring容器中的bean、执行该bean中的方法。
private void executeAfterTaskCompleted(WorkflowTask task){
… … … …
String beanName = DefinitionXmlParse.getAfterTaskCompletedBean(
  instance.getProcessDefinitionId(), task.getName());
if(!StringUtils.isEmpty(beanName)){
AfterTaskCompleted bean = (AfterTaskCompleted) ContextUtils.getBean(beanName);
if(bean==null){log.debug("任务完成后执行bean时,bean不能为null");throw new RuntimeException("任务完成后执行bean时,bean不能为null");}
bean.execute(instance.getDataId(), task.getTaskProcessingResult());
}
}

猜你喜欢

转载自winter-leo.iteye.com/blog/1915354