最近对spring+hibernate+jbpm进行了整合,现在把主要配置文件晒到这里,供大家参考.
appDbContext.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <!-- DB服务初始化 --> <beans> <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="locations"> <list> <value>jdbc.properties</value> </list> </property> </bean> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName"> <value>${database.driver}</value> </property> <property name="url"> <value>${database.url}</value> </property> <property name="username"> <value>${database.username}</value> </property> <property name="password"> <value>${database.password}</value> </property> </bean> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="dataSource"> <ref local="dataSource"/> </property> <property name="mappingLocations"><!-- mappingDirectoryLocations --> <list> <value>${package.springframwork.url}</value> <value>${package.synflow.url}</value> </list> </property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect"> ${hibernate.dialect} </prop> <prop key="hibernate.show_sql"> true </prop> </props> </property> </bean> <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory"> <ref local="sessionFactory"/> </property> </bean> <bean id="baseServiceproxyBean" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" lazy-init="true"> <property name="transactionManager"> <ref local="transactionManager"/> </property> <property name="transactionAttributes"> <props> <prop key="find*">PROPAGATION_REQUIRED,readOnly</prop> <prop key="update*">PROPAGATION_REQUIRED</prop> <prop key="delete*">PROPAGATION_REQUIRED</prop> <prop key="save*">PROPAGATION_REQUIRED</prop> <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop> </props> </property> </bean> </beans>
appDaoContext.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans> <bean id="dao" class="org.springframwork.orm.hibernate.dao.impl.DaoImpl"> <property name="sessionFactory"> <ref bean="sessionFactory" /> </property> </bean> <bean id="userDao" class="org.springframwork.orm.hibernate.dao.impl.UserDaoImpl"> <property name="sessionFactory"> <ref bean="sessionFactory" /> </property> </bean> </beans>
appServiceContext.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans> <!--测试Service 操作 --> <bean id="userServiceTarget" class="org.springframwork.web.service.impl.UserServiceImpl"> <property name="userDao"> <ref bean="userDao" /> </property> </bean> <bean id="userService" parent="baseServiceproxyBean" > <property name="target"> <ref local="userServiceTarget" /> </property> </bean> </beans>
jbpm.cfg.xml
<jbpm-configuration> <!-- This configuration is used when there is no jbpm.cfg.xml file found in the root of the classpath. It is a very basic configuration without persistence and message services. Only the authorization service installed. You can parse and create processes, but when you try to use one of the unavailable services, you'll get an exception. --> <jbpm-context> <!-- <service name="persistence" factory="org.jbpm.persistence.db.DbPersistenceServiceFactory" />--> <!-- 解决每次启动重新发布流程问题 --> <service name="persistence"> <factory> <bean class="org.jbpm.persistence.db.DbPersistenceServiceFactory"> <field name="isTransactionEnabled"><false/></field> </bean> </factory> </service> <service name="message" factory="org.jbpm.msg.db.DbMessageServiceFactory" /> <service name="scheduler" factory="org.jbpm.scheduler.db.DbSchedulerServiceFactory" /> <service name="logging" factory="org.jbpm.logging.db.DbLoggingServiceFactory" /> <service name="authentication" factory="org.jbpm.security.authentication.DefaultAuthenticationServiceFactory" /> </jbpm-context> <!-- configuration resource files pointing to default configuration files in jbpm-{version}.jar --> <!-- <string name="resource.hibernate.cfg.xml" value="hibernate.cfg.xml" /> --> <string name="resource.business.calendar" value="org/jbpm/calendar/jbpm.business.calendar.properties" /> <string name="resource.default.modules" value="org/jbpm/graph/def/jbpm.default.modules.properties" /> <string name="resource.converter" value="org/jbpm/db/hibernate/jbpm.converter.properties" /> <string name="resource.action.types" value="org/jbpm/graph/action/action.types.xml" /> <string name="resource.node.types" value="org/jbpm/graph/node/node.types.xml" /> <string name="resource.parsers" value="org/jbpm/jpdl/par/jbpm.parsers.xml" /> <string name="resource.varmapping" value="org/jbpm/context/exe/jbpm.varmapping.xml" /> <long name="jbpm.msg.wait.timout" value="5000" singleton="true" /> <int name="jbpm.byte.block.size" value="1024" singleton="true" /> <string name="mail.smtp.host" value="localhost" /> <bean name="jbpm.task.instance.factory" class="org.jbpm.taskmgmt.impl.DefaultTaskInstanceFactoryImpl" singleton="true" /> <bean name="jbpm.variable.resolver" class="org.jbpm.jpdl.el.impl.JbpmVariableResolver" singleton="true" /> <bean name="jbpm.mail.address.resolver" class="org.jbpm.identity.mail.IdentityAddressResolver" singleton="true" /> </jbpm-configuration>
jbpmContext.xml 这里注释到了自动发布流程
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans> <!-- reading jBPM process definitions --> <bean id="websaleWorkflow" class="org.springmodules.workflow.jbpm31.definition.ProcessDefinitionFactoryBean"> <property name="definitionLocation" value="processdefinition.xml" /> </bean> <!-- jBPM configuration--> <bean id="jbpmConfiguration" class="org.springmodules.workflow.jbpm31.LocalJbpmConfigurationFactoryBean"> <property name="sessionFactory" ref="sessionFactory" /> <property name="configuration" value="classpath:jbpm.cfg.xml" /> <!--此处屏蔽,就可以避免每次启动服务,都初始化数据 <property name="processDefinitions"> <list> <ref local="websaleWorkflow" /> </list> </property> --> <property name="createSchema" value="false" /> </bean> <!-- jBPM template --> <bean id="jbpmTemplate" class="org.springmodules.workflow.jbpm31.JbpmTemplate"> <constructor-arg index="0" ref="jbpmConfiguration" /> <!-- <constructor-arg index="1" ref="websaleWorkflow" /> --> </bean> </beans>
jbpmDaoContext.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans> <bean id="jbpmDao" class="org.springframwork.jbpm.orm.hibernate.dao.impl.JbpmDaoImpl"> <property name="jbpmTemplate"> <ref bean="jbpmTemplate"/> </property> </bean> </beans>
jdbc.properties
#database.url=jdbc:oracle:thin:@localhost:1521:exebase
#database.driver=oracle.jdbc.driver.OracleDriver
#database.username=scott
#database.password=tiger
database.url=jdbc:microsoft:sqlserver://88.16.50.155:1433;DatabaseName=HibernateDb
database.driver=com.microsoft.jdbc.sqlserver.SQLServerDriver
database.username=sa
database.password=sa
package.springframwork.url=classpath*:/org/springframwork/orm/hibernate/po/*.hbm.xml
package.synflow.url=classpath*:/org/jbpm/**/*.hbm.xml
hibernate.dialect=org.hibernate.dialect.SQLServerDialect
#database.driver=oracle.jdbc.driver.OracleDriver
#database.username=scott
#database.password=tiger
database.url=jdbc:microsoft:sqlserver://88.16.50.155:1433;DatabaseName=HibernateDb
database.driver=com.microsoft.jdbc.sqlserver.SQLServerDriver
database.username=sa
database.password=sa
package.springframwork.url=classpath*:/org/springframwork/orm/hibernate/po/*.hbm.xml
package.synflow.url=classpath*:/org/jbpm/**/*.hbm.xml
hibernate.dialect=org.hibernate.dialect.SQLServerDialect
processdefinition.xml
<?xml version="1.0" encoding="GBK"?> <process-definition xmlns="urn:jbpm.org:jpdl-3.1" name="day"> <!-- 申请 --> <start-state name="request"> <task> <controller> <variable name="name" /> <variable name="day" /> <variable name="note" /> </controller> </task> <!-- 流程转向 --> <transition name="to_confirm" to="confirm"> <action name="requestAction" class="org.springframwork.jbpm.web.action.RequestAction"> <reason>我要请假</reason> </action> </transition> </start-state> <!-- 审批 --> <state name="confirm"> <transition name="to_end" to="end"> <action name="finishAction" class="org.springframwork.jbpm.web.action.ConfirmAction" /> </transition> </state> <!-- 结束 --> <end-state name="end" /> </process-definition>
JbpmDao.java
package org.springframwork.jbpm.orm.hibernate.dao;
import org.jbpm.graph.exe.ProcessInstance;
/**
*
* @author niedashun
*
*/
public interface JbpmDao {
/**
* 1
* 产生工作流实例
* @param processDefinitionID
* @return
*/
public ProcessInstance saveProcessInstance(final long processDefinitionID);
/**
* 2
* 发布流程
* @return
*/
public Object DeployProcess();
/**
* 3
* 创建一个流程实例
* @param processDefName 流程定义名字
* @param filedstr "argname1=argValue1,argName2=argValue2"
* @return ProcessInstance
*/
public ProcessInstance createProcessInstance(final String processDefName,final String filedstr);
/**
* 4
* 根据流程实例id查找流程实例
* @param id 流程实例id
* @return ProcessInstance 流程实例
*/
public ProcessInstance findProcessInstance(final long id);
/**
* 5
* 根据流程实例id,审批流程
* @param id 流程实例id
* @param filedstr "argname1=argValue1,argName2=argValue2"
* @return ProcessInstance
*/
public ProcessInstance approvalProcess(final long id,final String filedstr);
/**
* 6
* 根据流程实例id,判断流程是否已经结束
* @param id 流程实例id
* @param tag 流程结束标志
* @return Boolean true表示已经结束
*/
public Boolean checkProcessIsEnd(final long id,final String tag);
}
JbpmDaoImpl.java
package org.springframwork.jbpm.orm.hibernate.dao.impl;
import java.io.InputStream;
import org.jbpm.JbpmContext;
import org.jbpm.JbpmException;
import org.jbpm.context.exe.ContextInstance;
import org.jbpm.graph.def.ProcessDefinition;
import org.jbpm.graph.exe.ProcessInstance;
import org.springframwork.jbpm.orm.hibernate.dao.JbpmDao;
import org.springmodules.workflow.jbpm31.JbpmCallback;
import org.springmodules.workflow.jbpm31.JbpmTemplate;
public class JbpmDaoImpl implements JbpmDao {
private JbpmTemplate jbpmTemplate;
public void setJbpmTemplate(JbpmTemplate jbpmTemplate) {
this.jbpmTemplate = jbpmTemplate;
}
public ProcessInstance saveProcessInstance(final long processDefinitionID) {
return (ProcessInstance) jbpmTemplate.execute(new JbpmCallback() {
public Object doInJbpm(JbpmContext context) {
ProcessDefinition processDefinition = context.getGraphSession()
.loadProcessDefinition(processDefinitionID);
ProcessInstance processInstance = new ProcessInstance(
processDefinition);
context.save(processInstance);
return processInstance;
}
});
}
public Object DeployProcess() {
return jbpmTemplate.execute(new JbpmCallback() {
public Object doInJbpm(JbpmContext context) {
InputStream is = JbpmDaoImpl.class.getClassLoader()
.getResourceAsStream("processdefinition.xml");
ProcessDefinition processDefinition = ProcessDefinition
.parseXmlInputStream(is);
context.deployProcessDefinition(processDefinition);
return null;
}
});
}
public ProcessInstance createProcessInstance(final String processDefName,final String filedstr) {
return (ProcessInstance) jbpmTemplate.execute(new JbpmCallback() {
public Object doInJbpm(JbpmContext context) throws JbpmException {
// TODO Auto-generated method stub
ProcessDefinition processDefinition = context.getGraphSession().findLatestProcessDefinition(processDefName);
// 创建一个新流程
ProcessInstance pi = processDefinition.createProcessInstance();
// 取得流程的数据环境
ContextInstance ci = pi.getContextInstance();
// 创建一张请假单
String[] sf=filedstr.split(",");
for(int i=0;i<sf.length;i++){
String[] s=sf[i].split("=");
ci.setVariable(s[0],s[1]);
}
// 申请结束,转到下一个流程结点
pi.signal();
return pi;
}
});
}
public ProcessInstance findProcessInstance(final long id) {
return (ProcessInstance) jbpmTemplate.execute(new JbpmCallback() {
public Object doInJbpm(JbpmContext context) throws JbpmException {
// TODO Auto-generated method stub
ProcessInstance processInstance = context.getGraphSession().loadProcessInstance(id);
return processInstance;
}
});
}
public ProcessInstance approvalProcess(final long id,final String filedstr){
return (ProcessInstance) jbpmTemplate.execute(new JbpmCallback() {
public Object doInJbpm(JbpmContext context) throws JbpmException {
// TODO Auto-generated method stub
ProcessInstance pi = context.getGraphSession().loadProcessInstance(id);
// 取得流程的数据环境
ContextInstance ci = pi.getContextInstance();
// 创建一张请假单
String[] sf=filedstr.split(",");
for(int i=0;i<sf.length;i++){
String[] s=sf[i].split("=");
ci.setVariable(s[0],s[1]);
}
// 申请结束,转到下一个流程结点
pi.signal();
return pi;
}
});
}
public Boolean checkProcessIsEnd(final long id,final String tag) {
return (Boolean) jbpmTemplate.execute(new JbpmCallback() {
public Object doInJbpm(JbpmContext context) throws JbpmException {
// TODO Auto-generated method stub
boolean t=false;
ProcessInstance processInstance = context.getGraphSession().loadProcessInstance(id);
if(tag==processInstance.getRootToken().getNode().getName()||tag.equals(processInstance.getRootToken().getNode().getName())){
t=true;
}
return new Boolean(t);
}
});
}
}
如果大家有需要,请向我索取.