6

스프링 부트로 구성된 스프링 배치/스프링 클라우드 태스크 애플리케이션에 대해 XA/분산 트랜잭션을 구성하려고합니다. 다음 두 클래스는 두 개의 트랜잭션 관리자를 일으킬 그러나스프링 클라우드 태스크의 SimpleTaskConfiguration 및 스프링 배치의 SimpleBatchConfiguration으로 인해 XA 트랜잭션의 스프링 부트 자동 구성 방지

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

구성 할 :

  • org.springframework.cloud.task.configuration.SimpleTaskConfiguration

  • 나는 봄 부팅 자동 구성에 의존하는 희망 다음 종속성을 추가 한

  • org.springframework.batch.core.configuration.annotation.SimpleBatchConfiguration

메시지 다음을 참조하십시오

2016-07-18 21:46:19.952 INFO 18995 --- [   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] 

및 다음 때문에 PlatformTransactionManagertransactionManager가 구성되어있는 이름, 내 atomikos 자동 구성은 포착되지 않습니다

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) 

누군가가 나를 도와 주시겠습니까 위의 두 클래스에 의해 초래 된 transactionManager 빈의 강제 실행을 방지 하시겠습니까?

+0

당신이 당신의 문제를 재현 실행 가능한 예 (build.gradle 및 응용 프로그램 클래스)을 제공 할 수 있습니까? 왜냐하면 이전 질문과 마찬가지로, 우리가 할 수있는 모든 것은 우리가 추측 한 것과 추측을 던져 결국에는 아무 것도하지 않기 때문입니다. –

+0

이걸 재현하는 샘플 앱을 만들려고합니다. 나를 참아주십시오. – balteo

+0

쿨, 고마워요. –

답변

1

예제를 살펴보면 트랜잭션 관리를 위해 자동 구성을 사용하지 않더라도 작업을 자동으로 구성 할 수있는 방법이 없습니다. (@EnableBatchProcessing@EnableTask에 의해 트리거되는) 구성은 여전히 ​​자신의 트랜잭션 관리자를 등록하므로 Atomikos 구성이 트리거되지 않습니다. 그 이유는 SimpleBatchConfiguration 또는 ModularBatchConfiguration을 포함하는 BatchConfigurationSelector 구성 클래스를 포함하는 @EnableBatchProcessing이며 둘 다 항상 트랜잭션 관리자를 등록하기 때문에 하나의 Bean 정의에 조건부 주석이 없습니다. @EnableTaskSimpleTaskConfiguration과 매우 유사합니다.

그래서 내가 볼 수있는 유일한 방법은 배치와 작업 구성을 완전히 수동으로 생성하는 것입니다.

일괄 처리 및 작업을 수동으로 구성하는 방법은 SimpleTaskConfigurationAbstractBatchConfiguration을 권장합니다. 등록해야 할 모든 콩을 볼 수 있습니다.

또는 on this Java Code Geeks page 배치 예제를 볼 수 있습니다. XML 구성을 Java 구성으로 변환해야합니다.

+0

이것은 정말로 유일한 방법입니까? 이 경우 일괄 처리 및 작업 구성을 만드는 방법에 대한 지침이나 지침을 제공 할 수 있습니까? – balteo

+0

그래, 나는 내 대답에 대한 링크를 추가했다. 기본적으로 SimpleTaskConfiguration 및 AbstractBatchConfiguration 클래스를 참조하여 수동으로 정의해야하는 bean을 확인하십시오. –

2

동일한 문제가있어서 솔루션은 BatchConfigurer (@EnableBatchProcessing 유지)를 구현하고 atomikos beans를 수동으로 추가하는 것이 었습니다.

JobConfig :

@Configuration 
@EnableBatchProcessing 
public class JobConfig implements BatchConfigurer { 

    @Autowired 
    private DataSource dataSource; 

    @Autowired 
    private JtaTransactionManager jtaTransactionManager; 

    // ... skipping some code 

