第一步:導入所需jar包:
具體所需jar包見附件圖片
第二步:修改jbpm配置文件:
1、src目錄下建立jbpm.cfg.xml(注意註釋部分)
- <?xml version="1.0" encoding="UTF-8"?>
- <jbpm-configuration>
- <process-engine-context>
- <string name="spring.cfg" value="applicationContext.xml" />
- </process-engine-context>
- <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.spring.default.cfg.xml"/>
- <!--
- <import resource="jbpm.jobexecutor.cfg.xml" />
- -->
- </jbpm-configuration>
2、src目錄下建立jbpm.spring.default.cfg.xml
- <?xml version="1.0" encoding="UTF-8"?>
- <jbpm-configuration>
- <process-engine-context>
- <repository-service />
- <repository-cache />
- <execution-service />
- <history-service />
- <management-service />
- <identity-service />
- <task-service />
- <!--
- <hibernate-configuration>
- <cfg resource="jbpm.hibernate.cfg.xml" />
- </hibernate-configuration>
- <hibernate-session-factory />
- -->
- <script-manager default-expression-language="juel"
- default-script-language="juel"
- read-contexts="execution, environment, process-engine"
- write-context="">
- <script-language name="juel" factory="org.jbpm.pvm.internal.script.JuelScriptEngineFactory" />
- </script-manager>
- <authentication />
- <id-generator />
- <types resource="jbpm.variable.types.xml" />
- <address-resolver />
- <business-calendar>
- <monday hours="9:00-12:00 and 12:30-17:00"/>
- <tuesday hours="9:00-12:00 and 12:30-17:00"/>
- <wednesday hours="9:00-12:00 and 12:30-17:00"/>
- <thursday hours="9:00-12:00 and 12:30-17:00"/>
- <friday hours="9:00-12:00 and 12:30-17:00"/>
- <holiday period="01/07/2008 - 31/08/2008"/>
- </business-calendar>
- <mail-template name='task-notification'>
- <to users="${task.assignee}"/>
- <subject>${task.name}</subject>
- <text><![CDATA[Hi ${task.assignee},
- Task "${task.name}" has been assigned to you.
- ${task.description}
- Sent by JBoss jBPM
- ]]></text>
- </mail-template>
- <mail-template name='task-reminder'>
- <to users="${task.assignee}"/>
- <subject>${task.name}</subject>
- <text><![CDATA[Hey ${task.assignee},
- Do not forget about task "${task.name}".
- ${task.description}
- Sent by JBoss jBPM
- ]]></text>
- </mail-template>
- </process-engine-context>
- <transaction-context>
- <repository-session />
- <db-session />
- <message-session />
- <timer-session />
- <history-session />
- <mail-session>
- <mail-server>
- <session-properties resource="jbpm.mail.properties" />
- </mail-server>
- </mail-session>
- </transaction-context>
- </jbpm-configuration>
第三步:修改Spring配置文件
1、applicationContext.xml中加入springHelper配置,作爲jbpm processEngine的factory bean
- <bean id="springHelper" class="org.jbpm.pvm.internal.processengine.SpringHelper">
- <property name="jbpmCfg" value="jbpm.cfg.xml" />
- </bean>
2、applicationContext.xml中加入processEngine配置,並以此爲factory bean創建JBPM本身的各種Service
- <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"/>
3、applicationContext.xml的hibernate配置中加入jbpm所需的hbm.xml配置
- <property name="mappingLocations">
- <list>
- <value>classpath:jbpm.execution.hbm.xml</value>
- <value>classpath:jbpm.history.hbm.xml</value>
- <value>classpath:jbpm.identity.hbm.xml</value>
- <value>classpath:jbpm.repository.hbm.xml</value>
- <value>classpath:jbpm.task.hbm.xml</value>
- </list>
- </property>
4、完整的applicationContext.xml(包括其餘DataSource、SessionFacotry、事務控制等)
applicationContext.xml
- <?xml version="1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"
- default-lazy-init="true">
- <import resource="serviceContext.xml" />
- <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="mainDataSource" class="com.jolbox.bonecp.BoneCPDataSource" destroy-method="close">
- <property name="driverClass" value="oracle.jdbc.driver.OracleDriver" />
- <property name="jdbcUrl" value="jdbc:oracle:thin:@XXXXX:1521:XE" />
- <property name="username" value="jbpm4" />
- <property name="password" value="jbpm" />
- <property name="idleConnectionTestPeriod" value="60" />
- <property name="idleMaxAge" value="240" />
- <property name="maxConnectionsPerPartition" value="60" />
- <property name="minConnectionsPerPartition" value="20" />
- <property name="partitionCount" value="3" />
- <property name="acquireIncrement" value="10" />
- <property name="preparedStatementCacheSize" value="50" />
- <property name="statementsCachedPerConnection" value="30" />
- <property name="releaseHelperThreads" value="3" />
- </bean>
- <bean id="dataSource" class="org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy">
- <property name="targetDataSource">
- <ref local="mainDataSource" />
- </property>
- </bean>
- <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
- <property name="dataSource">
- <ref bean="dataSource" />
- </property>
- <property name="hibernateProperties">
- <props>
- <prop key="hibernate.dialect">org.hibernate.dialect.Oracle9iDialect</prop>
- <prop key="hibernate.show_sql">true</prop>
- </props>
- </property>
- <property name="mappingLocations">
- <list>
- <value>classpath:jbpm.execution.hbm.xml</value>
- <value>classpath:jbpm.history.hbm.xml</value>
- <value>classpath:jbpm.identity.hbm.xml</value>
- <value>classpath:jbpm.repository.hbm.xml</value>
- <value>classpath:jbpm.task.hbm.xml</value>
- </list>
- </property>
- <property name="annotatedClasses">
- <list>
- <value>com.fish119.jssh.pojo.Test</value>
- </list>
- </property>
- </bean>
- <!-- 事務配置開始 -->
- <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
- <property name="sessionFactory" ref="sessionFactory" />
- </bean>
- <!--事務配置-->
- <bean id="transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor">
- <property name="transactionManager">
- <ref bean="transactionManager" />
- </property>
- <!-- 配置事務屬性 -->
- <property name="transactionAttributes">
- <props>
- <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
- <prop key="delete*">PROPAGATION_REQUIRED</prop>
- <prop key="insert*">PROPAGATION_REQUIRED,-Exception</prop>
- <prop key="add*">PROPAGATION_REQUIRED,-Exception</prop>
- <prop key="update*">PROPAGATION_REQUIRED,-Exception</prop>
- <prop key="save*">PROPAGATION_REQUIRED,-Exception</prop>
- <prop key="*Save*">PROPAGATION_REQUIRED,-Exception</prop>
- <prop key="exchange*">PROPAGATION_REQUIRED,-Exception</prop>
- <prop key="remove*">PROPAGATION_REQUIRED,-Exception</prop>
- <prop key="set*">PROPAGATION_REQUIRED,-Exception</prop>
- <prop key="Test*">PROPAGATION_REQUIRED,-Exception</prop>
- <prop key="*Test">PROPAGATION_REQUIRED,-Exception</prop>
- </props>
- </property>
- </bean>
- <bean id="autoproxy" class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
- <property name="beanNames">
- <list>
- <value>*Service</value>
- </list>
- </property>
- <property name="interceptorNames">
- <list>
- <value>transactionInterceptor</value>
- </list>
- </property>
- </bean>
- <!-- 事務配置結束 -->
- <bean id="testDAO" class="com.fish119.jssh.dao.TestDAO" autowire="byType">
- <property name="sessionFactory">
- <ref bean="sessionFactory" />
- </property>
- </bean>
- </beans>
第四步:配置Struts2(使用了convention plugin)
struts.xml
- <?xml version="1.0" encoding="UTF-8" ?>
- <!DOCTYPE struts PUBLIC
- "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
- "http://struts.apache.org/dtds/struts-2.0.dtd">
- <struts>
- <constant name="struts.objectFactory" value="spring" />
- <!--
- <constant name="struts.objectFactory.spring.autoWire" value="type"/>
- -->
- <constant name="struts.devMode" value="true" />
- <constant name="struts.convention.classes.reload" value="true" />
- <!-- 結果資源所在路徑 -->
- <constant name="struts.convention.result.path" value="/" />
- <!-- 默認action所在的包 -->
- <constant name="struts.convention.default.parent.package"
- value="myPackage" />
- <!-- 不被convention組件掃描的包 -->
- <!-- <constant name="struts.convention.exclude.packages" value=""/> -->
- <package name="myPackage" extends="json-default">
- <global-results>
- <result name="exception">/error.jsp</result>
- <result name="error">/error.jsp</result>
- <result name="none">/error.jsp</result>
- <result name="login">/login.jsp</result>
- </global-results>
- <global-exception-mappings>
- <exception-mapping result="exception" exception="java.lang.Exception">
- </exception-mapping>
- </global-exception-mappings>
- </package>
- </struts>
第五步:測試
1、建立action類:IndexAction
- public class IndexAction extends BaseAction{
- private static final long serialVersionUID = 1L;
- ProcessEngine processEngine;
- RepositoryService repositoryService;
- ExecutionService executionService;
- TaskService taskService;
- HistoryService historyService;
- IdentityService identityService;
- 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 TaskService getTaskService(){
- return taskService;
- }
- public void setTaskService(TaskService taskService){
- this.taskService = taskService;
- }
- public HistoryService getHistoryService(){
- return historyService;
- }
- public void setHistoryService(HistoryService historyService){
- this.historyService = historyService;
- }
- public IdentityService getIdentityService(){
- return identityService;
- }
- public void setIdentityService(IdentityService identityService){
- this.identityService = identityService;
- }
- public String execute(){
- System.out.println("processEngine:" + this.getProcessEngine());
- System.out.println("repositoryService:"
- + this.getRepositoryService());
- System.out
- .println("executionServcie:" + this.getExecutionService());
- System.out.println("taskService:" + this.getTaskService());
- System.out.println("historyService:" + this.getHistoryService());
- return SUCCESS;
- }
- }
public class IndexAction extends BaseAction{
private static final long serialVersionUID = 1L;
ProcessEngine processEngine;
RepositoryService repositoryService;
ExecutionService executionService;
TaskService taskService;
HistoryService historyService;
IdentityService identityService;
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 TaskService getTaskService(){
return taskService;
}
public void setTaskService(TaskService taskService){
this.taskService = taskService;
}
public HistoryService getHistoryService(){
return historyService;
}
public void setHistoryService(HistoryService historyService){
this.historyService = historyService;
}
public IdentityService getIdentityService(){
return identityService;
}
public void setIdentityService(IdentityService identityService){
this.identityService = identityService;
}
public String execute(){
System.out.println("processEngine:" + this.getProcessEngine());
System.out.println("repositoryService:"
+ this.getRepositoryService());
System.out
.println("executionServcie:" + this.getExecutionService());
System.out.println("taskService:" + this.getTaskService());
System.out.println("historyService:" + this.getHistoryService());
return SUCCESS;
}
}
2、啓動tomcat,訪問http://localhost:8080/ProjectName/index。控制檯出現以下內容:
- processEngine:org.jbpm.pvm.internal.processengine.SpringProcessEngine@2553861
- repositoryService:org.jbpm.pvm.internal.repository.RepositoryServiceImpl@22b044e
- executionServcie:org.jbpm.pvm.internal.svc.ExecutionServiceImpl@220d12e
- taskService:org.jbpm.pvm.internal.svc.TaskServiceImpl@22d9289
- historyService:org.jbpm.pvm.internal.svc.HistoryServiceImpl@2257b64
、可以進一步進行事務測試,建立自己的Service類,添加測試方法,可以看到事務已由Spring統一管理,這裏就不提供代碼了
- identityService:org.jbpm.pvm.internal.svc.IdentityServiceImpl@223f277
附件:所需的jar包(使用了hibernate annotation和struts2的convention-plugin,可能有多餘的包,沒做清理):