2016-05-27 12 views
0

私はCamunda 7.3、Spring 4.2.4、およびHibernate 4.3.8を使用していますが、私はCamunda Documentationで説明したのと同じトランザクションでそれらを使用しようとしています。トランザクションは、Hibernate操作では正常に動作しますが、Camunda操作では正常に機能しません。トランザクションのロールバックが発生した場合は、休止状態の操作だけが元に戻ります。Camunda Spring Transaction Integrationが動作しない

@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で同じものが使用されます。

ロールバック上記のコードが発生する実行および「休止操作を」ロールバックが、taskService.completeに実行される動作ではないれる
@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"); 
    } 
} 

私はすでにCamundaコードをデバッグしましたが、すべてが正常であると思われ、SpringTransactionInterceptorが見つかり、コマンドがTransactionTemplate.execute()内で実行され、この時点でトランザクションがアクティブになっています。

答えて

1

JpaとSpringについてのトランザクションを調べたところ、jpaDialectが設定されていないことがわかったので、JDBCとJTAトランザクションを同期する責任があります。

方言オブジェクトは、基礎となるJDBC 接続を取得するために使用され、従ってJDBC 取引としてJPAトランザクションを露出させることを可能することができます。

私は、コンフィギュレーションに次のコードを含め、今では働いている:

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

    ... 
} 
関連する問題