67.4. 在流程引擎中配置持久性


如果您在不配置任何持久性的情况下使用进程引擎,它不会将运行时数据保存到任何数据库;默认没有可用的内存数据库。如果出于性能原因或者想要自己管理持久性的原因,您可以使用这个模式。

要在流程引擎中使用 JPA 持久性,您必须对其进行配置。

配置通常需要添加必要的依赖项、配置数据源并创建配置了持久性的进程引擎类。

67.4.1. 在 persistence.xml 文件中配置

要使用 JPA 持久性,您必须在类路径中添加 persistence.xml 持久性配置,以配置 JPA 以使用 Hibernate 和 H2 数据库(或者您需要的任何其他数据库)。将此文件放到项目的 META-INF 目录中。

persistence.xml 文件示例

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<persistence
      version="2.0"
      xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd
      http://java.sun.com/xml/ns/persistence/orm http://java.sun.com/xml/ns/persistence/orm_2_0.xsd"
      xmlns="http://java.sun.com/xml/ns/persistence"
      xmlns:orm="http://java.sun.com/xml/ns/persistence/orm"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

  <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>
    <class>org.jbpm.persistence.correlation.CorrelationKeyInfo</class>
    <class>org.jbpm.persistence.correlation.CorrelationPropertyInfo</class>
    <class>org.jbpm.runtime.manager.impl.jpa.ContextMappingInfo</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.connection.release_mode" value="after_transaction"/>
            <property name="hibernate.transaction.jta.platform" value="org.hibernate.service.jta.platform.internal.JBossStandAloneJtaPlatform"/>
    </properties>
  </persistence-unit>
</persistence>
Copy to Clipboard Toggle word wrap

示例引用 jdbc/jbpm-ds 数据源。有关配置数据源的步骤,请参阅 第 67.4.2 节 “为流程引擎持久性配置数据源”

67.4.2. 为流程引擎持久性配置数据源

要在流程引擎中配置 JPA 持久性,您必须提供一个代表数据库后端的数据源。

如果您在应用服务器(如 Red Hat JBoss EAP)中运行您的应用程序,您可以使用应用服务器设置数据源,例如在 部署 目录中添加数据源。有关创建数据源的说明,请参阅应用服务器的文档。

如果您将应用程序部署到 Red Hat JBoss EAP,您可以通过在 部署 目录中创建配置文件来创建数据源:

红帽 JBoss EAP 数据源配置文件示例

<?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>
Copy to Clipboard Toggle word wrap

如果您的应用程序在普通的 Java 环境中运行,您可以使用 Red Hat Process Automation Manager 提供的 kie-test-util 模块中的 DataSourceFactory 类来使用 Narayana 和 Tomcat DBCP。请查看以下代码片段。这个示例使用 H2 内存中的数据库,与 Narayana 和 Tomcat DBCP 结合使用。

配置 H2 内存中数据库数据源的代码示例

Properties driverProperties = new Properties();
driverProperties.put("user", "sa");
driverProperties.put("password", "sa");
driverProperties.put("url", "jdbc:h2:mem:jbpm-db;MVCC=true");
driverProperties.put("driverClassName", "org.h2.Driver");
driverProperties.put("className", "org.h2.jdbcx.JdbcDataSource");
PoolingDataSourceWrapper pdsw = DataSourceFactory.setupPoolingDataSource("jdbc/jbpm-ds", driverProperties);
Copy to Clipboard Toggle word wrap

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 会话。这个方法提供了对底层配置的完整访问权限。

