中国IT论坛's Archiver

alading-lz 发表于 2009-9-10 16:36

JBPM基于Spring系统工作流平台整合6------系统基于JBPM开发

特别说明:其实在开发过程中主要就是调用以下接口,因此只要遵循WFMC标准的工作流引擎,可以轻松切换,比如协同的Synchroflow,整个系统切换只需要1周左右的时间(系统整体设计要考虑充分),仅仅是更换流程引擎底层接口而已。因为系统充分考虑到各个工作流平台的共性,而通过系统的中间层屏蔽掉各工作流平台的差异性。  读者可能注意到前文所描述的WFMC图,需要强调一点,系统调用工作流API接口完全通过中间层设计达到完美整合,但是工作流调用系统接口,限于每个工作流平台具体的差异化,有一定的整合工作量,这个无法回避。
  有点凌乱,呵呵,欢迎大家进行交流,共同进步。
  1.1.   创建流程实例
[font=新宋体]//创建流程实例,创建流程实例必须以流程模型定义的名称,因为流程每部署一次,
//对应的最新的流程定义ID就会变化
WfProcessIns wfProcessIns = wfManageService.createWfProcessIns("LeaveProcess");

    // 工单字段必须存储流程实例的ID,以根据流程实例ID获取相应的工单
    wsLeave.setProgressInstanceId(wfProcessIns.getProcessInsId());   [/font]
  1.2.   启动流程实例
[font=新宋体]//启动流程实例
wfManageService.startWfProcessIns(wfProcessIns.getProcessInsId());[/font]
  1.3.   更新全局或者节点变量
[font=新宋体]//变量以HashMap<String,String>方式
//变量的Value都以String的方式传递
HashMap varMap = new HashMap();
    varMap.put("manageroper", "approve");
varMap.put("leavedays", "60");

    //更新相关变量
wfManageService.setRelevantVariable(wsLeave.getProgressInstanceId(), varMap);[/font]
  1.4.   完成任务实例
[font=新宋体]//完成任务
//完成任务之前,如果有变量要更新,则在完成任务之前调用更新变量的方法
wfManageService.completeWfTaskIns(wfTaskInsId);[/font]
  1.5.   获取待办任务
[font=新宋体]//获取待办任务列表
List wfTaskInsLs =
wfManageService.getWfTaskInsLsByUserId(String.valueOf(this.getCurrentUser().getId()));[/font]
  1.6.   流程监控
  /jbpmProcessImageServlet?processInsId=XXX
  系统调用JBPM接口方式
  通过UNICALL系统定义的工作流中间层接口访问,完全屏蔽掉JBPM的个性化差异。
  举例:
[font=新宋体]//创建流程实例
WfProcessIns wfProcessIns = wfManageService.createWfProcessIns("LeaveProcess");[/font]
  模型调用系统接口方式
  通过模型JPDL定义的ActionHandler方式,通过UNICALL系统ServiceFactory方式调用系统接口。
  抽象调用的Handler Action,比如消息通知、结束后更新工单状态。
  举例:
  在模型定义中引用即可,具体代码如下:
[font=新宋体]/**
 * 流程实例完成进行数据归档等等
 * @author Wang YiSong
 */
public class CompleteProcessInsHandler implements ActionHandler {
    private static final Log log = LogFactory.getLog( CompleteProcessInsHandler.class);
    public void execute(ExecutionContext executionContext) throws Exception { 
        log.debug("=====Action=======testEventHandler.execute()==");
        ProcessInstance pi = executionContext.getContextInstance().getProcessInstance();
        log.debug("process instance id" + pi.getId());
……
}[/font]

页: [1]

Powered by Discuz! Archiver 7.0.0  © 2001-2009 Comsenz Inc.