    @Override 
    public JobRepository getJobRepository() throws Exception { 
     JobRepositoryFactoryBean factory = new JobRepositoryFactoryBean(); 
     factory.setDataSource(dataSource); 
     factory.setTransactionManager(jtaTransactionManager); 
     return factory.getObject(); 
    } 

    @Override 
    public PlatformTransactionManager getTransactionManager() throws Exception { 
     return jtaTransactionManager; 
    } 

    @Override 
    public JobLauncher getJobLauncher() throws Exception { 
     SimpleJobLauncher launcher = new SimpleJobLauncher(); 
     launcher.setJobRepository(getJobRepository()); 
     launcher.setTaskExecutor(new SimpleAsyncTaskExecutor()); 
     return launcher; 
    } 

    @Override 
    public JobExplorer getJobExplorer() throws Exception { 
     JobExplorerFactoryBean jobExplorerFactoryBean = new JobExplorerFactoryBean(); 
     jobExplorerFactoryBean.setDataSource(dataSource); 
     jobExplorerFactoryBean.afterPropertiesSet(); 
     return jobExplorerFactoryBean.getObject(); 
    } 

AtomikosConfig :

@Configuration 
public class AtomikosConfig extends AbstractJtaPlatform { 

    @Bean(initMethod = "init", destroyMethod = "close") 
    @DependsOn("atomikosUserTransactionService") 
    public UserTransactionManager atomikosTransactionManager() { 
      UserTransactionManager manager = new UserTransactionManager(); 
      manager.setForceShutdown(false); 
      manager.setStartupTransactionService(false); 
      return manager; 
    } 

    @Bean(initMethod = "init", destroyMethod = "shutdownForce") 
    public UserTransactionServiceImp atomikosUserTransactionService() { 
      Properties properties = new Properties(); 
      return new UserTransactionServiceImp(properties); 
    } 

    @Bean 
    public UserTransactionImp atomikosUserTransaction() throws SystemException { 
      UserTransactionImp transaction = new UserTransactionImp(); 
      transaction.setTransactionTimeout(300); 
      return transaction; 
    } 

    @Primary 
    @Bean 
    public JtaTransactionManager jtaTransactionManager() throws Exception { 
      JtaTransactionManager manager = new JtaTransactionManager(); 
      manager.setTransactionManager(atomikosTransactionManager()); 
      manager.setUserTransaction(atomikosUserTransaction()); 
      manager.setAllowCustomIsolationLevels(true); 
      return manager; 
    } 

    @Bean 
    public ActiveMQXAConnectionFactory xaFactory() { 
      ActiveMQXAConnectionFactory factory = new ActiveMQXAConnectionFactory(); 
      factory.setBrokerURL("tcp://localhost:61616"); 
      factory.setUserName("admin"); 
      factory.setPassword("admin"); 
      //factory.setTrustAllPackages(true); 
      factory.setTransactedIndividualAck(true); 
      return factory; 
    } 

    @Bean(initMethod = "init", destroyMethod = "close") 
    public AtomikosConnectionFactoryBean connectionFactory() { 
      AtomikosConnectionFactoryBean factoryBean = new AtomikosConnectionFactoryBean(); 
      factoryBean.setUniqueResourceName("amq1"); 
      factoryBean.setXaConnectionFactory(xaFactory()); 
      factoryBean.setMaxPoolSize(10); 
      return factoryBean; 
    } 

    @Bean 
    public AtomikosJtaPlatform springJtaPlatformAdapter() throws Exception { 
      AtomikosJtaPlatform platform = new AtomikosJtaPlatform(); 
      platform.setJtaTransactionManager(jtaTransactionManager()); 
      platform.setTransactionManager(atomikosTransactionManager()); 
      platform.setUserTransaction(atomikosUserTransaction()); 
      return platform; 
    } 

    @Override 
    protected TransactionManager locateTransactionManager() { 
      return atomikosTransactionManager(); 
    } 

    @Override 
    protected UserTransaction locateUserTransaction() { 
      return atomikosTransactionManager(); 
    } 
관련 문제