jBPM 持久性不起作用

jBPM Persistance Doesn't Work

我现在正在做一个 jBPM 项目,但我无法让 jBPM 将其状态保存到数据库中。在我 运行 一个过程之后,我在表中看不到任何记录。我希望在 processinstancelog、sessioninfo 或 nodeinstancelog 中看到记录,但是有 none。 我使用 PostgreSQL。

persistence.xml

<persistence version="2.0"
             xmlns="http://java.sun.com/xml/ns/persistence"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">

    <persistence-unit name="org.jbpm.domain" transaction-type="JTA">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <jta-data-source>java:jboss/datasources/TestDS</jta-data-source>
        <mapping-file>META-INF/Taskorm.xml</mapping-file>
        <mapping-file>META-INF/JBPMorm.xml</mapping-file>
        <mapping-file>META-INF/Executor-orm.xml</mapping-file>
        <mapping-file>META-INF/Servicesorm.xml</mapping-file>
        <mapping-file>META-INF/TaskAuditorm.xml</mapping-file>

        <!-- engine -->
        <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>


        <!-- bam -->
        <class>org.jbpm.process.audit.ProcessInstanceLog</class>
        <class>org.jbpm.process.audit.NodeInstanceLog</class>
        <class>org.jbpm.process.audit.VariableInstanceLog</class>

        <properties>
            <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect"/>
            <property name="hibernate.max_fetch_depth" value="3"/>
            <property name="hibernate.hbm2ddl.auto" value="update"/>
            <property name="hibernate.show_sql" value="false"/>

            <property name="hibernate.id.new_generator_mappings" value="false"/>
            <property name="hibernate.transaction.jta.platform"
                      value="org.hibernate.service.jta.platform.internal.JBossAppServerJtaPlatform"/>
        </properties>
    </persistence-unit>

</persistence>

我的Java调用jBPM的方法

public Response test() {
    KieServices kieServices = KieServices.Factory.get();
    KieContainer kContainer = kieServices.getKieClasspathContainer();
    KieBase kBase = kContainer.getKieBase();
    KieSession ksession = kBase.newKieSession();
    ksession.getWorkItemManager().registerWorkItemHandler("Human Task", new WorkItemHandler() {
        @Override
        public void executeWorkItem(WorkItem workItem, WorkItemManager manager) {
            System.out.println("executeWorkItem done");
        }

        @Override
        public void abortWorkItem(WorkItem workItem, WorkItemManager manager) {
            System.out.println("abortWorkItem done");
        }
    });
    Map<String, Object> params = new HashMap<String, Object>();
    params.put("name", "world");
    ProcessInstance proc = ksession.startProcess("test-project.sample", params);
    System.out.println("ID: " + proc.getId());
    return Response.status(200).entity("ok " + proc.getId()).build();
}

我在数据库中创建了测试模式并运行代码后,我看到它已经创建了表,但它们都是空的。

有什么建议吗?

当您需要使用 jBPM 执行流程时,您应该始终使用 RuntimeEnvironment 来设置您的环境,然后通过 RuntimeManager/RuntimeEngine 访问引擎。 RuntimeEnvironment 将允许您使用通常绑定到某些特定持久性单元的 EntityManagerFactory 配置流程执行。

如果在 Eclipse 中生成 jBPM Hello World 应用程序,您可以检查此方法。

一些代码:

KieServices ks = KieServices.Factory.get();
KieContainer kContainer = ks.getKieClasspathContainer();
KieBase kbase = kContainer.getKieBase("kbase");

RuntimeManager manager = createRuntimeManager(kbase);
RuntimeEngine engine = manager.getRuntimeEngine(null);
KieSession ksession = engine.getKieSession();

和 createRuntimeManager 方法:

private static RuntimeManager createRuntimeManager(KieBase kbase) {
    JBPMHelper.startH2Server();
    JBPMHelper.setupDataSource();
    EntityManagerFactory emf = Persistence.createEntityManagerFactory("org.jbpm.persistence.jpa");
    RuntimeEnvironmentBuilder builder = RuntimeEnvironmentBuilder.Factory.get()
        .newDefaultBuilder().entityManagerFactory(emf)
        .knowledgeBase(kbase);
    return RuntimeManagerFactory.Factory.get()
        .newSingletonRuntimeManager(builder.get(), "com.sample:example:1.0");
}

此外,最好的做法是只创建一次 RuntimeManager,然后在需要与进程交互时从中获取 RuntimeEngine。