6

Tôi đang cố định cấu hình các giao dịch XA/phân tán cho một ứng dụng nhiệm vụ đám mây mùa xuân/mùa xuân được cấu hình với khởi động mùa xuân.SimpleTaskConfiguration của Spring Cloud và cấu hình SimpleBatchConfiguration của Spring Spring ngăn cấu hình tự động khởi động mùa xuân của các giao dịch XA

Tôi đã thêm các phụ thuộc sau đây hy vọng sẽ dựa vào khởi động mùa xuân cấu hình tự động:

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

Tuy nhiên hai loại sau đây gây ra hai nhà quản lý giao dịch để được cấu hình:

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

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

Xem sau thông điệp:

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] 

và sau đó vì một PlatformTransactionManager tên transactionManager được cấu hình, atomikos tự động cấu hình của tôi không nhặt:

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) 

Ai đó có thể hãy giúp tôi ngăn chặn việc ép buộc quá mức của các hạt transactionManager do hai lớp ở trên gây ra?

+0

bạn có thể cung cấp một ví dụ Runnable (build.gradle và một lớp ứng dụng) nhằm tái tạo vấn đề của bạn? Bởi vì, giống như câu hỏi trước của bạn, mà không có tất cả những gì chúng ta có thể làm là ném các dự đoán và giả định của chúng tôi vào bạn và sau đó cuối cùng không làm gì cả. –

+0

Tôi đang cố gắng tổng hợp một ứng dụng mẫu để tái tạo điều này. Chịu với tôi. – balteo

+0

Thật tuyệt, cảm ơn, điều đó sẽ giúp bạn dễ dàng khắc phục sự cố –

Trả lời

1

Sau khi xem ví dụ của bạn, những gì tôi có thể cho bạn biết là - không có cách nào để thực hiện công việc tự động cấu hình - ngay cả khi bạn tắt cấu hình tự động cho quản lý giao dịch mà bạn đã thử, nhiệm vụ và hàng loạt tự động cấu hình (được kích hoạt bởi @EnableBatchProcessing@EnableTask) sẽ vẫn đăng ký người quản lý giao dịch của riêng mình và do đó ngừng kích hoạt Cấu hình Atomikos. Lý do là vì @EnableBatchProcessing bao gồm BatchConfigurationSelector lớp cấu hình, bao gồm cả SimpleBatchConfiguration hoặc ModularBatchConfiguration và cả hai người trong số họ sẽ luôn đăng ký người quản lý giao dịch - không có chú thích có điều kiện trên một trong các định nghĩa bean. @EnableTask thực hiện điều tương tự, chỉ với SimpleTaskConfiguration.

Vì vậy, cách duy nhất trong số này mà tôi có thể thấy là để bạn có thể tạo hàng loạt và cấu hình tác vụ hoàn toàn theo cách thủ công.

Để biết cách định cấu hình theo lô và tác vụ theo cách thủ công, tôi khuyên bạn nên xem SimpleTaskConfigurationAbstractBatchConfiguration - bạn có thể thấy tất cả các hạt mà bạn cần đăng ký.

Hoặc, bạn có thể xem ví dụ lô on this Java Code Geeks page, bạn chỉ cần dịch cấu hình XML sang cấu hình Java.

+0

Đây có phải là cách duy nhất không? Nếu đúng như vậy, bạn có thể cung cấp hướng dẫn hoặc chỉ dẫn cho tài liệu về cách tạo cấu hình hàng loạt và tác vụ không? – balteo

+0

Vâng, tôi đã thêm các liên kết vào câu trả lời của mình; về cơ bản, chỉ cần tham khảo các lớp SimpleTaskConfiguration và AbstractBatchConfiguration để xem những bean nào bạn sẽ cần để xác định thủ công. –

2

Tôi đã gặp vấn đề tương tự và giải pháp của tôi là triển khai BatchConfigurer (giữ @EnableBatchProcessing) và thêm hạt nhân atomikos theo cách thủ công.

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(); 
    } 
Các vấn đề liên quan