jBPM和JPA事务管理器:没有要加入的本地事务

问题描述 投票:0回答:1

我很难建立一个jBPM7项目。我正在尝试将jBPM引擎与H2内存数据库一起使用,以利用人工任务服务。我已经如下设置数据源,实体管理器工厂和事务管理器:

application.properties

...
jbpm.datasource.jdbc-url=jdbc:h2:mem:testdb
jbpm.datasource.username=sa
jbpm.datasource.password=
...

JbpmDataConfiguration.java

@Configuration
@EnableTransactionManagement
public class JbpmDataConfiguration {
    @Bean(name = "jbpmDataSource")
    @ConfigurationProperties(prefix = "jbpm.datasource")
    public DataSource dataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "jbpmEntityManagerFactory")
    public LocalContainerEntityManagerFactoryBean jbpmEntityManagerFactory(EntityManagerFactoryBuilder builder, @Qualifier("jbpmDataSource") DataSource dataSource) {
        Map<String, String> properties = new HashMap<>();
        properties.put("hibernate.hbm2ddl.auto", "create");
        return builder.dataSource(dataSource)
            .mappingResources("META-INF/Taskorm.xml")
            .packages("org.jbpm.services.task.impl.model")
            .persistenceUnit("jbpm-persistence-unit")
            .properties(properties)
            .build();
    }

    @Bean(name = "jbpmTransactionManager")
    public JpaTransactionManager jbpmTransactionManager(@Qualifier("jbpmEntityManagerFactory") EntityManagerFactory entityManagerFactory) {
        JpaTransactionManager jpaTransactionManager = new JpaTransactionManager();
        jpaTransactionManager.setEntityManagerFactory(entityManagerFactory);
        return jpaTransactionManager;
    }
}

在我的资源文件夹中,在resources / META-INF /中有一个kmodule.xml。我所有的.bpmn文件都位于resources / com / mydomain / flow /

<kmodule xmlns="http://jboss.org/kie/6.0.0/kmodule">
    <kbase name="kbase" packages="com.mydomain.flow" />
</kmodule>

然后我将使用以下内容创建运行时引擎:

@Configuration
public class MyRuntimeEngine {

    @Autowired
    @Qualifier("jbpmEntityManagerFactory")
    private EntityManagerFactory entityManagerFactory;

    @Autowired
    @Qualifier("jbpmTransactionManager")
    private JpaTransactionManager transactionManager;

    @Bean
    public RuntimeManager runtimeManager() {
        KieServices kieServices = KieServices.Factory.get();
        KieContainer kieContainer = kieServices.getKieClasspathContainer();
        KieBase kieBase = kieContainer.getKieBase("kbase");

        RuntimeEnvironmentBuilder runtimeEnvironmentBuilder = RuntimeEnvironmentBuilder.Factory.get()
            .newDefaultInMemoryBuilder()
            .entityManagerFactory(entityManagerFactory)
            .addEnvironmentEntry(EnvironmentName.TRANSACTION_MANAGER, transactionManager);
        RuntimeEnvironment runtimeEnvironment = runtimeEnvironmentBuilder.knowledgeBase(kieBase).get();
        return RuntimeManagerFactory.Factory.get().newSingletonRuntimeManager(runtimeEnvironment);
    }
}

我将RuntimeManager bean自动装配到另一个配置类中,因此我可以配置全局变量和工作项处理程序。完成后,这将公开一个KieSession bean。为了开始一个过程,我将KieSession自动装配到我的一个控制器中,并调用startProcess:

kieSession.startProcess(processName, processVariables);

这将导致以下错误:

javax.persistence.TransactionRequiredException: No local transaction to join
        at org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.doJoinTransaction(ExtendedEntityManagerCreator.java:391) ~[spring-orm-5.1.6.RELEASE.jar:5.1.6.RELEASE]
        at org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:333) ~[spring-orm-5.1.6.RELEASE.jar:5.1.6.RELEASE]
        at com.sun.proxy.$Proxy160.joinTransaction(Unknown Source) ~[na:na]
        at org.jbpm.process.audit.JPAWorkingMemoryDbLogger.joinTransaction(JPAWorkingMemoryDbLogger.java:318) ~[jbpm-audit-7.22.0.Final.jar:7.22.0.Final]
        at org.jbpm.process.audit.JPAWorkingMemoryDbLogger.persist(JPAWorkingMemoryDbLogger.java:246) ~[jbpm-audit-7.22.0.Final.jar:7.22.0.Final]
        at org.jbpm.process.audit.JPAWorkingMemoryDbLogger.afterVariableChanged(JPAWorkingMemoryDbLogger.java:133) ~[jbpm-audit-7.22.0.Final.jar:7.22.0.Final]
        at org.drools.core.event.ProcessEventSupport.fireAfterVariableChanged(ProcessEventSupport.java:155) ~[drools-core-7.22.0.Final.jar:7.22.0.Final]
        at org.jbpm.process.instance.context.variable.VariableScopeInstance.setVariable(VariableScopeInstance.java:114) ~[jbpm-flow-7.22.0.Final.jar:7.22.0.Final]
        at org.jbpm.process.instance.AbstractProcessInstanceFactory.createProcessInstance(AbstractProcessInstanceFactory.java:59) ~[jbpm-flow-7.22.0.Final.jar:7.22.0.Final]
        at org.jbpm.process.instance.ProcessRuntimeImpl.startProcess(ProcessRuntimeImpl.java:260) ~[jbpm-flow-7.22.0.Final.jar:7.22.0.Final]
        at org.jbpm.process.instance.ProcessRuntimeImpl.createProcessInstance(ProcessRuntimeImpl.java:242) ~[jbpm-flow-7.22.0.Final.jar:7.22.0.Final]
        at org.jbpm.process.instance.ProcessRuntimeImpl.createProcessInstance(ProcessRuntimeImpl.java:200) ~[jbpm-flow-7.22.0.Final.jar:7.22.0.Final]
        at org.jbpm.process.instance.ProcessRuntimeImpl.startProcess(ProcessRuntimeImpl.java:190) ~[jbpm-flow-7.22.0.Final.jar:7.22.0.Final]
        at org.jbpm.process.instance.ProcessRuntimeImpl.startProcess(ProcessRuntimeImpl.java:185) ~[jbpm-flow-7.22.0.Final.jar:7.22.0.Final]
...

如何正确配置事务管理器以与jBPM一起使用?

java spring jbpm kie
1个回答
0
投票

我在设置JBPM 7.x版本时也遇到了同样的麻烦。您是否能够使JBPM与JPA事务管理器一起运行...从官方文档中看来,如果需要在嵌入式模式下使用JBPM,我们似乎需要像Narnarnan或bitronix这样的外部事务管理器实现]

© www.soinside.com 2019 - 2024. All rights reserved.