流程

  1. 使用 JPAKnowledgeService 类创建一个 KIE 会话会话,基于 KIE 基础、KIE 会话配置(如果需要)和一个环境。该环境必须包含对用于持久性的实体管理器工厂的引用。

    创建具有持久性的 KIE 会话

    // create the entity manager factory and register it in the environment
    EntityManagerFactory emf =
        Persistence.createEntityManagerFactory( "org.jbpm.persistence.jpa" );
    Environment env = KnowledgeBaseFactory.newEnvironment();
    env.set( EnvironmentName.ENTITY_MANAGER_FACTORY, emf );
    
    // create a new KIE session that uses JPA to store the runtime state
    StatefulKnowledgeSession ksession = JPAKnowledgeService.newStatefulKnowledgeSession( kbase, null, env );
    int sessionId = ksession.getId();
    
    // invoke methods on your method here
    ksession.startProcess( "MyProcess" );
    ksession.dispose();
    Copy to Clipboard Toggle word wrap

  2. 要根据特定会话 ID 从数据库重新创建会话,请使用 JPAKnowledgeService.loadStatefulKnowledgeSession() 方法:

    从持久性数据库重新创建 KIE 会话

    // re-create the session from database using the sessionId
    ksession = JPAKnowledgeService.loadStatefulKnowledgeSession(sessionId, kbase, null, env );
    Copy to Clipboard Toggle word wrap

67.4.5. 运行时管理器中的持久性

如果您的代码使用 RuntimeManager 类,请使用 RuntimeEnvironmentBuilder 类来配置用于持久性的环境。默认情况下,运行时管理器会搜索 org.jbpm.persistence.jpa persistence 单元。

以下示例创建了一个带有空上下文的 KieSession

使用运行时管理器创建带有空上下文的 KIE 会话

RuntimeEnvironmentBuilder builder = RuntimeEnvironmentBuilder.Factory.get()
        .newDefaultBuilder()
        .knowledgeBase(kbase);
RuntimeManager manager = RuntimeManagerFactory.Factory.get()
        .newSingletonRuntimeManager(builder.get(), "com.sample:example:1.0");
RuntimeEngine engine = manager.getRuntimeEngine(EmptyContext.get());
KieSession ksession = engine.getKieSession();
Copy to Clipboard Toggle word wrap

前面的示例需要 KIE 基础作为 kbase 参数。您可以使用类路径上的 kmodule.xml KJAR 描述符来构建 KIE 基础。

kmodule.xml KJAR 描述符构建 KIE 基础

KieServices ks = KieServices.Factory.get();
KieContainer kContainer = ks.getKieClasspathContainer();
KieBase kbase = kContainer.getKieBase("kbase");
Copy to Clipboard Toggle word wrap

kmodule.xml 描述符文件可以包含用于扫描的资源软件包的属性,以查找和部署进程引擎工作流。

kmodule.xml 描述符文件示例

<kmodule xmlns="http://jboss.org/kie/6.0.0/kmodule">
  <kbase name="kbase" packages="com.sample"/>
</kmodule>
Copy to Clipboard Toggle word wrap

要控制持久性,您可以使用 RuntimeEnvironmentBuilder::entityManagerFactory 方法。

在运行时管理器中控制持久性配置

EntityManagerFactory emf = Persistence.createEntityManagerFactory("org.jbpm.persistence.jpa");

RuntimeEnvironment runtimeEnv = RuntimeEnvironmentBuilder.Factory
        .get()
        .newDefaultBuilder()
        .entityManagerFactory(emf)
        .knowledgeBase(kbase)
        .get();

StatefulKnowledgeSession ksession = (StatefulKnowledgeSession) RuntimeManagerFactory.Factory.get()
        .newSingletonRuntimeManager(runtimeEnv)
        .getRuntimeEngine(EmptyContext.get())
        .getKieSession();
Copy to Clipboard Toggle word wrap

在这个示例中创建 ksession KIE 会话后,您可以在 ksession 中调用方法,例如 StartProcess()。进程引擎会在配置的数据源中保留运行时状态。

您可以使用进程实例 ID 从持久性存储恢复进程实例。runtime Manager 会自动重新创建所需的会话。

使用进程实例 ID 从持久性数据库重新创建 KIE 会话

RuntimeEngine runtime = manager.getRuntimeEngine(ProcessInstanceIdContext.get(processInstanceId));

KieSession session = runtime.getKieSession();
Copy to Clipboard Toggle word wrap

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat