yy629 发表于 2013-1-15 02:51:57

jbpm4的流程监控程序[2] 获得流程实例的相关节点信息

jbpm4的流程监控程序 获得流程实例的相关节点信息

<<jbpm4的流程监控程序 流程图监控展示,基于mootools>>

其实实现流程监控并不难,因为在jbpm4已经可以得到流程图和节点的坐标信息了.

在这个jbpm4的监控程序中,比较难的是对于流程已经结束的不太好获得相关的信息,试了好多方法才实现.
/** * CopyRight (C) 2006-2009 yy * @author yy * @project jbpm * @version 1.0 * @mail yy629_86 at 163 dot com * @date 2009-9-22 上午10:39:01 * @description*/package sofocus.bpm.jbpm.model;import java.util.List;import org.jbpm.api.history.HistoryActivityInstance;import org.jbpm.api.model.ActivityCoordinates;/** * 流程实例的节点信息,包括的活动结点和处理过的节点信息 * @author yeyong */public class ProcessInstaticeActivityInfo {private List<ActivityInfo> activeActivityInfos; // 处于活动的节点信息private List<ActivityInfo> processedActivityInfos; // 已经处理过的节点信息/**   * @param activeActivityInfos   * @param processedActivityInfos   */public ProcessInstaticeActivityInfo(List<ActivityInfo> activeActivityInfos,      List<ActivityInfo> processedActivityInfos) {    this.activeActivityInfos = activeActivityInfos;    this.processedActivityInfos = processedActivityInfos;}public static class ActivityInfo {    private ActivityCoordinates coordinates;    private HistoryActivityInstance activityInstance;    /**   * @param coordinates   */    public ActivityInfo(ActivityCoordinates coordinates) {      this.coordinates = coordinates;    }    /**   * @param coordinates   * @param activityInstance   */    public ActivityInfo(ActivityCoordinates coordinates, HistoryActivityInstance activityInstance) {      this.coordinates = coordinates;      this.activityInstance = activityInstance;    }    /**   * @return the coordinates   */    public ActivityCoordinates getCoordinates() {      return coordinates;    }    /**   * @param coordinates   *          the coordinates to set   */    public void setCoordinates(ActivityCoordinates coordinates) {      this.coordinates = coordinates;    }    /**   * @return the activityInstance   */    public HistoryActivityInstance getActivityInstance() {      return activityInstance;    }    /**   * @param activityInstance   *          the activityInstance to set   */    public void setActivityInstance(HistoryActivityInstance activityInstance) {      this.activityInstance = activityInstance;    }}/**   * @return the activeActivityInfos   */public List<ActivityInfo> getActiveActivityInfos() {    return activeActivityInfos;}/**   * @return the processedActivityInfos   */public List<ActivityInfo> getProcessedActivityInfos() {    return processedActivityInfos;}}

/** * CopyRight (C) 2006-2009 yy * @author yy * @project jbpm * @version 1.0 * @mail yy629_86 at 163 dot com * @date 2009-9-5 下午04:43:09 * @description */package sofocus.bpm.jbpm.support;import java.io.InputStream;import java.util.*;import java.util.zip.ZipInputStream;import javax.sql.DataSource;import org.hibernate.Session;import org.jbpm.api.*;import org.jbpm.api.history.*;import org.jbpm.api.job.Job;import org.jbpm.api.model.ActivityCoordinates;import org.jbpm.api.task.Task;import org.jbpm.pvm.internal.env.Environment;import org.jbpm.pvm.internal.env.EnvironmentFactory;import org.jbpm.pvm.internal.history.model.HistoryProcessInstanceImpl;import org.jbpm.pvm.internal.history.model.HistoryTaskInstanceImpl;import org.jbpm.pvm.internal.model.ExecutionImpl;import org.jbpm.pvm.internal.model.ProcessDefinitionImpl;import org.jbpm.pvm.internal.model.Transition;import org.jbpm.pvm.internal.svc.TaskServiceImpl;import sofocus.bpm.jbpm.model.PageInfo;import sofocus.bpm.jbpm.model.ProcessInstaticeActivityInfo;import sofocus.bpm.jbpm.model.ProcessInstaticeActivityInfo.ActivityInfo;import sofocus.bpm.jbpm.service.PagingQueryService;/** * jbpm template ** @author yeyong */public class JbpmTemplate {public static String PROCESS_IMAGE = ".png";public static String PROCESS_DEFINITION_XML = ".jpdl.xml";protected ProcessEngine processEngine;protected RepositoryService repositoryService;protected ExecutionService executionService;protected ManagementService managementService;protected TaskService taskService;protected HistoryService historyService;protected IdentityService identityService;protected PagingQueryService pagingQueryService;    // ......   /**   * 获得指定流程实例id的相关的资源   *    * @param processInstanceId   * @param resourceName   * @return   */public InputStream getResourceFromProcessInstance(String processInstanceId, String resourceName) {    ProcessDefinition pd = getProcessDefinitionByProcessInstanceId(processInstanceId);    if (pd != null) {      if (PROCESS_DEFINITION_XML.equals(resourceName)) {      resourceName = pd.getName() + resourceName;      } else if (PROCESS_IMAGE.equals(resourceName)) {      resourceName = pd.getImageResourceName();      }      return repositoryService.getResourceAsStream(pd.getDeploymentId(), resourceName);    } else {      return null;    }}    /**   * 获得指定流程id的流程相关的坐标信息   *    * @param processInstanceId   * @return   */public ProcessInstaticeActivityInfo getActivityCoordinatesInfo(String processInstanceId) {    ProcessDefinitionImpl processDefinition = (ProcessDefinitionImpl) this      .getProcessDefinitionByProcessInstanceId(processInstanceId);    String pdId = processDefinition.getId();    List<ActivityInfo> activeCoordinates = new ArrayList<ActivityInfo>(); // 处于活动状态的节点    List<ActivityInfo> coordinateList = new ArrayList<ActivityInfo>(); // 已经流过的节点    {      ActivityInfo activityInfo = new ActivityInfo(processDefinition.getInitial().getCoordinates());      coordinateList.add(activityInfo);      List<HistoryActivityInstance> activities = historyService.createHistoryActivityInstanceQuery()          .executionId(processInstanceId).list();      for (HistoryActivityInstance activity : activities) {      String activityName = activity.getActivityName();      activityInfo = new ActivityInfo(repositoryService.getActivityCoordinates(pdId, activityName));      activityInfo.setActivityInstance(activity);      coordinateList.add(activityInfo);      }    }    HistoryProcessInstance hpi = getHistoryProcessInstancByProcessInstanceId(processInstanceId);    String endActivityName = ((HistoryProcessInstanceImpl) hpi).getEndActivityName();    if (endActivityName != null) { // 流程实例已经结束了      ActivityCoordinates coordinates = repositoryService.getActivityCoordinates(pdId, endActivityName);      activeCoordinates.add(new ActivityInfo(coordinates)); //这里把结束节点也作为处于活动状态的节点    } else { // 流程实例未结束      Set<String> activityNames = executionService.findExecutionById(processInstanceId)          .findActiveActivityNames();      for (String activityName : activityNames) {      ActivityCoordinates coordinates = repositoryService.getActivityCoordinates(pdId, activityName);      activeCoordinates.add(new ActivityInfo(coordinates));      }    }    return new ProcessInstaticeActivityInfo(activeCoordinates, coordinateList);}}
页: [1]
查看完整版本: jbpm4的流程监控程序[2] 获得流程实例的相关节点信息