一是通过Spring暴露出服务,服务配|到Spring的IOC容器里;
二是在自qq行环境里访问到Spring的IOC容器Q能够轻松用Spring容器里所配置的服务;
三是对于h事务理Ҏ的目来说Q将事务理与Spring的事务管理进行合q?br />
下面分别讨论Q?br />
一?nbsp; 通过Spring暴露服务
q记得在jBPM4的运行期环境里提到的JbpmConfiguration吗?它是整个jBPM4的入口,q且是整个应用独此一份的。通过它可以获取processEngineQƈ藉此获得工作引擎所提供的各U服务:
ProcessEngine processEngine = new Configuration()
.buildProcessEngine();
RepositoryService repositoryService = processEngine.getRepositoryService();
ExecutionService executionService = processEngine.getExecutionService();
TaskService taskService = processEngine.getTaskService();
HistoryService historyService = processEngine.getHistoryService();
ManagementService managementService = processEngine.getManagementService();
通过Spring暴露q些服务Q配|如下:
<bean id="jbpmConfiguration" class="org.jbpm.pvm.internal.cfg.SpringConfiguration">
<constructor-arg value="be/inze/spring/demo/jbpm.cfg.xml" />
</bean>
<bean id="processEngine" factory-bean="jbpmConfiguration" factory-method="buildProcessEngine" />
<bean id="repositoryService" factory-bean="processEngine" factory-method="getRepositoryService" />
<bean id="executionService" factory-bean="processEngine" factory-method="getExecutionService" />
l心的你会发玎ͼ配置时用了JbpmConfiguration 的子cSpringConfiguration。SpringConfiguration相比JbpmConfiguration有哪些增强呢Q下面再讌ӀMQ现在,可以用Spring来获取或注入q些Jbpm4所提供的服务了?br />
二、在environment里加入SpringContext
jBPM4的environmentQ运行期环境Q提供Engine IOCQprocess-engine-contextQ和Transaction IOCQtransaction-contextQ。要惛_q行期方便地讉K到Spring里所配置的服务,最直接的方法就是在environment里加入Spring IOCQapplicationContextQ的引用?br />
SpringConfigurationx对JbpmConfiguration增强了对Spring IOC的一个引用?br />

SpringConfiguration是如何做到的呢?单,实现Spring的ApplicationContextAware接口Q自动持有applicationContextQ然后openEnvironment时将其加入environment?br />
environment.setContext(new SpringContext(applicationContext));
SpringContext是对applicationContext的简单封装?br />
那么什么从Engine IOCUL到Spring IOC了呢Q是的,最重要的就是Hibernate Session Factory?br />
在jbpm.cfg.xml的process-engine-context里干掉:
<hibernate-configuration>
<cfg resource="jbpm.hibernate.cfg.xml" />
</hibernate-configuration>
<hibernate-session-factory />
相关配置挪动至Spring配置文g?br />
三?nbsp; 事务
哪里有数据库操作Q哪里就有事务。对于嵌入式工作而言Q最重要的集成就是事务的集成。这里先分析jBPM4的事务实玎ͼ然后再介l集成入Spring的事务实现?br />
1?nbsp; Command模式
jBPM4的逻辑实现采用了Command模式?br />

采用Command模式后,jBPM4对CommandService构造拦截器QInterceptorQ链Q配|在jbpm.cfg.xml的process-engine-context里:
<command-service>
<retry-interceptor />
<environment-interceptor />
<standard-transaction-interceptor />
</command-service>
2?nbsp; 原有的事务实?br />
jBPM4原有的事务通过StandardTransactionInterceptor实现Q在CommandService执行Command之前打开事务Q实际委zHibernate的事务管理)Q完成后提交/回滚?br />

jBPM4的事务是ZCommand的?br />
3?nbsp; 集成入Spring的事务实?br />
Spring的事务是Z服务调用的?br />

使jBPM4使用Spring提供的事务:
<command-service>
<retry-interceptor />
<environment-interceptor />
<spring-transaction-interceptor current="true" />
</command-service>
拦截器换?strong>SpringTransactionInterceptorQSpringTransactionInterceptor从environment 提供的Spring IOC获取PlatformTransactionManagerQ用事务模板回调CommandQ事务传播模式强制加入当前事务?br />
同时Q对hibernate session的配|(jbpm.cfg.xml的transaction-contextQ强制从当前U程中获取:
<hibernate-session current="true"/>
q干掉原有的事务实现Q?br />
<transaction />
参考文档:
http://www.slideshare.net/guest8d4bce/spring-integration-with-jbpm4

]]>