6

Próbuję skonfigurować transakcje XA/rozproszone dla aplikacji zadania batch/spring wiosny skonfigurowane z rozruchu sprężyny.Konfiguracja zadania SimpleTaskConfiguration i wiosna SimpleBatchConfiguration zapobieganie rozruchu automatyczna konfiguracja transakcji XA

Dodałem następującą zależność nadzieję polegać na bagażnika sprężyna konfiguracji Auto:

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

jednak dwa następujące zajęcia powodują dwóch menedżerów transakcji zostać skonfigurowane:

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

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

Zobacz następujący komunikat:

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] 

a następnie ponieważ PlatformTransactionManager nazwie transactionManager jest skonfigurowany, mój atomikos automatyczna konfiguracja nie podniósł:

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) 

Czy ktoś mógłby mi pomóc zapobiec nadmiernemu obciążeniu fasoli spowodowanej przez dwie powyższe klasy?

+0

można podać przykład (build.gradle runnable i klasę aplikacji), który odtwarza swój problem? Ponieważ, podobnie jak w poprzednim pytaniu, bez tego możemy jedynie rzucić okiem na domysły i przypuszczenia, a potem ostatecznie nic nie robić. –

+0

Próbuję złożyć przykładową aplikację, która to powieli. Niedźwiedź ze mną. – balteo

+0

Fajnie, dziękuję, to powinno ułatwić rozwiązywanie problemów –

Odpowiedz

1

Po obejrzeniu przykładu, mogę powiedzieć, że nie ma możliwości wykonania automatycznej konfiguracji - nawet jeśli wyłączysz automatyczną konfigurację do zarządzania transakcjami, którą wypróbowałeś, zadanie i automatyczne konfiguracje (wywołane przez @EnableBatchProcessing i @EnableTask) nadal będą rejestrować własne menedżery transakcji, a tym samym uniemożliwić uruchomienie konfiguracji Atomikos. Powodem tego jest fakt, że @EnableBatchProcessing zawiera klasę konfiguracyjną BatchConfigurationSelector, która z kolei obejmuje SimpleBatchConfiguration lub ModularBatchConfiguration i oba z nich zawsze rejestrują menedżera transakcji - nie ma adnotacji warunkowych na żadnej z definicji komponentów bean. @EnableTask robi bardzo podobną rzecz, tylko z SimpleTaskConfiguration.

Jedynym wyjściem z tego, co widzę, jest to, że możesz tworzyć konfiguracje zadań i zadań całkowicie ręcznie.

Jeśli chodzi o ręczną konfigurację partii i zadań, polecam przejrzeć SimpleTaskConfiguration i AbstractBatchConfiguration - możesz tam zobaczyć wszystkie ziarna, które musisz zarejestrować.

Alternatywnie można zobaczyć przykład wsadowy on this Java Code Geeks page, należy po prostu przetłumaczyć konfigurację XML na konfigurację Java.

+0

Czy to naprawdę jedyny sposób? Jeśli tak, czy możesz dostarczyć instrukcje lub wskazówki do dokumentacji, jak tworzyć konfiguracje zadań i zadań? – balteo

+0

Tak, dodałem linki do mojej odpowiedzi; w zasadzie, po prostu odwołaj się do klas SimpleTaskConfiguration i AbstractBatchConfiguration, aby zobaczyć, jakie fasole musisz zdefiniować ręcznie. –

2

Miałem ten sam problem, a moim rozwiązaniem było wdrożenie BatchConfigurer (utrzymywanie @EnableBatchProcessing) i ręczne dodanie fasoli atomikos.

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(); 
    }