definition=getDefinitionByName(definitionName); nextProcessInstance.getContextInstance().setTransientVariable(BpmContant.BPM_RULE_PRE_NODENAME, taskInstance.getContextInstance().getTransientVariable(BpmContant.BPM_RULE_PRE_NODENAME)); nextProcessInstance.getContextInstance().setVariable(\, usercode); nextProcessInstance.getContextInstance().setVariable(\, parentId); nextProcessInstance.getContextInstance().setVariable(BpmContant.BPM_RULE_PARENTTASK, taskInstance.getId()) nextProcessInstance.getRootToken().signal(); TaskInstance nextTaskInstance=getTaskInstanceByToken(nextProcessInstance.getTaskMgmtInstance(),nextProcessInstance.getRootToken()); if (flag){ nextTaskInstance.start(); } context.save(nextProcessInstance); return createWorkflowTask(taskInstance, } ProcessInstance nextProcessInstance=new ProcessInstance(definition); nextTaskInstance,null); }); } 此方法的最后也是同报案环节,记载必要的信息到中间表对象中,便于用户保存及提供给下一环节的使用。
5.2.2.3 查勘环节
查勘环节要做的主要任务是开启一个并行的任务分支:定损和立案。在JBPM中此处体现为一个fork节点,fork的转向不同于普通的task-node节点,fork节点的转向是2个(也可以是多个,视需求而定),当任务流转至此时,它会并行的发起两个任务,同时向下流转。在查勘环节的service中调用JBPMEngine的dealFork方法,此方法要求传入两个参数,当前节
点的任务号和进入fork节点的那个转向名称。样本程序中这个转向名称叫做“toFork”(可以在第二个模板的流程图中看到)。下面是该方法的方法体: @SuppressWarnings(\) public List
5.2.2.4 定损环节
立案环节和定损环节类似,他们二者同是从查勘那个fork节点并行分出来的两个子任务,并且同是流向同一个join节点,在两个任务同是到达join节点后,流程继续向下进行,在样本程序中即是流向了结案节点。此处需要说明的是,在实际的开发过程中,可以视实际的需求将此处的join节点改变类型,可以实现异步流转,也就是说不必等待两个任务同时流转到join,先到的任务可以接着向下进行。
5.2.2.5 结案环节
结案环节是本流程的最后一个节点,它并没有什么需要特殊处理的地方,只需要开启流程进行正常的流程处理以返回中间表对象,然后结束全流程。在结案的service中调用了JBPMEngine的endProcess方法,该方法要求传入两个参数,模板名称和任务号。下面给出了该方法的具体实现:
public BpmTask endProcess(final String definitionName,final String taskId){ return (BpmTask)jbpmTemplate.execute(new JbpmCallback(){ public BpmTask doInJbpm(JbpmContext context) { TaskInstance taskInstance=context.loadTaskInstance(new ProcessInstance processInstance = Long(taskId)); taskInstance.getToken().getProcessInstance(); // create the start task if one exists Token token = processInstance.getRootToken(); token.end(); TaskInstance nexttaskInstance=getTaskInstanceByToken(processInstance.getTaskMgmtInstance(),token); context.save(processInstance); return createWorkflowTask(null, nexttaskInstance,null);
} });
} 5.2.3 相关的配置说明
5.5.3.1
模板发布的配置
工作流模板设计好后,在applicationContext-bpm文件中配置一下即可发布。如下代码
在value项中输入模板文件的相对路径后,重启服务即可完成模板的发布,需要注意的是在模板发布成功后,要把相关的value项去掉,以免下次重启服务时又进行模板发布的操作,引起错误。
5.5.3.2 ActionHandler的配置
ActionHandler是JBPM中开放给开发人员的一个接口,我们可以在流程进行的过程中在必要的时候嵌入我们的业务操作。在样本程序中,模板设计时在流程进入节点时都会触发一个对应的ActionHandler,我们可以在里面根据需要编写自己的业务代码。在实际开发过程中可以根据需要自定义ActionHandler,它也是一个普通的java类,只需要实现ActionHandler接口并且重写execute方法,然后在该方法的内部编写业务逻辑。在Arch4框架中由于JBPM是基于spring的整合,所以所有的ActionHandler都被当做一个bean来配置,同样是在
applicationContext-bpm.xml文件中,配置一个bean,class属性中写该ActionHandler的包名+类名即可。如下面配置的调度的ActionHandler:
5.2.4 相关辅助类的说明
5.5.4.1
ProcessName
保存有全部工作流模板名称的静态常量的类。
5.5.4.2 UtilService
该类提供了三个查找案件的方法,只是查询条件不同,分别是根据报案号、根据报案号和当前的节点名称和查找全部案件。代码如下:
findCase findCaseByRegistNo 查找全部案件 根据报案号查找案件 根据报案号和当前节点名茶查找案件 findCaseByRegistNoAndNodeName
5.5.4.3 BpmBusinessRelationService
一个接口,提供了一个保存中间表对象的方法,JbpmBusinessRelationServiceImpl是
它的一个实现类。可以通过这个类去调用它的saveRelation方法,保存中间表对象。 public void saveRelation(WbusinessCmain wbusinessCmain)
5.5.4.4 WbusinessCmain
最重要的一个中间表实体类,它对应prplbpmmain表。 属性名称 Id Processid Taskid mainNo curNodeName
对应字段 Id Processid Taskid mainNo curNodeName 含义 标识列 当前的流程id 当前的任务id 报案号 当前的节点名称