jBPM и JPA Transaction Manager: нет локальной транзакции для присоединения - PullRequest
0 голосов
/ 01 июня 2019

Мне очень тяжело настраивать проект jBPM7. Я пытаюсь использовать движок jBPM с базой данных H2 в памяти, чтобы использовать Human Task Service. Я настроил источник данных, фабрику менеджера сущностей и менеджер транзакций, как показано ниже:

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;
    }
}

В моей папке ресурсов у меня есть kmodule.xml в ресурсах / META-INF /. Все мои файлы .bpmn находятся в ресурсах / 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);
    }
}

Я автоматически подключаю bean-компонент RuntimeManager к другому классу конфигурации, чтобы я мог настраивать глобальные переменные и обработчики рабочих элементов. Это тогда выставляет bean-компонент KieSession, как только это будет сделано. Чтобы затем запустить процесс, я автоматически подключаю 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?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...