一、ProcessEngine实例的配置
研究过JBPM的人都知道,JBPM在操作流程时,一切都是基于ProcessEngine对象,所以整合的思路很简单,只要我们能让Spring创建出ProcessEngine。
配置内容如下:
<bean id="springHelper" class="org.jbpm.pvm.internal.processengine.SpringHelper"> <property name="jbpmCfg" value="jbpm.cfg.xml" /> </bean> <bean id="processEngine" factory-bean="springHelper" factory-method="createProcessEngine" /> <bean id="repositoryService" factory-bean="processEngine" factory-method="getRepositoryService" /> <bean id="executionService" factory-bean="processEngine" factory-method="getExecutionService" /> <bean id="taskService" factory-bean="processEngine" factory-method="getTaskService" /> <bean id="historyService" factory-bean="processEngine" factory-method="getHistoryService" /> <bean id="identityService" factory-bean="processEngine" factory-method="getIdentityService" /> <bean id="jbpmManager" class="com.jbpm.managerimpl.JbpmManagerImpl"> <property name="processEngine" ref="processEngine"></property> <property name="repositoryService" ref="repositoryService"></property> <property name="executionService" ref="executionService"></property> <property name="historyService" ref="historyService"></property> <property name="identityService" ref="identityService"></property> <property name="taskService" ref="taskService"></property> </bean>
二、操作接口类jbpmManager及实现类JbpmManagerImpl的设计
操作接口类jbpmManager
package com.jbpm.manager;
import java.io.InputStream;
import java.util.List;
import java.util.Map;
import org.jbpm.api.ProcessDefinition;
import org.jbpm.api.ProcessInstance;
import org.jbpm.api.history.HistoryProcessInstance;
import org.jbpm.api.model.ActivityCoordinates;
import org.jbpm.api.task.Task;
/**
* jbpm管理类接口
*
* @author Administrator
*
*/
public interface JbpmManager {
/**
* 获取以部署的流程
*
* @return
*/
public List<ProcessDefinition> getProcessDefinitions();
/**
* 发布新流程
*/
public void deploy();
/**
* 移除新流程
*
* @param id
*/
public void undeploy(String id);
/**
* 启动流程实例
*
* @param id
* @param object
*/
public void start(String id, Map<String, Object> map);
/**
* 获取流程实例
*
* @return
*/
public List<ProcessInstance> getProcessInstances();
/**
* 获取代办任务列表
*
* @param roleName
* @return
*/
public List<Task> getTasks(String roleName);
/**
* 处理任务
*
* @param taskId
* @param map
*/
public void complate(String taskId, Map<String, Object> map);
/**
* 查询流程实例的参数集合
*
* @param id
* @return
*/
public Map<String, Object> manager(String id);
/**
* 经理处理流程
*
* @param id
* @param result
*/
public void complateByManager(String id, String result);
/**
* 老板请求
*
* @param id
* @return
*/
public Map<String, Object> boss(String id);
/**
* 老板处理
*
* @param id
*/
public void complateByBoss(String id);
/**
* 获取历史流程实例
*
* @return
*/
public List<HistoryProcessInstance> getHistoryProcessInstances();
/**
* 查找流程图的活动坐标
*
* @param id
* @return
*/
public ActivityCoordinates findActivityCoordinates(String id);
/**
* 查找图片输入流
*
* @param id
* @return
*/
public InputStream findPicInputStream(String id);
}
实现类JbpmManagerImpl
package com.jbpm.managerimpl;
import java.io.InputStream;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.zip.ZipInputStream;
import org.jbpm.api.ExecutionService;
import org.jbpm.api.HistoryService;
import org.jbpm.api.IdentityService;
import org.jbpm.api.ProcessDefinition;
import org.jbpm.api.ProcessEngine;
import org.jbpm.api.ProcessInstance;
import org.jbpm.api.RepositoryService;
import org.jbpm.api.TaskService;
import org.jbpm.api.history.HistoryProcessInstance;
import org.jbpm.api.model.ActivityCoordinates;
import org.jbpm.api.task.Task;
import com.jbpm.manager.JbpmManager;
public class JbpmManagerImpl implements JbpmManager {
private ProcessEngine processEngine;
private RepositoryService repositoryService;
private ExecutionService executionService;
private HistoryService historyService;
private TaskService taskService;
private IdentityService identityService;
public List<ProcessDefinition> getProcessDefinitions() {
return repositoryService.createProcessDefinitionQuery().list();
}
public void deploy() {
// repositoryService.createDeployment().addResourceFromClasspath(
// "/com/jbpm/source/leave.jpdl.xml").deploy();
ZipInputStream zis = new ZipInputStream(this.getClass()
.getResourceAsStream("/com/jbpm/source/leave.zip"));
// 发起流程,仅仅就是预定义任务,即在系统中创建一个流程,这是全局的,与具体的登陆 用户无关。然后,在启动流程时,才与登陆用户关联起来
String did = repositoryService.createDeployment()
.addResourcesFromZipInputStream(zis).deploy();
}
public void undeploy(String id) {
repositoryService.deleteDeploymentCascade(id);
}
public void start(String id, Map<String, Object> map) {
executionService.startProcessInstanceById(id, map);
}
public List<ProcessInstance> getProcessInstances() {
return executionService.createProcessInstanceQuery().list();
}
public List<Task> getTasks(String roleName) {
return taskService.findPersonalTasks(roleName);
}
public void complate(String taskId, Map<String, Object> map) {
taskService.setVariables(taskId, map);
taskService.completeTask(taskId);
}
public Map<String, Object> manager(String id) {
Task task = taskService.getTask(id);
String taskId = task.getId();
Set<String> strSet = new HashSet<String>();
strSet.add("owner");
strSet.add("day");
strSet.add("reason");
strSet.add("name");
return taskService.getVariables(taskId, strSet);
}
public void complateByManager(String id, String result) {
taskService.completeTask(id, result);
}
public Map<String, Object> boss(String id) {
Task task = taskService.getTask(id);
String taskId = task.getId();
Set<String> strSet = new HashSet<String>();
strSet.add("owner");
strSet.add("day");
strSet.add("reason");
strSet.add("name");
strSet.add("age");
strSet.add("address");
return taskService.getVariables(taskId, strSet);
}
public List<HistoryProcessInstance> getHistoryProcessInstances() {
return historyService.createHistoryProcessInstanceQuery().list();
// return historyService.createHistoryDetailQuery().list();
}
public ActivityCoordinates findActivityCoordinates(String id) {
// 通过id查到流程实例
ProcessInstance processInstance = executionService
.findProcessInstanceById(id);
Set<String> activityNames = processInstance.findActiveActivityNames();
// Coordinates为相依衣物
return repositoryService.getActivityCoordinates(processInstance
.getProcessDefinitionId(), activityNames.iterator().next());
}
public InputStream findPicInputStream(String id) {
// 通过流程实例id查找到流程实例
ProcessInstance processInstance = executionService
.findProcessInstanceById(id);
// 通过流程实例查找流程定义id
String processDefinitionId = processInstance.getProcessDefinitionId();
// 通过流程id查找流程
ProcessDefinition processDefinition = repositoryService
.createProcessDefinitionQuery().processDefinitionId(
processDefinitionId).uniqueResult();
return repositoryService.getResourceAsStream(processDefinition
.getDeploymentId(), "leave.png");
}
public ProcessEngine getProcessEngine() {
return processEngine;
}
public void setProcessEngine(ProcessEngine processEngine) {
this.processEngine = processEngine;
}
public RepositoryService getRepositoryService() {
return repositoryService;
}
public void setRepositoryService(RepositoryService repositoryService) {
this.repositoryService = repositoryService;
}
public ExecutionService getExecutionService() {
return executionService;
}
public void setExecutionService(ExecutionService executionService) {
this.executionService = executionService;
}
public HistoryService getHistoryService() {
return historyService;
}
public void setHistoryService(HistoryService historyService) {
this.historyService = historyService;
}
public TaskService getTaskService() {
return taskService;
}
public void setTaskService(TaskService taskService) {
this.taskService = taskService;
}
public IdentityService getIdentityService() {
return identityService;
}
public void setIdentityService(IdentityService identityService) {
this.identityService = identityService;
}
public void complateByBoss(String id) {
taskService.completeTask(id);
}
}
三、程序的结构图如下
程序必须引入如下的jar文件:
jbpm:\jbpm-4.4\lib下的所有jar文件
spring4.2:spring4.2包含的jar文件
struts2.1:struts2.1包含的jar文件
mssql:mssql包含的jar文件sqljdbc4.jar