spring-boot - 在Spring Boot/Spring Batch应用程序上配置Atomikos的问题

标签 spring-boot spring-batch distributed-transactions atomikos spring-cloud-task

我试图让Atomikos与我的Spring Boot / Spring Batch应用程序一起使用。

这是我的代码的相关部分:

数据源配置:

@Configuration
public class DatasourceConfiguration extends AbstractCloudConfig {

    @Bean
    @Qualifier("batch_database")
    public DataSource batchDatasource() {
        return connectionFactory().dataSource("batch_database");
    }

    @Bean
    public PlatformTransactionManager transactionManager(){
        return  new JtaTransactionManager();
    }

    @Bean
    public TaskConfigurer configurer(){
        return new DefaultTaskConfigurer(batchDatasource());
    }
}


Atomikos自动配置依赖项:

compile("org.springframework.boot:spring-boot-starter-jta-atomikos")


我的application.properties

spring.datasource.application.driver-class-name=org.postgresql.xa.PGXADataSource
spring.datasource.batch.driver-class-name=org.postgresql.xa.PGXADataSource


这是自动配置报告:

   DataSourceTransactionManagerAutoConfiguration matched
      - @ConditionalOnClass classes found: org.springframework.jdbc.core.JdbcTemplate,org.springframework.transaction.PlatformTransactionManager (OnClassCondition)

   DataSourceTransactionManagerAutoConfiguration.DataSourceTransactionManagerConfiguration matched
      - @ConditionalOnBean (types: javax.sql.DataSource; SearchStrategy: all) found the following [batchDatasource, applicationDatasource, batch_database, application_database, database] (OnBeanCondition)

   AtomikosJtaConfiguration did not match
      - @ConditionalOnClass classes found: org.springframework.transaction.jta.JtaTransactionManager,com.atomikos.icatch.jta.UserTransactionManager (OnClassCondition)
      - @ConditionalOnMissingBean (types: org.springframework.transaction.PlatformTransactionManager; SearchStrategy: all) found the following [transactionManager] (OnBeanCondition)

   AtomikosJtaConfiguration.AtomikosJtaJmsConfiguration did not match
      - required @ConditionalOnClass classes not found: javax.jms.Message (OnClassCondition)
      - Ancestor 'org.springframework.boot.autoconfigure.transaction.jta.AtomikosJtaConfiguration' did not match (ConditionEvaluationReport.AncestorsMatchedCondition)


我不确定为什么未自动配置Atomikos ...谁能帮忙吗?

编辑:我已经注释掉了JTA transactionManager bean,现在我得到以下自动配置报告:

   DataSourceTransactionManagerAutoConfiguration matched
      - @ConditionalOnClass classes found: org.springframework.jdbc.core.JdbcTemplate,org.springframework.transaction.PlatformTransactionManager (OnClassCondition)

    DataSourceTransactionManagerAutoConfiguration.DataSourceTransactionManagerConfiguration matched
          - @ConditionalOnBean (types: javax.sql.DataSource; SearchStrategy: all) found the following [batchDatasource, applicationDatasource, batch_database, application_database, database] (OnBeanCondition)

   TransactionAutoConfiguration matched
      - @ConditionalOnClass classes found: org.springframework.transaction.support.TransactionTemplate,org.springframework.transaction.PlatformTransactionManager (OnClassCondition)
      - @ConditionalOnSingleCandidate (types: org.springframework.transaction.PlatformTransactionManager; SearchStrategy: all) found a primary candidate amongst the following [transactionManager] (OnBeanCondition)

   AtomikosJtaConfiguration did not match
      - @ConditionalOnClass classes found: org.springframework.transaction.jta.JtaTransactionManager,com.atomikos.icatch.jta.UserTransactionManager (OnClassCondition)
      - @ConditionalOnMissingBean (types: org.springframework.transaction.PlatformTransactionManager; SearchStrategy: all) found the following [transactionManager] (OnBeanCondition)

   AtomikosJtaConfiguration.AtomikosJtaJmsConfiguration did not match
      - required @ConditionalOnClass classes not found: javax.jms.Message (OnClassCondition)
      - Ancestor 'org.springframework.boot.autoconfigure.transaction.jta.AtomikosJtaConfiguration' did not match (ConditionEvaluationReport.AncestorsMatchedCondition)


如何确定Atomikos交易管理器已被提起?

编辑2:我排除了TransactionManager类,如下所示:

@EnableAutoConfiguration(exclude = {DataSourceTransactionManagerAutoConfiguration.class, TransactionAutoConfiguration.class})


但是我似乎SimpleBatchConfigurationSimpleTaskConfiguration仍然对我强制使用几个TransactionManager类之一:

2016-07-12 11:27:57.846  INFO 4851 --- [           main] o.s.b.f.s.DefaultListableBeanFactory     : Overriding bean definition for bean 'transactionManager' with a different definition: replacing [Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=org.springframework.batch.core.configuration.annotation.SimpleBatchConfiguration; factoryMethodName=transactionManager; initMethodName=null; destroyMethodName=(inferred); defined in class path resource [org/springframework/batch/core/configuration/annotation/SimpleBatchConfiguration.class]] with [Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=org.springframework.cloud.task.configuration.SimpleTaskConfiguration; factoryMethodName=transactionManager; initMethodName=null; destroyMethodName=(inferred); defined in org.springframework.cloud.task.configuration.SimpleTaskConfiguration]


导致AtomikosJtaConfiguration不匹配...

有人可以建议一种最佳做法,以使Atomikos自动配置正常工作吗?

最佳答案

您不需要添加Atomikos或Bitronix即可为数据源指定PlatformTransactionManager。请参见Entities not persisting. Are RepositoryItemWriter & SimpleJpaWriter thread-safe?

关于spring-boot - 在Spring Boot/Spring Batch应用程序上配置Atomikos的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38323207/

相关文章:

grails - 为什么我不必在配置中声明监听器?

java - CORBA 的 Spring 批处理机制

spring-boot - 如何在两个微服务之间进行两阶段提交( Spring 启动)?

apache-kafka - 在数据库和 Kafka 生产者之间同步事务

java - Spring Boot 与 @PostConstruct 的集成测试取决于 @Before 部分

java - 使用 .map() 编写 for 循环

java - 在服务方法上使用@Transactional,更新多个存储库

java - 12 因素应用程序 - 依赖泄漏

java - 我应该为我的新 Spring Batch 作业使用 Spring Data flow 服务器吗?

sql-server-2005 - 如何配置链接服务器之间的身份验证?