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]