8.1.3.2. 使用JBPMHelper
来配置引擎去使用持久化
要配置jBPM引擎来使用持久化,通常在创建session的时候可以通过使用适当的构造器。有很多方式来创建session(为了尽可能的为你简化提供了几个工具类给你,在你编写一个流程单元测试的时候可以用到)。
最简单的方式是使用jbpm-test模块来轻松创建和测试流程。JBPMHelper类有个创建session的方法,并使用一个配置文件来配置session,配置包括是否想使用持久化、数据源等等。这个帮助类接下来会为你做所有的安装和配置。
要配置持久化,要创建一个jBPM.properties文件并配置下面的属性(注意下面给的例子是默认的配置,使用H2内存数据库来启用持久化,如果你感觉这些配置很好了,就不要再添加新的配置文件,默认就用到这些属性)。
# 用于创建数据源
persistence.datasource.name=jdbc/jbpm-ds
persistence.datasource.user=sa
persistence.datasource.password=
persistence.datasource.url=jdbc:h2:tcp://localhost/~/jbpm-db
persistence.datasource.driverClassName=org.h2.Driver
# 用于配置session持久化
persistence.enabled=true
persistence.persistenceunit.name=org.jbpm.persistence.jpa
persistence.persistenceunit.dialect=org.hibernate.dialect.H2Dialect
# 用于配置人工任务服务
taskservice.enabled=true
taskservice.datasource.name=org.jbpm.task
taskservice.transport=mina
taskservice.usergroupcallback=org.jbpm.task.service.DefaultUserGroupCallbackImpl
如果你要使用持久化,你必须确保数据源(在jBPM.properties文件中指定的)正确初始化。这意味着数据库本身要启动并运行,并且数据库 应该使用正确的名称来注册。如果你想要使用H2内存数据库(通常最易于做一些测试),你可以使用JBPMHelper类来启动它,使用下面语法:
JBPMHelper.startH2Server();
要注册数据源(这是你总要做的,尽管你不使用H2作为你的数据库,检查下面更多的选项来配置你的数据库),使用:
JBPMHelper.setupDataSource();
接下来,你可以使用JBPMHelper类来创建session(先要创建知识库,这个和不使用持久化的情况是一样的):
StatefulKnowledgeSession ksession = JBPMHelper.newStatefulKnowledgeSession(kbase);
这些都做好了,你只要调用这个ksession上的方法(如startProcess)然后引擎会在创建好的数据源中持久化所有的运行时状态。
你也可以使用JBPMHelper类来重新创建session(通过从数据库恢复它的状态,只需要传递session id(id可使用ksession.getId()方法获取到)):
StatefulKnowledgeSession ksession =
JBPMHelper.loadStatefulKnowledgeSession(kbase, sessionId);
8.1.3.3. 手动配置引擎来使用持久化
你也可以使用JPAKnowledgeService来创建知识会话。这稍微复杂些,但会让你访问到所有的优先配置。你可以使用基于 知识库、知识会话配置(如果必要)和环境的JPAKnowledgeService来创建一个新的知识会话。环境需要包含对你的实体管理器工厂的引用,例 如:
// 创建实体管理器工厂并在环境中注册它
EntityManagerFactory emf =
Persistence.createEntityManagerFactory( "org.jbpm.persistence.jpa" );
Environment env = KnowledgeBaseFactory.newEnvironment();
env.set( EnvironmentName.ENTITY_MANAGER_FACTORY, emf );
// 创建一个新的知识会话来使用JPA存储运行时状态
StatefulKnowledgeSession ksession =
JPAKnowledgeService.newStatefulKnowledgeSession( kbase, null, env );
int sessionId = ksession.getId();
// 这儿调用你自己的方法
ksession.startProcess( "MyProcess" );
ksession.dispose();
你也可以使用JPAKnowledgeService来根据一个指定的session id重新创建session:
// 使用sessionId从数据库恢复session
ksession = JPAKnowledgeService.loadStatefulKnowledgeSession(
sessionId, kbase, null, env );
你需要添加持久化配置到你的类路径下,以便配置JPA使用Hibernate和H2数据库(或其他数据库),要创建一个META-INF目录来存放 一个persistence.xml文件,显示如下。更多关于如何修改这些配置,可以从JPA和Hibernate文档中获取更多信息。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<persistence
version="1.0"
xsi:schemaLocation=
"http://java.sun.com/xml/ns/persistence
http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd
http://java.sun.com/xml/ns/persistence/orm
http://java.sun.com/xml/ns/persistence/orm_1_0.xsd"
xmlns:orm="http://java.sun.com/xml/ns/persistence/orm"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/persistence">
<persistence-unit name="org.jbpm.persistence.jpa" transaction-type="JTA">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<jta-data-source>jdbc/jbpm-ds</jta-data-source>
<mapping-file>META-INF/JBPMorm.xml</mapping-file>
<class>org.drools.persistence.info.SessionInfo</class>
<class>org.jbpm.persistence.processinstance.ProcessInstanceInfo</class>
<class>org.drools.persistence.info.WorkItemInfo</class>
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>
<property name="hibernate.max_fetch_depth" value="3"/>
<property name="hibernate.hbm2ddl.auto" value="update"/>
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.transaction.manager_lookup_class"
value="org.hibernate.transaction.BTMTransactionManagerLookup"/>
</properties>
</persistence-unit>
</persistence>
这个配置文件指向的数据源叫做“jbdc/jbpm-ds”。如果在你的应用服务器中运行应用(例如JBoss AS),这些容器可以使用自己的一些配置来简单建立数据源(例如在部署目录中放一个数据源配置文件)。可以参考你的应用服务器的文档来获取如何配置这些。
例如,如果你部署应用到JBoss 应用服务器 v5.x中,你可以在部署目录中丢进一个配置文件来创建数据源,如:
<?xml version="1.0" encoding="UTF-8"?>
<datasources>
<local-tx-datasource>
<jndi-name>jdbc/jbpm-ds</jndi-name>
<connection-url>jdbc:h2:tcp://localhost/~/test</connection-url>
<driver-class>org.h2.jdbcx.JdbcDataSource</driver-class>
<user-name>sa</user-name>
<password></password>
</local-tx-datasource>
</datasources>
如果你在Java环境中执行的话,你可以使用JBPMHelper类来做这个(如上)或者可用下面的代码段来建立数据源(这儿我们把Bitronix和H2内存数据库结合使用了)。
PoolingDataSource ds = new PoolingDataSource();
ds.setUniqueName("jdbc/jbpm-ds");
ds.setClassName("bitronix.tm.resource.jdbc.lrc.LrcXADataSource");
ds.setMaxPoolSize(3);
ds.setAllowLocalTransactions(true);
ds.getDriverProperties().put("user", "sa");
ds.getDriverProperties().put("password", "sasa");
ds.getDriverProperties().put("URL", "jdbc:h2:tcp://localhost/~/jbpm-db");
ds.getDriverProperties().put("driverClassName", "org.h2.Driver");
ds.init();