这篇指南描述了一种为了使Spring和jBPM(当然还有Seam)能使用同一个Hibernate SessionFactory而将Seam,Spring和jBPM集成的方法。
首先您要确保使用的是2.1.0版本的Seam,因为2.0.1版本的Seam和SpringTransaction会有些麻烦。
相关的配置部分如下:
1.在你的Spring bean配置中,像平常一样定义你的Hibernate SessionFactory并且设置如下这些属性
<bean id="hibernateSessionFactory" class="">
<!-- The hibernate properties -->
<property name="hibernateProperties">
<props>
<prop key="hibernate.hbm2ddl.auto">update</prop>
<!-- set to create-drop to NOT maintain state between two executions of the app -->
<prop key="hibernate.transaction.flush_before_completion">
true
</prop>
<prop key="hibernate.connection.release_mode">
after_transaction
</prop>
</props>
</property>
<!-- this property must be set to false so we can use independent sessions -->
<property name="useTransactionAwareDataSource">
<value>false</value>
</property>
<property name="mappingResources">
<list>
<!-- here you have to list all the *hbm.xml files for jBPM -->
<!-- see the default hibernate.cfg.xml file from jBPM -->
</bean>
2.为了集成Seam和Spring,我们需要两个bean
<bean id="sessionFactory"
class="org.jboss.seam.ioc.spring.SeamManagedSessionFactoryBean">
<property name="sessionName" value="hibernateSession" />
</bean>
<bean id="localTransactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="hibernateSessionFactory" />
</bean>
以上就是针对Spring的配置
现在我们需要配置components.xml文件
<!-- use the power of Spring transactions -->
<spring:spring-transaction platform-transaction-manager-name="localTransactionManager"/>
<persistence:managed-hibernate-session name="hibernateSession" auto-create="true"
session-factory="#{hibernateSessionFactory}"/>
<component class="org.jboss.seam.bpm.Jbpm">
<property name="processDefinitions">processdefinition.jpdl.xml</property>
</component>
为了在jBPM中使用hibernateSession,我从jBPM中扩展了一个子类DbPersistenceService:
package your.namespace.jbpm.integration;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.jboss.seam.Component;
import org.jboss.seam.contexts.Contexts;
import org.jbpm.svc.Service;
/**
* @author Frank Bitzer
*
* EL4J - The Extension Library for Java.
*
*/
public class DbPersistenceServiceFactory extends
org.jbpm.persistence.db.DbPersistenceServiceFactory {
private static final long serialVersionUID = 997L;
SessionFactory sessionFactory;
/**
* {@inheritDoc}
*/
public Service openService() {
//create instance of own service implementation
return new your.namespace.jbpm.integration.DbPersistenceService(this);
}
/**
* Retrieve Hibernate sessionFactory
*/
@Override
public synchronized SessionFactory getSessionFactory() {
if (sessionFactory==null) {
if(Contexts.isApplicationContextActive()){
//access seam component holding session
Session session = (Session)
Component.getInstance("hibernateSession");
//and extract sessionFactory
sessionFactory = session.getSessionFactory();
}
}
return sessionFactory;
}
/**
* Set sessionFactory
*/
@Override
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
}
package your.namespace.jbpm.integration;
import org.hibernate.Session;
import org.jbpm.JbpmContext;
import org.jbpm.persistence.db.DbPersistenceServiceFactory;
import org.jbpm.svc.Services;
import org.springframework.orm.hibernate3.SessionFactoryUtils;
/**
* @author Frank Bitzer
*
* EL4J - The Extension Library for Java.
*
*/
public class DbPersistenceService extends
org.jbpm.persistence.db.DbPersistenceService {
private static final long serialVersionUID = 996L;
public DbPersistenceService(
DbPersistenceServiceFactory persistenceServiceFactory) {
this(persistenceServiceFactory, getCurrentServices());
}
static Services getCurrentServices() {
Services services = null;
JbpmContext currentJbpmContext = JbpmContext.getCurrentJbpmContext();
if (currentJbpmContext != null) {
services = currentJbpmContext.getServices();
}
return services;
}
DbPersistenceService(DbPersistenceServiceFactory persistenceServiceFactory,
Services services) {
super(persistenceServiceFactory);
this.persistenceServiceFactory = persistenceServiceFactory;
this.isTransactionEnabled = persistenceServiceFactory
.isTransactionEnabled();
this.isCurrentSessionEnabled = persistenceServiceFactory
.isCurrentSessionEnabled();
this.services = services;
}
/**
* Use Hibernate sessionFactory to retrieve a Session instance.
*/
public Session getSession() {
if ((session == null) && (getSessionFactory() != null)) {
session = getSessionFactory().openSession();
mustSessionBeClosed = true;
mustSessionBeFlushed = true;
mustConnectionBeClosed = false;
isTransactionEnabled = !SessionFactoryUtils.isSessionTransactional(
session, getSessionFactory());
if (isTransactionEnabled) {
beginTransaction();
}
}
return session;
}
}
为了结束工作,只需要像下面一样简单的在jbpm.cfg.xml中使用刚刚定义的DbPersistenceService
<jbpm-context>
<service name="persistence">
<factory>
<bean class="your.namespace.jbpm.integration.DbPersistenceServiceFactory">
<field name="isTransactionEnabled">
<false/>
</field>
</bean>
</factory>
</service>
</jbpm-context>
同时,要保证你的Spring WebApplicationContext初始化要在seam启动之前,这个可以通过在你的web.xml中Spring的Listener方在org.jboss.seam.servlet.SeamListener之前来实现。
分享到:
相关推荐
droolsjbpm-integration, Drools和jBPM与 seam,spring,camel的集成. . 开发口水和 jBPM如果你想要构建或者贡献到一个项目,则阅读这里文档 。 我们将通过正确设置开发环境来节省你和我们大量的时间。 它解决了所有...
Seam、Spring、Hibernate和RichFaces是Java Web开发中的四大框架,它们的集成可以构建功能强大的企业级应用程序。本文将详细解析这四个组件的核心概念、它们如何协同工作以及配置过程。 **Seam框架** Seam是一款...
这个例子对于学习如何在Java EE环境中集成和使用Seam、JBPM、EJB和JSF非常有价值。它展示了如何在Eclipse中配置和管理这样的项目,以及如何利用这些技术来创建一个完整的、带有工作流程管理功能的应用程序。通过这个...
- **工作原理**:这个示例演示了如何利用 SEAM 和 jBPM 来实现工作流集成,具体包括任务的分配、跟踪和完成等。 ##### 1.5 SEAM 页面流:猜数字游戏示例 - **代码分析**: - 通过 SEAM 的页面流功能实现简单的猜...
Seam是一个全面的Java开发框架,专...总之,拥有《Seam In Action》、《JBoss Seam》和《官方中文指南》这些资源,开发者可以系统地学习和精通Seam框架,从而在企业级Java应用开发中游刃有余,提高开发效率和应用质量。
- **工作原理**:通过Seam与jBPM的集成,实现了业务流程与Web界面的紧密结合。 ##### 2.4 Seam页面流:猜数字游戏 - **理解代码**:解释了一个使用Seam页面流技术实现的简单猜数字游戏。 - **工作原理**:页面流是...
Jboss Seam中文开发指南 Jboss Seam是基于Java EE 5.0的框架,提供了一个基于组件的架构,能够帮助开发者快速构建企业级应用程序。Seam框架提供了一个统一的编程模型,能够将JSF、EJB、JPA等技术整合在一起,提供了...
4. **支持多种流程定义语言**:除了默认支持的jPDL、WS-BPEL和Seam框架的Pageflow外,jBPM还计划支持更多流程定义语言,以适应不同的业务场景需求。 5. **严格的流程版本控制**:jBPM提供了严格的版本控制机制,...
与Seam,Spring,OSGi等集成 BPM通过以业务用户和开发人员喜欢的方式提供流程管理功能和工具,从而实现业务分析师,开发人员和最终用户之间的桥梁。域特定的节点可以插入调色板,使业务用户更容易理解这些过程。 ...
这是中文手册,Seam为持久化集成了JPA和Hibernate 3,为轻量化的异步性集成了EJB Timer Service和Quartz,为工作流集成了jBPM,为业务规则集成了JBoss规则,为电子邮件集成了Meldware Mail,为完整的文本搜索集成了...
为了帮助开发人员快速上手,Seam 2.1 提供了一系列的工具和指南,包括使用 seam-gen 快速生成项目模板的方法。 - **Setting up an Eclipse project**:指导如何在 Eclipse IDE 中设置 Seam 2.1 的开发环境。 - **...
3. **JSF集成指南**:深入理解Seam与JSF的交互,包括Facelets模板和Seam组件的使用。 4. **EJB和CDI集成**:讲解Seam如何与Enterprise JavaBeans和Contexts and Dependency Injection (CDI)框架协作。 5. **持久化...
除了以上示例外,Seam框架还提供了详细的指南来帮助开发者快速搭建开发环境,并介绍了一系列实用的工具和技术,如seam-gen等。 - **Seam-gen**:Seam-gen是一个基于Maven的工具,可以帮助开发者自动生成项目骨架、...
- **Seam 和 jBPM 集成**:通过将 Seam 组件与 jBPM 流程引擎相结合,实现业务流程的自动化。 - **任务管理**:Seam 负责用户界面和交互逻辑,jBPM 负责处理任务的执行流程。 **1.4.2 工作原理** - **流程定义**:...
结合了Seam和jBPM(Java Business Process Management),实现了一个待办事项管理应用,展示了如何集成工作流引擎。 1. **代码理解**:重点介绍了如何定义业务流程,并将其与Seam组件关联起来。 2. **工作原理**:...
除了JBPM(一个用于业务流程管理的工具)之外,Seam还支持与其他常用的工具和组件如Spring、邮件发送、权限管理等进行集成,从而增强应用的功能。 #### 三、Seam框架的功能与特点 ##### 1. 一站式(FullStack)的...
Seam 2.0 是一个全面的Java EE框架,它为开发人员提供了一种整合多种技术,如JavaServer Faces (JSF)、Enterprise JavaBeans (EJB)、Java Persistence API (JPA)以及Spring等的强大工具。这个"Seam_2.0_Reference_zh...
Seam集成了Spring Security(原Acegi)和其他安全组件,提供了一套完整的安全解决方案。 5. **rich-client**:这部分可能涉及Seam与富客户端界面(Rich Client Interface, RCI)的集成,如使用RichFaces库来增强JSF...