67.4. 在流程引擎中配置持久性
如果您在不配置任何持久性的情况下使用进程引擎,它不会将运行时数据保存到任何数据库;默认没有可用的内存数据库。如果出于性能原因或者想要自己管理持久性的原因,您可以使用这个模式。
要在流程引擎中使用 JPA 持久性,您必须对其进行配置。
配置通常需要添加必要的依赖项、配置数据源并创建配置了持久性的进程引擎类。
67.4.1. 在 persistence.xml 文件中配置 复制链接链接已复制到粘贴板!
要使用 JPA 持久性,您必须在类路径中添加 persistence.xml 持久性配置,以配置 JPA 以使用 Hibernate 和 H2 数据库(或者您需要的任何其他数据库)。将此文件放到项目的 META-INF 目录中。
persistence.xml 文件示例
示例引用 jdbc/jbpm-ds 数据源。有关配置数据源的步骤,请参阅 第 67.4.2 节 “为流程引擎持久性配置数据源”。
67.4.2. 为流程引擎持久性配置数据源 复制链接链接已复制到粘贴板!
要在流程引擎中配置 JPA 持久性,您必须提供一个代表数据库后端的数据源。
如果您在应用服务器(如 Red Hat JBoss EAP)中运行您的应用程序,您可以使用应用服务器设置数据源,例如在 部署 目录中添加数据源。有关创建数据源的说明,请参阅应用服务器的文档。
如果您将应用程序部署到 Red Hat JBoss EAP,您可以通过在 部署 目录中创建配置文件来创建数据源:
红帽 JBoss EAP 数据源配置文件示例
如果您的应用程序在普通的 Java 环境中运行,您可以使用 Red Hat Process Automation Manager 提供的 kie-test-util 模块中的 DataSourceFactory 类来使用 Narayana 和 Tomcat DBCP。请查看以下代码片段。这个示例使用 H2 内存中的数据库,与 Narayana 和 Tomcat DBCP 结合使用。
配置 H2 内存中数据库数据源的代码示例
67.4.3. 持久性的依赖项 复制链接链接已复制到粘贴板!
持久性需要特定的 JAR 构件依赖项。
jbpm-persistence-jpa.jar 文件始终是必需的。此文件包含可在需要时保存运行时状态的代码。
根据您使用的持久性解决方案和数据库,您可能需要额外的依赖项。默认配置组合包括以下组件:
- Hibernate 作为 JPA 持久供应商
- H2 内存中数据库
- 基于 JTA 的事务管理 Narayana
- 用于连接池功能的 Tomcat DBCP
此配置需要以下额外依赖项:
-
jbpm-persistence-jpa(org.jbpm) -
drools-persistence-jpa(org.drools) -
persistence-api(javax.persistence) -
hibernate-entitymanager(org.hibernate) -
hibernate-annotations(org.hibernate) -
hibernate-commons-annotations(org.hibernate) -
hibernate-core(org.hibernate) -
commons-collections(commons-collections) -
dom4j(org.dom4j) -
jta(javax.transaction) -
narayana-jta(org.jboss.narayana.jta) -
tomcat-dbcp(org.apache.tomcat) -
jboss-transaction-api_1.2_spec(org.jboss.spec.javax.transaction) -
javassist(javassist) -
slf4j-api(org.slf4j) -
slf4j-jdk14(org.slf4j) -
simple-jndi(simple-jndi) -
h2(com.h2database) -
jBPM-test(仅限于测试的org.jbpm)不要将这个工件包括在 production 应用程序中
67.4.4. 创建具有持久性的 KIE 会话 复制链接链接已复制到粘贴板!
如果您的代码直接创建 KIE 会话,您可以使用 JPAKnowledgeService 类来创建 KIE 会话。这个方法提供了对底层配置的完整访问权限。
流程
使用
JPAKnowledgeService类创建一个 KIE 会话会话,基于 KIE 基础、KIE 会话配置(如果需要)和一个环境。该环境必须包含对用于持久性的实体管理器工厂的引用。创建具有持久性的 KIE 会话
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 要根据特定会话 ID 从数据库重新创建会话,请使用
JPAKnowledgeService.loadStatefulKnowledgeSession()方法:从持久性数据库重新创建 KIE 会话
// re-create the session from database using the sessionId ksession = JPAKnowledgeService.loadStatefulKnowledgeSession(sessionId, kbase, null, env );
// re-create the session from database using the sessionId ksession = JPAKnowledgeService.loadStatefulKnowledgeSession(sessionId, kbase, null, env );Copy to Clipboard Copied! Toggle word wrap Toggle overflow
67.4.5. 运行时管理器中的持久性 复制链接链接已复制到粘贴板!
如果您的代码使用 RuntimeManager 类,请使用 RuntimeEnvironmentBuilder 类来配置用于持久性的环境。默认情况下,运行时管理器会搜索 org.jbpm.persistence.jpa persistence 单元。
以下示例创建了一个带有空上下文的 KieSession。
使用运行时管理器创建带有空上下文的 KIE 会话
前面的示例需要 KIE 基础作为 kbase 参数。您可以使用类路径上的 kmodule.xml KJAR 描述符来构建 KIE 基础。
从 kmodule.xml KJAR 描述符构建 KIE 基础
KieServices ks = KieServices.Factory.get();
KieContainer kContainer = ks.getKieClasspathContainer();
KieBase kbase = kContainer.getKieBase("kbase");
KieServices ks = KieServices.Factory.get();
KieContainer kContainer = ks.getKieClasspathContainer();
KieBase kbase = kContainer.getKieBase("kbase");
kmodule.xml 描述符文件可以包含用于扫描的资源软件包的属性,以查找和部署进程引擎工作流。
kmodule.xml 描述符文件示例
<kmodule xmlns="http://jboss.org/kie/6.0.0/kmodule"> <kbase name="kbase" packages="com.sample"/> </kmodule>
<kmodule xmlns="http://jboss.org/kie/6.0.0/kmodule">
<kbase name="kbase" packages="com.sample"/>
</kmodule>
要控制持久性,您可以使用 RuntimeEnvironmentBuilder::entityManagerFactory 方法。
在运行时管理器中控制持久性配置
在这个示例中创建 ksession KIE 会话后,您可以在 ksession 中调用方法,例如 StartProcess()。进程引擎会在配置的数据源中保留运行时状态。
您可以使用进程实例 ID 从持久性存储恢复进程实例。runtime Manager 会自动重新创建所需的会话。
使用进程实例 ID 从持久性数据库重新创建 KIE 会话
RuntimeEngine runtime = manager.getRuntimeEngine(ProcessInstanceIdContext.get(processInstanceId)); KieSession session = runtime.getKieSession();
RuntimeEngine runtime = manager.getRuntimeEngine(ProcessInstanceIdContext.get(processInstanceId));
KieSession session = runtime.getKieSession();