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。
我现在正在做一个 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。