【问题标题】:Camunda Spring Transaction Integration not workingCamunda Spring事务集成不起作用
【发布时间】:2016-05-27 14:32:15
【问题描述】:

我正在使用 Camunda 7.3、Spring 4.2.4 和 Hibernate 4.3.8,并尝试将它们与 Camunda Documentation 中解释的相同事务一起使用。该事务可以在 Hibernate 操作中正常工作,但不能与 Camunda 操作一起工作,如果发生事务回滚,则仅恢复休眠操作。

@Configuration
public class CamundaConfiguration {

    // Variables with connection Data

    public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
        LocalContainerEntityManagerFactoryBean bean = new LocalContainerEntityManagerFactoryBean();
        bean.setPersistenceUnitName("PostgreSQL");
        bean.setDataSource(dataSource());
        bean.getJpaPropertyMap().put("hibernate.dialect", "org.hibernate.dialect.PostgreSQL82Dialect");
        bean.getJpaPropertyMap().put("hibernate.ejb.naming_strategy", NamingStrategyLowerCase.class.getCanonicalName());
        bean.getJpaPropertyMap().put("hibernate.jdbc.batch_size", 0);
        bean.getJpaPropertyMap().put("hibernate.cache.use_second_level_cache", true);
        bean.getJpaPropertyMap().put("hibernate.cache.use_query_cache", true);
        bean.getJpaPropertyMap().put("javax.persistence.sharedCache.mode", SharedCacheMode.ALL);
        bean.getJpaPropertyMap().put("hibernate.cache.default_cache_concurrency_strategy", "read-write");
        bean.getJpaPropertyMap().put("javax.persistence.validation.factory", validator);
        bean.getJpaPropertyMap().put("hibernate.cache.region.factory_class", SingletonEhCacheRegionFactory.class.getCanonicalName());
        bean.setPersistenceProviderClass(org.hibernate.jpa.HibernatePersistenceProvider.class);
        bean.setPackagesToScan("br.com.model");
        return bean;
    }

    @Bean
    public JpaTransactionManager transactionManager() {
        JpaTransactionManager bean = new JpaTransactionManager(entityManagerFactory());
        bean.getJpaPropertyMap().put("org.hibernate.flushMode", FlushMode.AUTO);
        bean.setDataSource(dataSource);
        bean.setPersistenceUnitName("PostgreSQL");
        return bean;
    }

    @Bean
    public DataSource dataSource() {
        HikariConfig config = new HikariConfig();
        config.setDriverClassName(driverClass);
        config.setJdbcUrl(jdbcUrl);
        config.setUsername(username);
        config.setPassword(password);
        config.setMaximumPoolSize(50);
        config.setConnectionTestQuery("select 1");

        HikariDataSource bean = new HikariDataSource(config);
        return new LazyConnectionDataSourceProxy(bean);
    }

    @Bean
    public ManagedProcessEngineFactoryBean processEngine() {
        ManagedProcessEngineFactoryBean processEngineFactoryBean = new ManagedProcessEngineFactoryBean();
        processEngineFactoryBean.setProcessEngineConfiguration(processEngineConfiguration());
        return processEngineFactoryBean;
    }

    @Bean
    public SpringProcessEngineConfiguration processEngineConfiguration() {
        SpringProcessEngineConfiguration processEngineConfiguration = new SpringProcessEngineConfiguration();
        processEngineConfiguration.setDataSource(dataSource());
        processEngineConfiguration.setTransactionManager(transactionManager());
        processEngineConfiguration.setJobExecutorActivate(true);
        processEngineConfiguration.setDatabaseSchemaUpdate(ProcessEngineConfigurationImpl.DB_SCHEMA_UPDATE_TRUE);
        return processEngineConfiguration;
    }

    @Bean
    public TaskService taskService() throws Exception {
        return processEngine().getObject().getTaskService();
    }
}

dataSource 和 transactionManager 与 Spring 和 Hibernate 使用的相同。

@Service
public class TaskManager {
    @Inject
    private TaskService taskService;

    @Transactional
    public void completeTask(String taskId, final Map<String, Object> variables) {

        org.camunda.bpm.engine.task.Task camundaTask = taskService.createTaskQuery().taskId(taskId).singleResult();
        taskService.complete(camundaTask.getId(), variables);

        // Hibernate Operations

        throw new RuntimeException("Exception test");
    }
}

执行上述代码时,会发生回滚,并且“休眠操作”会回滚,但在 taskService.complete 中执行的操作不会。

我已经调试了 Camunda 代码,一切正常,我找到了一个 SpringTransactionInterceptor,命令在 TransactionTemplate.execute() 内执行,此时事务处于活动状态。

【问题讨论】:

    标签: java spring transactions camunda


    【解决方案1】:

    在研究了事务、Jpa和Spring之后,我发现问题是没有配置jpaDialect,它负责同步JDBC和JTA事务。

    方言对象可用于检索底层 JDBC 连接,因此允许将 JPA 事务公开为 JDBC 交易。

    我在配置中加入了以下代码,现在它可以工作了:

    @Configuration
    public class CamundaConfiguration {
        ....
    
        @Bean
        public JpaDialect jpaDialect() {
            return new org.springframework.orm.jpa.vendor.HibernateJpaDialect();
        }
    
        public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
            LocalContainerEntityManagerFactoryBean bean = new LocalContainerEntityManagerFactoryBean();
            bean.setJpaDialect(jpaDialect());
            bean.setJpaVendorAdapter(new org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter());
            ...
            return bean;
        }
    
        @Bean
        public JpaTransactionManager transactionManager() {
            JpaTransactionManager bean = new JpaTransactionManager(entityManagerFactory());
            bean.setJpaDialect(jpaDialect());
            ...
            return bean;
        }
    
        ...
    }
    

    【讨论】:

    • 共享引擎中需要@Bean注解?
    • 同样的问题,但您的修复并不能解决问题。
    • 您能否提供有关您的配置的更多信息?
    猜你喜欢
    • 2014-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-06
    相关资源
    最近更新 更多