最近很纠结。JBPM4。3的问题。
说明我的应用开发环境是:JPBM4.3,Spring2.0整个项目框架基于SSH搭建。数据库为MySql5.0。
第一步:项目的配置文件
数据库db.properties
#development
dev.connection.driver_class=com.mysql.jdbc.Driver
dev.connection.url=jdbc:mysql://localhost:3306/test_oatianai?useUnicode=true&characterEncoding=UTF-8
dev.connection.username=root
dev.connection.password=123456
#test
test.connection.driver_class=com.mysql.jdbc.Driver
test.connection.url=jdbc:mysql://localhost:3306/test_oatianai?useUnicode=true&characterEncoding=UTF-8
test.connection.username=root
test.connection.password=123456
hibernate的配置文件为jbpm4.3中带的hibernate.cfg.xml
jbpm4.3的jbpm配置文件如下:jbpm.cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<jbpm-configuration>
<import resource="jbpm.default.cfg.xml" />
<import resource="jbpm.tx.spring.cfg.xml" />
<import resource="jbpm.jpdl.cfg.xml" />
<import resource="jbpm.bpmn.cfg.xml" />
<import resource="jbpm.identity.cfg.xml" />
<import resource="jbpm.businesscalendar.cfg.xml" />
<import resource="jbpm.console.cfg.xml" />
<import resource="jbpm.jobexecutor.cfg.xml" />
<!--配置 Spring-->
<process-engine-context>
<string name="spring.cfg" value="spring/spring-jbpm.xml" />
</process-engine-context>
<!-- 扩展用户
<transaction-context>
<identity-session />
<object class="your.package.YourIdentitySessionImpl" />
</transaction-context>
<transaction-context>
<identity-session current="true"/>
<object class="" />
</transaction-context>
-->
</jbpm-configuration>
JBPM4.3中配置Spring相对JBPM4.0要简单一些。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">
<bean id="springHelper" class="org.jbpm.pvm.internal.processengine.SpringHelper" />
<bean id="processEngine" factory-bean="springHelper" factory-method="createProcessEngine" />
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="configLocation" value="classpath:hibernate.cfg.xml" />
<property name="dataSource" ref="dataSource" />
</bean>
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
<property name="dataSource" ref="dataSource" />
</bean>
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/test_oatianai?useUnicode=true&characterEncoding=UTF-8" />
<property name="username" value="root" />
<property name="password" value="123456" />
</bean>
这里本是想这样来配置JBPM的服务
<bean id="springHelper" class="org.jbpm.pvm.internal.processengine.SpringHelper" />
<bean id="processEngine" factory-bean="springHelper" factory-method="createProcessEngine" />
<bean id="executionService" factory-bean="processEngine" factory-method="getExecutionService" />
但这样会报错误,说无法这样创建executionService BEAN,希望大家给指点一下。
整个项目的搭建配置与JBPM4相关的到此配置也就完成。
第二步:表数据模块,我的实例是基于请款而写的,业务表单Bean如下:
ublic class ApplyMoneyForm {
private Long id;
private String applyuser;
private String reason;
private float applynum;
private String suggestion1;
private String decision1;
private String manager;
private String suggestion2;
private String decision2;
private String boss;
private String processid;
public String getDecision1() {
return decision1;
}
public void setDecision1(String decision1) {
this.decision1 = decision1;
}
public String getDecision2() {
return decision2;
}
public void setDecision2(String decision2) {
this.decision2 = decision2;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getApplyuser() {
return applyuser;
}
public void setApplyuser(String applyuser) {
this.applyuser = applyuser;
}
public String getReason() {
return reason;
}
public void setReason(String reason) {
this.reason = reason;
}
public float getApplynum() {
return applynum;
}
public void setApplynum(float applynum) {
this.applynum = applynum;
}
public String getSuggestion1() {
return suggestion1;
}
public void setSuggestion1(String suggestion1) {
this.suggestion1 = suggestion1;
}
public String getManager() {
return manager;
}
public void setManager(String manager) {
this.manager = manager;
}
public String getSuggestion2() {
return suggestion2;
}
public void setSuggestion2(String suggestion2) {
this.suggestion2 = suggestion2;
}
public String getBoss() {
return boss;
}
public void setBoss(String boss) {
this.boss = boss;
}
这是表彰数据。
第三步:业务数据与流程实例结合
流程定义文件applymoney.xml
<process name="applymoney" xmlns="http://jbpm.org/4.0/jpdl" key="applymoney"
description="请款流程定义">
<start g="207,78,53,48" name="start1">
<transition g="-40,-16" name="to 填写请款单" to="填写请款单" />
</start>
<task assignee="#{user}" g="176,203,110,55" name="填写请款单">
<transition g="-32,-11" name="to 经理审核" to="经理审核" />
</task>
<task assignee="#{manager}" g="182,300,101,50" name="经理审核">
<transition g="-7,-13" name="同意" to="老板审核">
</transition>
<transition g="345,324;345,229:-13,-10" name="驳回" to="填写请款单">
</transition>
<transition g="347,324:-14,60" name="不同意" to="cancel1">
</transition>
</task>
<task assignee="boss" g="186,398,98,48" name="老板审核">
<transition g="-14,-8" name="同意" to="end1">
</transition>
<transition g="137,421;133,230:-11,11" name="驳回" to="填写请款单">
</transition>
<transition g="-27,-11" name="不同意" to="cancel1">
</transition>
</task>
<end g="109,490,66,42" name="end1" />
<end-cancel g="325,489,82,52" name="cancel1" />
</process>
流程管理ApplyMoneyManager.java
package com.cqta.oatianai.jbpm;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.jbpm.api.Execution;
import org.jbpm.api.ExecutionService;
import org.jbpm.api.ProcessEngine;
import org.jbpm.api.ProcessInstance;
import org.jbpm.api.TaskService;
import org.jbpm.api.task.Task;
import org.jbpm.pvm.internal.task.TaskImpl;
import com.cqta.oatianai.model.ApplyMoneyForm;
public class ApplyMoneyManager {
private ProcessEngine processEngine;
public void setProcessEngine(ProcessEngine processEngine) {
this.processEngine = processEngine;
}
/**
*发起请款流
* @param username
*/
public String startApplyMoney(String username){
Map<String, Object> variables=new HashMap<String, Object>();
variables.put("user", username);
ExecutionService executionService=processEngine.getExecutionService();
ProcessInstance processInstance=executionService.startProcessInstanceByKey("applymoney", variables);
String processId=processInstance.getId();
return processId;
}
/**
* 请假表单结合
* @param applyMoneyForm
*/
public void applyMoney(ApplyMoneyForm applyMoneyForm){
Map<String, Object> variables=new HashMap<String, Object>();
variables.put("manager", applyMoneyForm.getManager());
TaskService taskService=processEngine.getTaskService();
List<Task> listTasks=taskService.findPersonalTasks(applyMoneyForm.getApplyuser());
if(listTasks.size()<=0){
return ;
}
Task task=listTasks.get(0);
taskService.setVariables(task.getId(), variables);
taskService.completeTask(task.getId());
}
public void confirm(ApplyMoneyForm applyMoneyForm,String taskId){
TaskService taskService=processEngine.getTaskService();
Task task=taskService.getTask(taskId);
System.out.println("executionId==========>"+task.getExecutionId());
ExecutionService executionService=processEngine.getExecutionService();
Execution execution=executionService.findExecutionById(task.getExecutionId());
if(execution.getProcessInstance().isActive("经理审核")){
taskService.completeTask(task.getId(),applyMoneyForm.getDecision1());
}else if(execution.getProcessInstance().isActive("老板审核")){
taskService.completeTask(task.getId(), applyMoneyForm.getDecision2());
}
}
}
这里红色标识的就是最近纠结的地方了,findExecutionById(task.getExecutionId())本身应去JBPM4_Execution表中的ID_字段,但去取JBPM4_Execution表中的DBID_字段。前一个字段为字符类型,后一个字段为long型。这个问题在Sqlserver2000与oracle中都出现了问题。希望大家帮忙解决一下。原来是hibernate的版本搞错了
表单数据与流程实例相继合我是在Controller中进行的,不知是否合理。ApplyMoneyController
package com.cqta.oatianai.controller;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.jbpm.api.task.Task;
import com.cqta.core.utils.BeanUtils;
import com.cqta.core.web.ApplicationController;
import com.cqta.oatianai.dao.ApplyMoneyFormDaoImpl;
import com.cqta.oatianai.jbpm.ApplyMoneyManager;
import com.cqta.oatianai.jbpm.PersonTasks;
import com.cqta.oatianai.model.ApplyMoneyForm;
public class ApplyMoneyController extends ApplicationController{
private ApplyMoneyManager applyMoneyManager;
private ApplyMoneyFormDaoImpl applyMoneyFormDaoImpl;
private PersonTasks personTasks;
public void setApplyMoneyManager(ApplyMoneyManager applyMoneyManager) {
this.applyMoneyManager = applyMoneyManager;
}
public void setApplyMoneyFormDaoImpl(ApplyMoneyFormDaoImpl applyMoneyFormDaoImpl) {
this.applyMoneyFormDaoImpl = applyMoneyFormDaoImpl;
}
public void setPersonTasks(PersonTasks personTasks) {
this.personTasks = personTasks;
}
public ActionForward applyMoney(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
return mapping.findForward("apply_money");
}
public ActionForward managerApproval(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
String taskId=request.getParameter("taskId");
String procesId=personTasks.getProcessInstanceIdByTaskId(taskId);
ApplyMoneyForm applyMoneyForm=applyMoneyFormDaoImpl.findApplyMoneyForm(procesId);
request.setAttribute("applyMoneyForm", applyMoneyForm);
request.setAttribute("taskId", taskId);
return mapping.findForward("apply_money_manager");
}
public ActionForward bossApproval(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
String taskId=request.getParameter("taskId");
String processId=personTasks.getProcessInstanceIdByTaskId(taskId);
ApplyMoneyForm applyMoneyForms=applyMoneyFormDaoImpl.findApplyMoneyForm(processId);
request.setAttribute("applyMoneyForm", applyMoneyForms);
request.setAttribute("taskId", taskId);
return mapping.findForward("apply_money_boss");
}
/**
* 发起请假流程
* @param mapping
* @param form
* @param request
* @param response
* @return
* @throws Exception
*/
public ActionForward startApply(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
ApplyMoneyForm applyMoneyForm=new ApplyMoneyForm();
BeanUtils.populate(applyMoneyForm,request.getParameterMap());
String processId=applyMoneyManager.startApplyMoney(applyMoneyForm.getApplyuser());
applyMoneyManager.applyMoney(applyMoneyForm);
applyMoneyForm.setProcessid(processId);
applyMoneyFormDaoImpl.startApplyMoney(applyMoneyForm);
return mapping.findForward("apply_money");
}
/**
* 经理审批
* @param mapping
* @param form
* @param request
* @param response
* @return
* @throws Exception
*/
public ActionForward managerApprovaled(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
ApplyMoneyForm applyMoneyForm=new ApplyMoneyForm();
String taskId=request.getParameter("taskId");
System.out.println("taskId============>"+taskId);
BeanUtils.populate(applyMoneyForm,request.getParameterMap());
applyMoneyManager.confirm(applyMoneyForm, taskId);
applyMoneyFormDaoImpl.updateApplyMoney(applyMoneyForm, applyMoneyForm.getId());
return mapping.findForward("apply_money_manager");
}
/**
* 老板审批
* @param mapping
* @param form
* @param request
* @param response
* @return
* @throws Exception
*/
public ActionForward bossApprovaled(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
ApplyMoneyForm applyMoneyForm=new ApplyMoneyForm();
String taskId=request.getParameter("taskId");
BeanUtils.populate(applyMoneyForm, request.getParameterMap());
applyMoneyManager.confirm(applyMoneyForm, taskId);
applyMoneyFormDaoImpl.updateApplyMoney(applyMoneyForm,applyMoneyForm.getId());
return mapping.findForward("apply_money_boss");
}
/**
* 获取用户列表
* @param mapping
* @param form
* @param request
* @param response
* @return
* @throws Exception
*/
public ActionForward taskLists(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
String userName=request.getParameter("username");
List<Task> taskList=personTasks.findByPerson(userName);
System.out.println("=========>"+taskList.size());
request.setAttribute("taskList", taskList);
return mapping.findForward("index");
}
}
这就是一个 SSH与JBPM4。3与实际业务相结合。正在探索中学习JBPM啦。
本文中的问题已解决,是因为hibernate得版本问题。我的项目中有两个hibernate,一个是JBPM包下的,一个是我自己加上的。唉,细节呀