Polish contribution
This commit is contained in:
parent
a2adc5a130
commit
48800f1818
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright 2012-2015 the original author or authors.
|
||||
* Copyright 2012-2016 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
@ -22,7 +22,6 @@ import javax.transaction.UserTransaction;
|
|||
|
||||
import com.arjuna.ats.jbossatx.jta.RecoveryManagerService;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
|
||||
import org.springframework.boot.jta.XAConnectionFactoryWrapper;
|
||||
|
@ -42,15 +41,20 @@ import org.springframework.transaction.jta.JtaTransactionManager;
|
|||
/**
|
||||
* JTA Configuration for <a href="http://narayana.io/">Narayana</a>.
|
||||
*
|
||||
* @author <a href="mailto:gytis@redhat.com">Gytis Trikleris</a>
|
||||
* @author Gytis Trikleris
|
||||
* @since 1.4.0
|
||||
*/
|
||||
@Configuration
|
||||
@ConditionalOnClass({ JtaTransactionManager.class, com.arjuna.ats.jta.UserTransaction.class })
|
||||
@ConditionalOnClass({ JtaTransactionManager.class,
|
||||
com.arjuna.ats.jta.UserTransaction.class })
|
||||
@ConditionalOnMissingBean(PlatformTransactionManager.class)
|
||||
public class NarayanaJtaConfiguration {
|
||||
|
||||
@Autowired
|
||||
private JtaProperties jtaProperties;
|
||||
private final JtaProperties jtaProperties;
|
||||
|
||||
public NarayanaJtaConfiguration(JtaProperties jtaProperties) {
|
||||
this.jtaProperties = jtaProperties;
|
||||
}
|
||||
|
||||
@Bean
|
||||
@ConditionalOnMissingBean
|
||||
|
@ -60,53 +64,57 @@ public class NarayanaJtaConfiguration {
|
|||
|
||||
@Bean
|
||||
@ConditionalOnMissingBean
|
||||
public NarayanaConfigurationBean narayanaConfigurationBean(NarayanaProperties narayanaProperties) {
|
||||
public NarayanaConfigurationBean narayanaConfiguration(
|
||||
NarayanaProperties properties) {
|
||||
if (this.jtaProperties.getLogDir() != null) {
|
||||
narayanaProperties.setLogDir(this.jtaProperties.getLogDir());
|
||||
properties.setLogDir(this.jtaProperties.getLogDir());
|
||||
}
|
||||
|
||||
if (this.jtaProperties.getTransactionManagerId() != null) {
|
||||
narayanaProperties.setTransactionManagerId(this.jtaProperties.getTransactionManagerId());
|
||||
properties.setTransactionManagerId(
|
||||
this.jtaProperties.getTransactionManagerId());
|
||||
}
|
||||
|
||||
return new NarayanaConfigurationBean(narayanaProperties);
|
||||
return new NarayanaConfigurationBean(properties);
|
||||
}
|
||||
|
||||
@Bean
|
||||
@DependsOn("narayanaConfigurationBean")
|
||||
@DependsOn("narayanaConfiguration")
|
||||
@ConditionalOnMissingBean
|
||||
public UserTransaction narayanaUserTransaction() {
|
||||
return com.arjuna.ats.jta.UserTransaction.userTransaction();
|
||||
}
|
||||
|
||||
@Bean
|
||||
@DependsOn("narayanaConfigurationBean")
|
||||
@DependsOn("narayanaConfiguration")
|
||||
@ConditionalOnMissingBean
|
||||
public TransactionManager narayanaTransactionManager() {
|
||||
return com.arjuna.ats.jta.TransactionManager.transactionManager();
|
||||
}
|
||||
|
||||
@Bean
|
||||
@DependsOn("narayanaConfigurationBean")
|
||||
@DependsOn("narayanaConfiguration")
|
||||
public RecoveryManagerService narayanaRecoveryManagerService() {
|
||||
return new RecoveryManagerService();
|
||||
}
|
||||
|
||||
@Bean
|
||||
public NarayanaRecoveryManagerBean narayanaRecoveryManagerBean(RecoveryManagerService recoveryManagerService) {
|
||||
public NarayanaRecoveryManagerBean narayanaRecoveryManager(
|
||||
RecoveryManagerService recoveryManagerService) {
|
||||
return new NarayanaRecoveryManagerBean(recoveryManagerService);
|
||||
}
|
||||
|
||||
@Bean
|
||||
public JtaTransactionManager transactionManager(UserTransaction userTransaction, TransactionManager transactionManager) {
|
||||
public JtaTransactionManager transactionManager(UserTransaction userTransaction,
|
||||
TransactionManager transactionManager) {
|
||||
return new JtaTransactionManager(userTransaction, transactionManager);
|
||||
}
|
||||
|
||||
@Bean
|
||||
@ConditionalOnMissingBean(XADataSourceWrapper.class)
|
||||
public XADataSourceWrapper xaDataSourceWrapper(NarayanaRecoveryManagerBean narayanaRecoveryManagerBean,
|
||||
public XADataSourceWrapper xaDataSourceWrapper(
|
||||
NarayanaRecoveryManagerBean narayanaRecoveryManagerBean,
|
||||
NarayanaProperties narayanaProperties) {
|
||||
return new NarayanaXADataSourceWrapper(narayanaRecoveryManagerBean, narayanaProperties);
|
||||
return new NarayanaXADataSourceWrapper(narayanaRecoveryManagerBean,
|
||||
narayanaProperties);
|
||||
}
|
||||
|
||||
@Bean
|
||||
|
@ -121,9 +129,12 @@ public class NarayanaJtaConfiguration {
|
|||
|
||||
@Bean
|
||||
@ConditionalOnMissingBean(XAConnectionFactoryWrapper.class)
|
||||
public NarayanaXAConnectionFactoryWrapper xaConnectionFactoryWrapper(TransactionManager transactionManager,
|
||||
NarayanaRecoveryManagerBean narayanaRecoveryManagerBean, NarayanaProperties narayanaProperties) {
|
||||
return new NarayanaXAConnectionFactoryWrapper(transactionManager, narayanaRecoveryManagerBean, narayanaProperties);
|
||||
public NarayanaXAConnectionFactoryWrapper xaConnectionFactoryWrapper(
|
||||
TransactionManager transactionManager,
|
||||
NarayanaRecoveryManagerBean narayanaRecoveryManagerBean,
|
||||
NarayanaProperties narayanaProperties) {
|
||||
return new NarayanaXAConnectionFactoryWrapper(transactionManager,
|
||||
narayanaRecoveryManagerBean, narayanaProperties);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -100,6 +100,7 @@
|
|||
<jaxen.version>1.1.6</jaxen.version>
|
||||
<jaybird.version>2.2.10</jaybird.version>
|
||||
<jboss-logging.version>3.3.0.Final</jboss-logging.version>
|
||||
<jboss-transaction-spi.version>7.3.0.Final</jboss-transaction-spi.version>
|
||||
<jdom2.version>2.0.6</jdom2.version>
|
||||
<jedis.version>2.8.1</jedis.version>
|
||||
<jersey.version>2.22.2</jersey.version>
|
||||
|
@ -124,6 +125,7 @@
|
|||
<mockito.version>1.10.19</mockito.version>
|
||||
<mongodb.version>2.14.2</mongodb.version>
|
||||
<mysql.version>5.1.38</mysql.version>
|
||||
<narayana.version>5.3.2.Final</narayana.version>
|
||||
<nekohtml.version>1.9.22</nekohtml.version>
|
||||
<neo4j-ogm.version>2.0.0</neo4j-ogm.version>
|
||||
<postgresql.version>9.4.1208.jre7</postgresql.version>
|
||||
|
@ -174,8 +176,6 @@
|
|||
<webjars-hal-browser.version>9f96c74</webjars-hal-browser.version>
|
||||
<webjars-locator.version>0.30</webjars-locator.version>
|
||||
<wsdl4j.version>1.6.3</wsdl4j.version>
|
||||
<narayana.version>5.3.2.Final</narayana.version>
|
||||
<jboss-transaction-spi.version>7.3.0.Final</jboss-transaction-spi.version>
|
||||
</properties>
|
||||
<prerequisites>
|
||||
<maven>3.2.1</maven>
|
||||
|
@ -401,11 +401,6 @@
|
|||
<artifactId>spring-boot-starter-jta-bitronix</artifactId>
|
||||
<version>1.4.0.BUILD-SNAPSHOT</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-jta-narayana</artifactId>
|
||||
<version>1.4.0.BUILD-SNAPSHOT</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-undertow</artifactId>
|
||||
|
@ -436,6 +431,11 @@
|
|||
<artifactId>spring-boot-starter-mustache</artifactId>
|
||||
<version>1.4.0.BUILD-SNAPSHOT</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-jta-narayana</artifactId>
|
||||
<version>1.4.0.BUILD-SNAPSHOT</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-remote-shell</artifactId>
|
||||
|
@ -1740,11 +1740,36 @@
|
|||
<artifactId>javassist</artifactId>
|
||||
<version>${javassist.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.jboss</groupId>
|
||||
<artifactId>jboss-transaction-spi</artifactId>
|
||||
<version>${jboss-transaction-spi.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.jboss.logging</groupId>
|
||||
<artifactId>jboss-logging</artifactId>
|
||||
<version>${jboss-logging.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.jboss.narayana.jta</groupId>
|
||||
<artifactId>jdbc</artifactId>
|
||||
<version>${narayana.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.jboss.narayana.jta</groupId>
|
||||
<artifactId>jms</artifactId>
|
||||
<version>${narayana.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.jboss.narayana.jta</groupId>
|
||||
<artifactId>jta</artifactId>
|
||||
<version>${narayana.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.jboss.narayana.jts</groupId>
|
||||
<artifactId>narayana-jts-integration</artifactId>
|
||||
<version>${narayana.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.jdom</groupId>
|
||||
<artifactId>jdom2</artifactId>
|
||||
|
@ -2219,31 +2244,6 @@
|
|||
<artifactId>wsdl4j</artifactId>
|
||||
<version>${wsdl4j.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.jboss.narayana.jta</groupId>
|
||||
<artifactId>jta</artifactId>
|
||||
<version>${narayana.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.jboss.narayana.jta</groupId>
|
||||
<artifactId>jdbc</artifactId>
|
||||
<version>${narayana.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.jboss.narayana.jta</groupId>
|
||||
<artifactId>jms</artifactId>
|
||||
<version>${narayana.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.jboss.narayana.jts</groupId>
|
||||
<artifactId>narayana-jts-integration</artifactId>
|
||||
<version>${narayana.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.jboss</groupId>
|
||||
<artifactId>jboss-transaction-spi</artifactId>
|
||||
<version>${jboss-transaction-spi.version}</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</dependencyManagement>
|
||||
<build>
|
||||
|
|
|
@ -716,17 +716,17 @@ content into your application; rather pick only the properties that you need.
|
|||
spring.jta.bitronix.properties.warn-about-zero-resource-transaction=true # Log a warning for transactions executed without a single enlisted resource.
|
||||
|
||||
# NARAYANA
|
||||
spring.jta.narayana.one-phase-commit=true # Enable or disable one phase commit optimisation
|
||||
spring.jta.narayana.default-timeout=60 # Set default transaction timeout in seconds
|
||||
spring.jta.narayana.expiry-scanners=com.arjuna.ats.internal.arjuna.recovery.ExpiredTransactionStatusManagerScanner # List of ExpiryScanner implementations
|
||||
spring.jta.narayana.one-phase-commit=true # Enable or disable one phase commit optimisation
|
||||
spring.jta.narayana.periodic-recovery-period=120 # Set interval in which periodic recovery scans are performed in seconds
|
||||
spring.jta.narayana.recovery-backoff-period=10 # Set back off period between first and second phases of the recovery scan in seconds
|
||||
spring.jta.narayana.xa-resource-orphan-filters=com.arjuna.ats.internal.jta.recovery.arjunacore.JTATransactionLogXAResourceOrphanFilter,com.arjuna.ats.internal.jta.recovery.arjunacore.JTANodeNameXAResourceOrphanFilter # List of XAResourceOrphanFilter implementations
|
||||
spring.jta.narayana.recovery-modules=com.arjuna.ats.internal.arjuna.recovery.AtomicActionRecoveryModule,com.arjuna.ats.internal.jta.recovery.arjunacore.XARecoveryModule # List of RecoveryModule implementations
|
||||
spring.jta.narayana.expiry-scanners=com.arjuna.ats.internal.arjuna.recovery.ExpiredTransactionStatusManagerScanner # List of ExpiryScanner implementations
|
||||
spring.jta.narayana.recovery-db-user= # Database username to be used by recovery manager
|
||||
spring.jta.narayana.recovery-db-pass= # Database password to be used by recovery manager
|
||||
spring.jta.narayana.recovery-jms-user= # JMS username to be used by recovery manager
|
||||
spring.jta.narayana.recovery-jms-pass= # JMS password to be used by recovery manager
|
||||
spring.jta.narayana.recovery-modules=com.arjuna.ats.internal.arjuna.recovery.AtomicActionRecoveryModule,com.arjuna.ats.internal.jta.recovery.arjunacore.XARecoveryModule # List of RecoveryModule implementations
|
||||
spring.jta.narayana.xa-resource-orphan-filters=com.arjuna.ats.internal.jta.recovery.arjunacore.JTATransactionLogXAResourceOrphanFilter,com.arjuna.ats.internal.jta.recovery.arjunacore.JTANodeNameXAResourceOrphanFilter # List of XAResourceOrphanFilter implementations
|
||||
|
||||
# EMBEDDED MONGODB ({sc-spring-boot-autoconfigure}/mongo/embedded/EmbeddedMongoProperties.{sc-ext}[EmbeddedMongoProperties])
|
||||
spring.mongodb.embedded.features=SYNC_DELAY # Comma-separated list of features to enable.
|
||||
|
|
|
@ -1,57 +1,56 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<parent>
|
||||
<artifactId>spring-boot-samples</artifactId>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<version>1.4.0.BUILD-SNAPSHOT</version>
|
||||
</parent>
|
||||
<artifactId>spring-boot-sample-jta-narayana</artifactId>
|
||||
<name>Spring Boot Narayana JTA Sample</name>
|
||||
<description>Spring Boot Narayana JTA Sample</description>
|
||||
<url>http://projects.spring.io/spring-boot/</url>
|
||||
<properties>
|
||||
<main.basedir>${basedir}/../..</main.basedir>
|
||||
</properties>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.springframework</groupId>
|
||||
<artifactId>spring-jms</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-data-jpa</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-jta-narayana</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-hornetq</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.hornetq</groupId>
|
||||
<artifactId>hornetq-jms-server</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.h2database</groupId>
|
||||
<artifactId>h2</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-test</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-maven-plugin</artifactId>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</project>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<parent>
|
||||
<artifactId>spring-boot-samples</artifactId>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<version>1.4.0.BUILD-SNAPSHOT</version>
|
||||
</parent>
|
||||
<artifactId>spring-boot-sample-jta-narayana</artifactId>
|
||||
<name>Spring Boot Narayana JTA Sample</name>
|
||||
<description>Spring Boot Narayana JTA Sample</description>
|
||||
<url>http://projects.spring.io/spring-boot/</url>
|
||||
<properties>
|
||||
<main.basedir>${basedir}/../..</main.basedir>
|
||||
</properties>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.springframework</groupId>
|
||||
<artifactId>spring-jms</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-data-jpa</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-jta-narayana</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-hornetq</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.hornetq</groupId>
|
||||
<artifactId>hornetq-jms-server</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.h2database</groupId>
|
||||
<artifactId>h2</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-test</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-maven-plugin</artifactId>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</project>
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright 2012-2014 the original author or authors.
|
||||
* Copyright 2012-2016 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright 2012-2014 the original author or authors.
|
||||
* Copyright 2012-2016 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright 2012-2014 the original author or authors.
|
||||
* Copyright 2012-2016 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright 2012-2014 the original author or authors.
|
||||
* Copyright 2012-2016 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright 2012-2014 the original author or authors.
|
||||
* Copyright 2012-2016 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
@ -26,7 +26,8 @@ import org.springframework.context.ApplicationContext;
|
|||
public class SampleNarayanaApplication {
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
ApplicationContext context = SpringApplication.run(SampleNarayanaApplication.class, args);
|
||||
ApplicationContext context = SpringApplication
|
||||
.run(SampleNarayanaApplication.class, args);
|
||||
AccountService service = context.getBean(AccountService.class);
|
||||
AccountRepository repository = context.getBean(AccountRepository.class);
|
||||
service.createAccountAndNotify("josh");
|
||||
|
@ -34,7 +35,8 @@ public class SampleNarayanaApplication {
|
|||
try {
|
||||
// Using username "error" will cause service to throw SampleRuntimeException
|
||||
service.createAccountAndNotify("error");
|
||||
} catch (SampleRuntimeException ex) {
|
||||
}
|
||||
catch (SampleRuntimeException ex) {
|
||||
// Log message to let test case know that exception was thrown
|
||||
System.out.println(ex.getMessage());
|
||||
}
|
||||
|
|
|
@ -1,8 +1,21 @@
|
|||
/*
|
||||
* Copyright 2012-2016 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package sample.narayana;
|
||||
|
||||
/**
|
||||
* @author <a href="mailto:gytis@redhat.com">Gytis Trikleris</a>
|
||||
*/
|
||||
public class SampleRuntimeException extends RuntimeException {
|
||||
|
||||
public SampleRuntimeException(String message) {
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright 2012-2014 the original author or authors.
|
||||
* Copyright 2012-2016 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
@ -16,16 +16,18 @@
|
|||
|
||||
package sample.narayana;
|
||||
|
||||
import org.hamcrest.Matcher;
|
||||
import org.hamcrest.core.SubstringMatcher;
|
||||
import org.assertj.core.api.Condition;
|
||||
import org.junit.Rule;
|
||||
import org.junit.Test;
|
||||
import org.springframework.boot.test.OutputCapture;
|
||||
|
||||
import static org.junit.Assert.assertThat;
|
||||
import org.springframework.boot.test.rule.OutputCapture;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
/**
|
||||
* @author <a href="mailto:gytis@redhat.com">Gytis Trikleris</a>
|
||||
* Basic integration tests for demo application.
|
||||
*
|
||||
* @author Gytis Trikleris
|
||||
*/
|
||||
public class SampleNarayanaApplicationTests {
|
||||
|
||||
|
@ -36,25 +38,22 @@ public class SampleNarayanaApplicationTests {
|
|||
public void testTransactionRollback() throws Exception {
|
||||
SampleNarayanaApplication.main(new String[] {});
|
||||
String output = this.outputCapture.toString();
|
||||
assertThat(output, containsString(1, "---->"));
|
||||
assertThat(output, containsString(1, "----> josh"));
|
||||
assertThat(output, containsString(2, "Count is 1"));
|
||||
assertThat(output, containsString(1, "Simulated error"));
|
||||
assertThat(output).has(substring(1, "---->"));
|
||||
assertThat(output).has(substring(1, "----> josh"));
|
||||
assertThat(output).has(substring(2, "Count is 1"));
|
||||
assertThat(output).has(substring(1, "Simulated error"));
|
||||
}
|
||||
|
||||
private Matcher<? super String> containsString(final int times, String s) {
|
||||
return new SubstringMatcher(s) {
|
||||
private Condition<String> substring(final int times, final String substring) {
|
||||
return new Condition<String>(
|
||||
"containing '" + substring + "' " + times + " times") {
|
||||
|
||||
@Override
|
||||
protected String relationship() {
|
||||
return "containing " + times + " times";
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean evalSubstringOf(String s) {
|
||||
public boolean matches(String value) {
|
||||
int i = 0;
|
||||
while (s.contains(this.substring)) {
|
||||
s = s.substring(s.indexOf(this.substring) + this.substring.length());
|
||||
while (value.contains(substring)) {
|
||||
int beginIndex = value.indexOf(substring) + substring.length();
|
||||
value = value.substring(beginIndex);
|
||||
i++;
|
||||
}
|
||||
return i == times;
|
||||
|
|
|
@ -1,48 +1,47 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<parent>
|
||||
<artifactId>spring-boot-starters</artifactId>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<version>1.4.0.BUILD-SNAPSHOT</version>
|
||||
</parent>
|
||||
<artifactId>spring-boot-starter-jta-narayana</artifactId>
|
||||
<name>Spring Boot Narayana JTA Starter</name>
|
||||
<description>Spring Boot Narayana JTA Starter</description>
|
||||
<url>http://projects.spring.io/spring-boot/</url>
|
||||
<properties>
|
||||
<main.basedir>${basedir}/../..</main.basedir>
|
||||
</properties>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.jboss.narayana.jta</groupId>
|
||||
<artifactId>jta</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.jboss.narayana.jta</groupId>
|
||||
<artifactId>jdbc</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.jboss.narayana.jta</groupId>
|
||||
<artifactId>jms</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.jboss.narayana.jts</groupId>
|
||||
<artifactId>narayana-jts-integration</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.jboss</groupId>
|
||||
<artifactId>jboss-transaction-spi</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>javax.transaction</groupId>
|
||||
<artifactId>javax.transaction-api</artifactId>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</project>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<parent>
|
||||
<artifactId>spring-boot-starters</artifactId>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<version>1.4.0.BUILD-SNAPSHOT</version>
|
||||
</parent>
|
||||
<artifactId>spring-boot-starter-jta-narayana</artifactId>
|
||||
<name>Spring Boot Narayana JTA Starter</name>
|
||||
<description>Spring Boot Narayana JTA Starter</description>
|
||||
<url>http://projects.spring.io/spring-boot/</url>
|
||||
<properties>
|
||||
<main.basedir>${basedir}/../..</main.basedir>
|
||||
</properties>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.jboss</groupId>
|
||||
<artifactId>jboss-transaction-spi</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.jboss.narayana.jta</groupId>
|
||||
<artifactId>jdbc</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.jboss.narayana.jta</groupId>
|
||||
<artifactId>jms</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.jboss.narayana.jta</groupId>
|
||||
<artifactId>jta</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.jboss.narayana.jts</groupId>
|
||||
<artifactId>narayana-jts-integration</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>javax.transaction</groupId>
|
||||
<artifactId>javax.transaction-api</artifactId>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</project>
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright 2012-2015 the original author or authors.
|
||||
* Copyright 2012-2016 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
@ -17,8 +17,6 @@
|
|||
package org.springframework.boot.jta.narayana;
|
||||
|
||||
import java.sql.SQLException;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
import javax.sql.XAConnection;
|
||||
import javax.sql.XADataSource;
|
||||
|
@ -27,34 +25,56 @@ import javax.transaction.xa.XAResource;
|
|||
import javax.transaction.xa.Xid;
|
||||
|
||||
import com.arjuna.ats.jta.recovery.XAResourceRecoveryHelper;
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
|
||||
import org.springframework.util.Assert;
|
||||
|
||||
/**
|
||||
* XAResourceRecoveryHelper implementation which gets Xids, which needs to be recovered, from the database.
|
||||
* XAResourceRecoveryHelper implementation which gets XIDs, which needs to be recovered,
|
||||
* from the database.
|
||||
*
|
||||
* @author <a href="mailto:gytis@redhat.com">Gytis Trikleris</a>
|
||||
* @author Gytis Trikleris
|
||||
* @since 1.4.0
|
||||
*/
|
||||
public class DataSourceXAResourceRecoveryHelper implements XAResourceRecoveryHelper, XAResource {
|
||||
public class DataSourceXAResourceRecoveryHelper
|
||||
implements XAResourceRecoveryHelper, XAResource {
|
||||
|
||||
private static final Logger LOGGER = Logger.getLogger(DataSourceXAResourceRecoveryHelper.class.getName());
|
||||
private static final XAResource[] NO_XA_RESOURCES = {};
|
||||
|
||||
private static final Log logger = LogFactory
|
||||
.getLog(DataSourceXAResourceRecoveryHelper.class);
|
||||
|
||||
private final XADataSource xaDataSource;
|
||||
|
||||
private final String user;
|
||||
|
||||
private final String pass;
|
||||
private final String password;
|
||||
|
||||
private XAConnection xaConnection;
|
||||
|
||||
private XAResource delegate;
|
||||
|
||||
/**
|
||||
* Create a new {@link DataSourceXAResourceRecoveryHelper} instance.
|
||||
* @param xaDataSource the XA data source
|
||||
*/
|
||||
public DataSourceXAResourceRecoveryHelper(XADataSource xaDataSource) {
|
||||
this(xaDataSource, null, null);
|
||||
}
|
||||
|
||||
public DataSourceXAResourceRecoveryHelper(XADataSource xaDataSource, String user, String pass) {
|
||||
/**
|
||||
* Create a new {@link DataSourceXAResourceRecoveryHelper} instance.
|
||||
* @param xaDataSource the XA data source
|
||||
* @param user the database user or {@code null}
|
||||
* @param password the database password or {@code null}
|
||||
*/
|
||||
public DataSourceXAResourceRecoveryHelper(XADataSource xaDataSource, String user,
|
||||
String password) {
|
||||
Assert.notNull(xaDataSource, "XADataSource must not be null");
|
||||
this.xaDataSource = xaDataSource;
|
||||
this.user = user;
|
||||
this.pass = pass;
|
||||
this.password = password;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -67,90 +87,48 @@ public class DataSourceXAResourceRecoveryHelper implements XAResourceRecoveryHel
|
|||
if (connect()) {
|
||||
return new XAResource[] { this };
|
||||
}
|
||||
|
||||
return new XAResource[0];
|
||||
}
|
||||
|
||||
@Override
|
||||
public Xid[] recover(int i) throws XAException {
|
||||
try {
|
||||
return this.delegate.recover(i);
|
||||
}
|
||||
finally {
|
||||
if (i == XAResource.TMENDRSCAN) {
|
||||
disconnect();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void start(Xid xid, int i) throws XAException {
|
||||
this.delegate.start(xid, i);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void end(Xid xid, int i) throws XAException {
|
||||
this.delegate.end(xid, i);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int prepare(Xid xid) throws XAException {
|
||||
return this.delegate.prepare(xid);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void commit(Xid xid, boolean b) throws XAException {
|
||||
this.delegate.commit(xid, b);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void rollback(Xid xid) throws XAException {
|
||||
this.delegate.rollback(xid);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isSameRM(XAResource xaResource) throws XAException {
|
||||
return this.delegate.isSameRM(xaResource);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void forget(Xid xid) throws XAException {
|
||||
this.delegate.forget(xid);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getTransactionTimeout() throws XAException {
|
||||
return this.delegate.getTransactionTimeout();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean setTransactionTimeout(int i) throws XAException {
|
||||
return this.delegate.setTransactionTimeout(i);
|
||||
return NO_XA_RESOURCES;
|
||||
}
|
||||
|
||||
private boolean connect() {
|
||||
if (this.delegate != null) {
|
||||
return true;
|
||||
if (this.delegate == null) {
|
||||
try {
|
||||
this.xaConnection = getXaConnection();
|
||||
this.delegate = this.xaConnection.getXAResource();
|
||||
}
|
||||
catch (SQLException ex) {
|
||||
logger.warn("Failed to create connection", ex);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
this.xaConnection = getXaConnection();
|
||||
this.delegate = this.xaConnection.getXAResource();
|
||||
}
|
||||
catch (SQLException e) {
|
||||
LOGGER.log(Level.WARNING, "Failed to create connection", e);
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
private XAConnection getXaConnection() throws SQLException {
|
||||
if (this.user == null && this.password == null) {
|
||||
return this.xaDataSource.getXAConnection();
|
||||
}
|
||||
return this.xaDataSource.getXAConnection(this.user, this.password);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Xid[] recover(int flag) throws XAException {
|
||||
try {
|
||||
return getDelegate(true).recover(flag);
|
||||
}
|
||||
finally {
|
||||
if (flag == XAResource.TMENDRSCAN) {
|
||||
disconnect();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void disconnect() throws XAException {
|
||||
try {
|
||||
this.xaConnection.close();
|
||||
}
|
||||
catch (SQLException e) {
|
||||
LOGGER.log(Level.WARNING, "Failed to close connection", e);
|
||||
logger.warn("Failed to close connection", e);
|
||||
}
|
||||
finally {
|
||||
this.xaConnection = null;
|
||||
|
@ -158,12 +136,55 @@ public class DataSourceXAResourceRecoveryHelper implements XAResourceRecoveryHel
|
|||
}
|
||||
}
|
||||
|
||||
private XAConnection getXaConnection() throws SQLException {
|
||||
if (this.user == null && this.pass == null) {
|
||||
return this.xaDataSource.getXAConnection();
|
||||
}
|
||||
@Override
|
||||
public void start(Xid xid, int flags) throws XAException {
|
||||
getDelegate(true).start(xid, flags);
|
||||
}
|
||||
|
||||
return this.xaDataSource.getXAConnection(this.user, this.pass);
|
||||
@Override
|
||||
public void end(Xid xid, int flags) throws XAException {
|
||||
getDelegate(true).end(xid, flags);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int prepare(Xid xid) throws XAException {
|
||||
return getDelegate(true).prepare(xid);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void commit(Xid xid, boolean onePhase) throws XAException {
|
||||
getDelegate(true).commit(xid, onePhase);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void rollback(Xid xid) throws XAException {
|
||||
getDelegate(true).rollback(xid);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isSameRM(XAResource xaResource) throws XAException {
|
||||
return getDelegate(true).isSameRM(xaResource);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void forget(Xid xid) throws XAException {
|
||||
getDelegate(true).forget(xid);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getTransactionTimeout() throws XAException {
|
||||
return getDelegate(true).getTransactionTimeout();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean setTransactionTimeout(int seconds) throws XAException {
|
||||
return getDelegate(true).setTransactionTimeout(seconds);
|
||||
}
|
||||
|
||||
private XAResource getDelegate(boolean required) {
|
||||
Assert.state(this.delegate != null || !required,
|
||||
"Connection has not been opened");
|
||||
return this.delegate;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright 2012-2015 the original author or authors.
|
||||
* Copyright 2012-2016 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
@ -26,44 +26,54 @@ import org.springframework.core.Ordered;
|
|||
/**
|
||||
* {@link BeanFactoryPostProcessor} to automatically setup correct beans ordering.
|
||||
*
|
||||
* @author <a href="mailto:gytis@redhat.com">Gytis Trikleris</a>
|
||||
* @author Gytis Trikleris
|
||||
* @since 1.4.0
|
||||
*/
|
||||
public class NarayanaBeanFactoryPostProcessor implements BeanFactoryPostProcessor, Ordered {
|
||||
public class NarayanaBeanFactoryPostProcessor
|
||||
implements BeanFactoryPostProcessor, Ordered {
|
||||
|
||||
private static final String[] NO_BEANS = {};
|
||||
|
||||
private static final int ORDER = Ordered.LOWEST_PRECEDENCE;
|
||||
|
||||
@Override
|
||||
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
|
||||
String[] transactionManagers = beanFactory.getBeanNamesForType(TransactionManager.class, true, false);
|
||||
String[] recoveryManagers = beanFactory.getBeanNamesForType(NarayanaRecoveryManagerBean.class, true, false);
|
||||
|
||||
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)
|
||||
throws BeansException {
|
||||
String[] transactionManagers = beanFactory
|
||||
.getBeanNamesForType(TransactionManager.class, true, false);
|
||||
String[] recoveryManagers = beanFactory
|
||||
.getBeanNamesForType(NarayanaRecoveryManagerBean.class, true, false);
|
||||
addBeanDependencies(beanFactory, transactionManagers, "javax.sql.DataSource");
|
||||
addBeanDependencies(beanFactory, recoveryManagers, "javax.sql.DataSource");
|
||||
addBeanDependencies(beanFactory, transactionManagers, "javax.jms.ConnectionFactory");
|
||||
addBeanDependencies(beanFactory, transactionManagers,
|
||||
"javax.jms.ConnectionFactory");
|
||||
addBeanDependencies(beanFactory, recoveryManagers, "javax.jms.ConnectionFactory");
|
||||
}
|
||||
|
||||
private void addBeanDependencies(ConfigurableListableBeanFactory beanFactory, String[] beanNames, String dependencyType) {
|
||||
private void addBeanDependencies(ConfigurableListableBeanFactory beanFactory,
|
||||
String[] beanNames, String dependencyType) {
|
||||
for (String beanName : beanNames) {
|
||||
addBeanDependencies(beanFactory, beanName, dependencyType);
|
||||
}
|
||||
}
|
||||
|
||||
private void addBeanDependencies(ConfigurableListableBeanFactory beanFactory, String beanName, String dependencyType) {
|
||||
for (String dependentBeanName : getBeanNamesForType(beanFactory, dependencyType)) {
|
||||
private void addBeanDependencies(ConfigurableListableBeanFactory beanFactory,
|
||||
String beanName, String dependencyType) {
|
||||
for (String dependentBeanName : getBeanNamesForType(beanFactory,
|
||||
dependencyType)) {
|
||||
beanFactory.registerDependentBean(beanName, dependentBeanName);
|
||||
}
|
||||
}
|
||||
|
||||
private String[] getBeanNamesForType(ConfigurableListableBeanFactory beanFactory, String type) {
|
||||
private String[] getBeanNamesForType(ConfigurableListableBeanFactory beanFactory,
|
||||
String type) {
|
||||
try {
|
||||
return beanFactory.getBeanNamesForType(Class.forName(type), true, false);
|
||||
}
|
||||
catch (ClassNotFoundException ex) {
|
||||
// Ignore
|
||||
} catch (NoClassDefFoundError ex) {
|
||||
}
|
||||
catch (NoClassDefFoundError ex) {
|
||||
// Ignore
|
||||
}
|
||||
return NO_BEANS;
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright 2012-2015 the original author or authors.
|
||||
* Copyright 2012-2016 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
@ -31,16 +31,17 @@ import org.springframework.beans.factory.InitializingBean;
|
|||
/**
|
||||
* Bean that configures Narayana transaction manager.
|
||||
*
|
||||
* @author <a href="mailto:gytis@redhat.com">Gytis Trikleris</a>
|
||||
* @author Gytis Trikleris
|
||||
* @since 1.4.0
|
||||
*/
|
||||
public class NarayanaConfigurationBean implements InitializingBean {
|
||||
|
||||
private static final String JBOSSTS_PROPERTIES_FILE_NAME = "jbossts-properties.xml";
|
||||
|
||||
private final NarayanaProperties narayanaProperties;
|
||||
private final NarayanaProperties properties;
|
||||
|
||||
public NarayanaConfigurationBean(NarayanaProperties narayanaProperties) {
|
||||
this.narayanaProperties = narayanaProperties;
|
||||
this.properties = narayanaProperties;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -48,59 +49,75 @@ public class NarayanaConfigurationBean implements InitializingBean {
|
|||
if (isPropertiesFileAvailable()) {
|
||||
return;
|
||||
}
|
||||
|
||||
setNodeIdentifier(this.narayanaProperties.getTransactionManagerId());
|
||||
setObjectStoreDir(this.narayanaProperties.getLogDir());
|
||||
setCommitOnePhase(this.narayanaProperties.isOnePhaseCommit());
|
||||
setDefaultTimeout(this.narayanaProperties.getDefaultTimeout());
|
||||
setPeriodicRecoveryPeriod(this.narayanaProperties.getPeriodicRecoveryPeriod());
|
||||
setRecoveryBackoffPeriod(this.narayanaProperties.getRecoveryBackoffPeriod());
|
||||
setXaResourceOrphanFilters(this.narayanaProperties.getXaResourceOrphanFilters());
|
||||
setRecoveryModules(this.narayanaProperties.getRecoveryModules());
|
||||
setExpiryScanners(this.narayanaProperties.getExpiryScanners());
|
||||
setNodeIdentifier(this.properties.getTransactionManagerId());
|
||||
setObjectStoreDir(this.properties.getLogDir());
|
||||
setCommitOnePhase(this.properties.isOnePhaseCommit());
|
||||
setDefaultTimeout(this.properties.getDefaultTimeout());
|
||||
setPeriodicRecoveryPeriod(this.properties.getPeriodicRecoveryPeriod());
|
||||
setRecoveryBackoffPeriod(this.properties.getRecoveryBackoffPeriod());
|
||||
setXaResourceOrphanFilters(this.properties.getXaResourceOrphanFilters());
|
||||
setRecoveryModules(this.properties.getRecoveryModules());
|
||||
setExpiryScanners(this.properties.getExpiryScanners());
|
||||
}
|
||||
|
||||
private boolean isPropertiesFileAvailable() {
|
||||
return Thread.currentThread().getContextClassLoader().getResource(JBOSSTS_PROPERTIES_FILE_NAME) != null;
|
||||
return Thread.currentThread().getContextClassLoader()
|
||||
.getResource(JBOSSTS_PROPERTIES_FILE_NAME) != null;
|
||||
}
|
||||
|
||||
private void setNodeIdentifier(String nodeIdentifier) throws CoreEnvironmentBeanException {
|
||||
BeanPopulator.getDefaultInstance(CoreEnvironmentBean.class).setNodeIdentifier(nodeIdentifier);
|
||||
private void setNodeIdentifier(String nodeIdentifier)
|
||||
throws CoreEnvironmentBeanException {
|
||||
getPopulator(CoreEnvironmentBean.class).setNodeIdentifier(nodeIdentifier);
|
||||
}
|
||||
|
||||
private void setObjectStoreDir(String objectStoreDir) {
|
||||
BeanPopulator.getDefaultInstance(ObjectStoreEnvironmentBean.class).setObjectStoreDir(objectStoreDir);
|
||||
BeanPopulator.getNamedInstance(ObjectStoreEnvironmentBean.class, "communicationStore")
|
||||
getPopulator(ObjectStoreEnvironmentBean.class).setObjectStoreDir(objectStoreDir);
|
||||
getPopulator(ObjectStoreEnvironmentBean.class, "communicationStore")
|
||||
.setObjectStoreDir(objectStoreDir);
|
||||
getPopulator(ObjectStoreEnvironmentBean.class, "stateStore")
|
||||
.setObjectStoreDir(objectStoreDir);
|
||||
BeanPopulator.getNamedInstance(ObjectStoreEnvironmentBean.class, "stateStore").setObjectStoreDir(objectStoreDir);
|
||||
}
|
||||
|
||||
private void setCommitOnePhase(boolean isCommitOnePhase) {
|
||||
BeanPopulator.getDefaultInstance(CoordinatorEnvironmentBean.class).setCommitOnePhase(isCommitOnePhase);
|
||||
getPopulator(CoordinatorEnvironmentBean.class)
|
||||
.setCommitOnePhase(isCommitOnePhase);
|
||||
}
|
||||
|
||||
private void setDefaultTimeout(int defaultTimeout) {
|
||||
BeanPopulator.getDefaultInstance(CoordinatorEnvironmentBean.class).setDefaultTimeout(defaultTimeout);
|
||||
getPopulator(CoordinatorEnvironmentBean.class).setDefaultTimeout(defaultTimeout);
|
||||
}
|
||||
|
||||
private void setPeriodicRecoveryPeriod(int periodicRecoveryPeriod) {
|
||||
BeanPopulator.getDefaultInstance(RecoveryEnvironmentBean.class).setPeriodicRecoveryPeriod(periodicRecoveryPeriod);
|
||||
getPopulator(RecoveryEnvironmentBean.class)
|
||||
.setPeriodicRecoveryPeriod(periodicRecoveryPeriod);
|
||||
}
|
||||
|
||||
private void setRecoveryBackoffPeriod(int recoveryBackoffPeriod) {
|
||||
BeanPopulator.getDefaultInstance(RecoveryEnvironmentBean.class).setRecoveryBackoffPeriod(recoveryBackoffPeriod);
|
||||
getPopulator(RecoveryEnvironmentBean.class)
|
||||
.setRecoveryBackoffPeriod(recoveryBackoffPeriod);
|
||||
}
|
||||
|
||||
private void setXaResourceOrphanFilters(List<String> xaResourceOrphanFilters) {
|
||||
BeanPopulator.getDefaultInstance(JTAEnvironmentBean.class).setXaResourceOrphanFilterClassNames(xaResourceOrphanFilters);
|
||||
getPopulator(JTAEnvironmentBean.class)
|
||||
.setXaResourceOrphanFilterClassNames(xaResourceOrphanFilters);
|
||||
}
|
||||
|
||||
private void setRecoveryModules(List<String> recoveryModules) {
|
||||
BeanPopulator.getDefaultInstance(RecoveryEnvironmentBean.class).setRecoveryModuleClassNames(recoveryModules);
|
||||
getPopulator(RecoveryEnvironmentBean.class)
|
||||
.setRecoveryModuleClassNames(recoveryModules);
|
||||
}
|
||||
|
||||
private void setExpiryScanners(List<String> expiryScanners) {
|
||||
BeanPopulator.getDefaultInstance(RecoveryEnvironmentBean.class).setExpiryScannerClassNames(expiryScanners);
|
||||
getPopulator(RecoveryEnvironmentBean.class)
|
||||
.setExpiryScannerClassNames(expiryScanners);
|
||||
}
|
||||
|
||||
private <T> T getPopulator(Class<T> beanClass) {
|
||||
return BeanPopulator.getDefaultInstance(beanClass);
|
||||
}
|
||||
|
||||
private <T> T getPopulator(Class<T> beanClass, String name) {
|
||||
return BeanPopulator.getNamedInstance(beanClass, name);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright 2012-2015 the original author or authors.
|
||||
* Copyright 2012-2016 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
@ -29,16 +29,26 @@ import javax.sql.XADataSource;
|
|||
import com.arjuna.ats.internal.jdbc.ConnectionManager;
|
||||
import com.arjuna.ats.jdbc.TransactionalDriver;
|
||||
|
||||
import org.springframework.util.Assert;
|
||||
import org.springframework.util.ClassUtils;
|
||||
|
||||
/**
|
||||
* {@link DataSource} implementation wrapping {@link XADataSource} and using {@link ConnectionManager} to acquire connections.
|
||||
* {@link DataSource} implementation wrapping {@link XADataSource} and using
|
||||
* {@link ConnectionManager} to acquire connections.
|
||||
*
|
||||
* @author <a href="mailto:gytis@redhat.com">Gytis Trikleris</a>
|
||||
* @author Gytis Trikleris
|
||||
* @since 1.4.0
|
||||
*/
|
||||
public class NarayanaDataSourceBean implements DataSource {
|
||||
|
||||
private final XADataSource xaDataSource;
|
||||
|
||||
/**
|
||||
* Create a new {@link NarayanaDataSourceBean} instance.
|
||||
* @param xaDataSource the XA DataSource
|
||||
*/
|
||||
public NarayanaDataSourceBean(XADataSource xaDataSource) {
|
||||
Assert.notNull(xaDataSource, "XADataSource must not be null");
|
||||
this.xaDataSource = xaDataSource;
|
||||
}
|
||||
|
||||
|
@ -46,17 +56,16 @@ public class NarayanaDataSourceBean implements DataSource {
|
|||
public Connection getConnection() throws SQLException {
|
||||
Properties properties = new Properties();
|
||||
properties.put(TransactionalDriver.XADataSource, this.xaDataSource);
|
||||
|
||||
return ConnectionManager.create(null, properties);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Connection getConnection(String username, String password) throws SQLException {
|
||||
public Connection getConnection(String username, String password)
|
||||
throws SQLException {
|
||||
Properties properties = new Properties();
|
||||
properties.put(TransactionalDriver.XADataSource, this.xaDataSource);
|
||||
properties.put(TransactionalDriver.userName, username);
|
||||
properties.put(TransactionalDriver.password, password);
|
||||
|
||||
return ConnectionManager.create(null, properties);
|
||||
}
|
||||
|
||||
|
@ -91,20 +100,15 @@ public class NarayanaDataSourceBean implements DataSource {
|
|||
if (isWrapperFor(iface)) {
|
||||
return (T) this;
|
||||
}
|
||||
else if (isWrapperFor(iface, this.xaDataSource.getClass())) {
|
||||
if (ClassUtils.isAssignableValue(iface, this.xaDataSource)) {
|
||||
return (T) this.xaDataSource;
|
||||
}
|
||||
|
||||
throw new SQLException(getClass() + " is not a wrapper for " + iface);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isWrapperFor(Class<?> iface) throws SQLException {
|
||||
return isWrapperFor(iface, getClass());
|
||||
}
|
||||
|
||||
private boolean isWrapperFor(Class<?> iface, Class<?> wrapperIface) {
|
||||
return iface.isAssignableFrom(wrapperIface);
|
||||
return iface.isAssignableFrom(getClass());
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright 2012-2015 the original author or authors.
|
||||
* Copyright 2012-2016 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
@ -22,10 +22,11 @@ import java.util.List;
|
|||
import org.springframework.boot.context.properties.ConfigurationProperties;
|
||||
|
||||
/**
|
||||
* Subset of Narayana properties which can be configured via Spring configuration. Use jbossts-properties.xml for complete
|
||||
* configuration.
|
||||
* Subset of Narayana properties which can be configured via Spring configuration. Use
|
||||
* jbossts-properties.xml for complete configuration.
|
||||
*
|
||||
* @author <a href="mailto:gytis@redhat.com">Gytis Trikleris</a>
|
||||
* @author Gytis Trikleris
|
||||
* @since 1.4.0
|
||||
*/
|
||||
@ConfigurationProperties(prefix = NarayanaProperties.PROPERTIES_PREFIX)
|
||||
public class NarayanaProperties {
|
||||
|
@ -56,12 +57,14 @@ public class NarayanaProperties {
|
|||
private int defaultTimeout = 60;
|
||||
|
||||
/**
|
||||
* Interval in which periodic recovery scans are performed in seconds. Default: <code>120</code>
|
||||
* Interval in which periodic recovery scans are performed in seconds. Default:
|
||||
* <code>120</code>
|
||||
*/
|
||||
private int periodicRecoveryPeriod = 120;
|
||||
|
||||
/**
|
||||
* Back off period between first and second phases of the recovery scan in seconds. Default: <code>10</code>
|
||||
* Back off period between first and second phases of the recovery scan in seconds.
|
||||
* Default: <code>10</code>
|
||||
*/
|
||||
private int recoveryBackoffPeriod = 10;
|
||||
|
||||
|
@ -88,8 +91,11 @@ public class NarayanaProperties {
|
|||
/**
|
||||
* List of orphan filters. Default:
|
||||
* <ul>
|
||||
* <li>com.arjuna.ats.internal.jta.recovery.arjunacore.JTATransactionLogXAResourceOrphanFilter</li>
|
||||
* <li>com.arjuna.ats.internal.jta.recovery.arjunacore.JTANodeNameXAResourceOrphanFilter</li>
|
||||
* <li>com.arjuna.ats.internal.jta.recovery.arjunacore.
|
||||
* JTATransactionLogXAResourceOrphanFilter</li>
|
||||
* <li>
|
||||
* com.arjuna.ats.internal.jta.recovery.arjunacore.JTANodeNameXAResourceOrphanFilter
|
||||
* </li>
|
||||
* </ul>
|
||||
*/
|
||||
private List<String> xaResourceOrphanFilters = Arrays.asList(
|
||||
|
@ -103,17 +109,19 @@ public class NarayanaProperties {
|
|||
* <li>com.arjuna.ats.internal.jta.recovery.arjunacore.XARecoveryModule</li>
|
||||
* </ul>
|
||||
*/
|
||||
private List<String> recoveryModules = Arrays.asList("com.arjuna.ats.internal.arjuna.recovery.AtomicActionRecoveryModule",
|
||||
private List<String> recoveryModules = Arrays.asList(
|
||||
"com.arjuna.ats.internal.arjuna.recovery.AtomicActionRecoveryModule",
|
||||
"com.arjuna.ats.internal.jta.recovery.arjunacore.XARecoveryModule");
|
||||
|
||||
/**
|
||||
* List of expiry scanners. Default:
|
||||
* <ul>
|
||||
* <li>com.arjuna.ats.internal.arjuna.recovery.ExpiredTransactionStatusManagerScanner</li>
|
||||
* <li>com.arjuna.ats.internal.arjuna.recovery.ExpiredTransactionStatusManagerScanner
|
||||
* </li>
|
||||
* </ul>
|
||||
*/
|
||||
private List<String> expiryScanners = Arrays
|
||||
.asList("com.arjuna.ats.internal.arjuna.recovery.ExpiredTransactionStatusManagerScanner");
|
||||
private List<String> expiryScanners = Arrays.asList(
|
||||
"com.arjuna.ats.internal.arjuna.recovery.ExpiredTransactionStatusManagerScanner");
|
||||
|
||||
public String getLogDir() {
|
||||
return this.logDir;
|
||||
|
@ -218,4 +226,5 @@ public class NarayanaProperties {
|
|||
public void setRecoveryJmsPass(String recoveryJmsPass) {
|
||||
this.recoveryJmsPass = recoveryJmsPass;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright 2012-2015 the original author or authors.
|
||||
* Copyright 2012-2016 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
@ -24,17 +24,20 @@ import com.arjuna.ats.jta.recovery.XAResourceRecoveryHelper;
|
|||
|
||||
import org.springframework.beans.factory.DisposableBean;
|
||||
import org.springframework.beans.factory.InitializingBean;
|
||||
import org.springframework.util.Assert;
|
||||
|
||||
/**
|
||||
* Bean to set up Narayana recovery manager.
|
||||
*
|
||||
* @author <a href="mailto:gytis@redhat.com">Gytis Trikleris</a>
|
||||
* @author Gytis Trikleris
|
||||
* @since 1.4.0
|
||||
*/
|
||||
public class NarayanaRecoveryManagerBean implements InitializingBean, DisposableBean {
|
||||
|
||||
private final RecoveryManagerService recoveryManagerService;
|
||||
|
||||
public NarayanaRecoveryManagerBean(RecoveryManagerService recoveryManagerService) {
|
||||
Assert.notNull(recoveryManagerService, "RecoveryManagerService must not be null");
|
||||
this.recoveryManagerService = recoveryManagerService;
|
||||
}
|
||||
|
||||
|
@ -50,8 +53,10 @@ public class NarayanaRecoveryManagerBean implements InitializingBean, Disposable
|
|||
this.recoveryManagerService.destroy();
|
||||
}
|
||||
|
||||
void registerXAResourceRecoveryHelper(XAResourceRecoveryHelper xaResourceRecoveryHelper) {
|
||||
getXARecoveryModule(RecoveryManager.manager()).addXAResourceRecoveryHelper(xaResourceRecoveryHelper);
|
||||
void registerXAResourceRecoveryHelper(
|
||||
XAResourceRecoveryHelper xaResourceRecoveryHelper) {
|
||||
getXARecoveryModule(RecoveryManager.manager())
|
||||
.addXAResourceRecoveryHelper(xaResourceRecoveryHelper);
|
||||
}
|
||||
|
||||
private XARecoveryModule getXARecoveryModule(RecoveryManager recoveryManager) {
|
||||
|
@ -60,8 +65,8 @@ public class NarayanaRecoveryManagerBean implements InitializingBean, Disposable
|
|||
return (XARecoveryModule) recoveryModule;
|
||||
}
|
||||
}
|
||||
|
||||
throw new IllegalStateException("XARecoveryModule is not registered with recovery manager");
|
||||
throw new IllegalStateException(
|
||||
"XARecoveryModule is not registered with recovery manager");
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright 2012-2014 the original author or authors.
|
||||
* Copyright 2012-2016 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
@ -26,41 +26,57 @@ import org.jboss.narayana.jta.jms.JmsXAResourceRecoveryHelper;
|
|||
import org.jboss.narayana.jta.jms.TransactionHelperImpl;
|
||||
|
||||
import org.springframework.boot.jta.XAConnectionFactoryWrapper;
|
||||
import org.springframework.util.Assert;
|
||||
|
||||
/**
|
||||
* {@link XAConnectionFactoryWrapper} that uses {@link ConnectionFactoryProxy} to wrap an {@link XAConnectionFactory}.
|
||||
* {@link XAConnectionFactoryWrapper} that uses {@link ConnectionFactoryProxy} to wrap an
|
||||
* {@link XAConnectionFactory}.
|
||||
*
|
||||
* @author <a href="mailto:gytis@redhat.com">Gytis Trikleris</a>
|
||||
* @author Gytis Trikleris
|
||||
* @since 1.4.0
|
||||
*/
|
||||
public class NarayanaXAConnectionFactoryWrapper implements XAConnectionFactoryWrapper {
|
||||
|
||||
private final TransactionManager transactionManager;
|
||||
|
||||
private final NarayanaRecoveryManagerBean narayanaRecoveryManagerBean;
|
||||
private final NarayanaRecoveryManagerBean recoveryManager;
|
||||
|
||||
private final NarayanaProperties narayanaProperties;
|
||||
private final NarayanaProperties properties;
|
||||
|
||||
/**
|
||||
* Create a new {@link NarayanaXAConnectionFactoryWrapper} instance.
|
||||
* @param transactionManager the underlying transaction manager
|
||||
* @param recoveryManager the underlying recovery manager
|
||||
* @param properties the Narayana properties
|
||||
*/
|
||||
public NarayanaXAConnectionFactoryWrapper(TransactionManager transactionManager,
|
||||
NarayanaRecoveryManagerBean narayanaRecoveryManagerBean, NarayanaProperties narayanaProperties) {
|
||||
NarayanaRecoveryManagerBean recoveryManager, NarayanaProperties properties) {
|
||||
Assert.notNull(transactionManager, "TransactionManager must not be null");
|
||||
Assert.notNull(recoveryManager, "RecoveryManager must not be null");
|
||||
Assert.notNull(properties, "Properties must not be null");
|
||||
this.transactionManager = transactionManager;
|
||||
this.narayanaRecoveryManagerBean = narayanaRecoveryManagerBean;
|
||||
this.narayanaProperties = narayanaProperties;
|
||||
this.recoveryManager = recoveryManager;
|
||||
this.properties = properties;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ConnectionFactory wrapConnectionFactory(XAConnectionFactory xaConnectionFactory) {
|
||||
this.narayanaRecoveryManagerBean.registerXAResourceRecoveryHelper(getRecoveryHelper(xaConnectionFactory));
|
||||
|
||||
return new ConnectionFactoryProxy(xaConnectionFactory, new TransactionHelperImpl(this.transactionManager));
|
||||
public ConnectionFactory wrapConnectionFactory(
|
||||
XAConnectionFactory xaConnectionFactory) {
|
||||
XAResourceRecoveryHelper recoveryHelper = getRecoveryHelper(xaConnectionFactory);
|
||||
this.recoveryManager.registerXAResourceRecoveryHelper(recoveryHelper);
|
||||
return new ConnectionFactoryProxy(xaConnectionFactory,
|
||||
new TransactionHelperImpl(this.transactionManager));
|
||||
}
|
||||
|
||||
private XAResourceRecoveryHelper getRecoveryHelper(XAConnectionFactory xaConnectionFactory) {
|
||||
if (this.narayanaProperties.getRecoveryJmsUser() == null && this.narayanaProperties.getRecoveryJmsPass() == null) {
|
||||
private XAResourceRecoveryHelper getRecoveryHelper(
|
||||
XAConnectionFactory xaConnectionFactory) {
|
||||
if (this.properties.getRecoveryJmsUser() == null
|
||||
&& this.properties.getRecoveryJmsPass() == null) {
|
||||
return new JmsXAResourceRecoveryHelper(xaConnectionFactory);
|
||||
}
|
||||
|
||||
return new JmsXAResourceRecoveryHelper(xaConnectionFactory, this.narayanaProperties.getRecoveryJmsUser(),
|
||||
this.narayanaProperties.getRecoveryJmsPass());
|
||||
return new JmsXAResourceRecoveryHelper(xaConnectionFactory,
|
||||
this.properties.getRecoveryJmsUser(),
|
||||
this.properties.getRecoveryJmsPass());
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright 2012-2015 the original author or authors.
|
||||
* Copyright 2012-2016 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
@ -22,38 +22,48 @@ import javax.sql.XADataSource;
|
|||
import com.arjuna.ats.jta.recovery.XAResourceRecoveryHelper;
|
||||
|
||||
import org.springframework.boot.jta.XADataSourceWrapper;
|
||||
import org.springframework.util.Assert;
|
||||
|
||||
/**
|
||||
* {@link XADataSourceWrapper} that uses {@link NarayanaDataSourceBean} to wrap an {@link XADataSource}.
|
||||
* {@link XADataSourceWrapper} that uses {@link NarayanaDataSourceBean} to wrap an
|
||||
* {@link XADataSource}.
|
||||
*
|
||||
* @author <a href="mailto:gytis@redhat.com">Gytis Trikleris</a>
|
||||
* @author Gytis Trikleris
|
||||
* @since 1.4.0
|
||||
*/
|
||||
public class NarayanaXADataSourceWrapper implements XADataSourceWrapper {
|
||||
|
||||
private final NarayanaRecoveryManagerBean narayanaRecoveryManagerBean;
|
||||
private final NarayanaRecoveryManagerBean recoveryManager;
|
||||
|
||||
private final NarayanaProperties narayanaProperties;
|
||||
private final NarayanaProperties properties;
|
||||
|
||||
public NarayanaXADataSourceWrapper(NarayanaRecoveryManagerBean narayanaRecoveryManagerBean,
|
||||
NarayanaProperties narayanaProperties) {
|
||||
this.narayanaRecoveryManagerBean = narayanaRecoveryManagerBean;
|
||||
this.narayanaProperties = narayanaProperties;
|
||||
/**
|
||||
* Create a new {@link NarayanaXADataSourceWrapper} instance.
|
||||
* @param recoveryManager the underlying recovery manager
|
||||
* @param properties the Narayana properties
|
||||
*/
|
||||
public NarayanaXADataSourceWrapper(NarayanaRecoveryManagerBean recoveryManager,
|
||||
NarayanaProperties properties) {
|
||||
Assert.notNull(recoveryManager, "RecoveryManager must not be null");
|
||||
Assert.notNull(properties, "Properties must not be null");
|
||||
this.recoveryManager = recoveryManager;
|
||||
this.properties = properties;
|
||||
}
|
||||
|
||||
@Override
|
||||
public DataSource wrapDataSource(XADataSource dataSource) {
|
||||
this.narayanaRecoveryManagerBean.registerXAResourceRecoveryHelper(getRecoveryHelper(dataSource));
|
||||
|
||||
XAResourceRecoveryHelper recoveryHelper = getRecoveryHelper(dataSource);
|
||||
this.recoveryManager.registerXAResourceRecoveryHelper(recoveryHelper);
|
||||
return new NarayanaDataSourceBean(dataSource);
|
||||
}
|
||||
|
||||
private XAResourceRecoveryHelper getRecoveryHelper(XADataSource dataSource) {
|
||||
if (this.narayanaProperties.getRecoveryDbUser() == null && this.narayanaProperties.getRecoveryDbPass() == null) {
|
||||
if (this.properties.getRecoveryDbUser() == null
|
||||
&& this.properties.getRecoveryDbPass() == null) {
|
||||
return new DataSourceXAResourceRecoveryHelper(dataSource);
|
||||
}
|
||||
|
||||
return new DataSourceXAResourceRecoveryHelper(dataSource, this.narayanaProperties.getRecoveryDbUser(),
|
||||
this.narayanaProperties.getRecoveryDbPass());
|
||||
return new DataSourceXAResourceRecoveryHelper(dataSource,
|
||||
this.properties.getRecoveryDbUser(), this.properties.getRecoveryDbPass());
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright 2012-2014 the original author or authors.
|
||||
* Copyright 2012-2016 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
@ -27,14 +27,16 @@ import org.junit.Before;
|
|||
import org.junit.Test;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
import static org.mockito.BDDMockito.mock;
|
||||
import static org.mockito.BDDMockito.times;
|
||||
import static org.mockito.BDDMockito.verify;
|
||||
import static org.mockito.BDDMockito.when;
|
||||
import static org.mockito.BDDMockito.given;
|
||||
import static org.mockito.Matchers.anyString;
|
||||
import static org.mockito.Mockito.mock;
|
||||
import static org.mockito.Mockito.times;
|
||||
import static org.mockito.Mockito.verify;
|
||||
|
||||
/**
|
||||
* @author <a href="mailto:gytis@redhat.com">Gytis Trikleris</a>
|
||||
* Tests for {@link DataSourceXAResourceRecoveryHelper}.
|
||||
*
|
||||
* @author Gytis Trikleris
|
||||
*/
|
||||
public class DataSourceXAResourceRecoveryHelperTests {
|
||||
|
||||
|
@ -53,8 +55,8 @@ public class DataSourceXAResourceRecoveryHelperTests {
|
|||
this.xaResource = mock(XAResource.class);
|
||||
this.recoveryHelper = new DataSourceXAResourceRecoveryHelper(this.xaDataSource);
|
||||
|
||||
when(this.xaDataSource.getXAConnection()).thenReturn(this.xaConnection);
|
||||
when(this.xaConnection.getXAResource()).thenReturn(this.xaResource);
|
||||
given(this.xaDataSource.getXAConnection()).willReturn(this.xaConnection);
|
||||
given(this.xaConnection.getXAResource()).willReturn(this.xaResource);
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@ -67,10 +69,12 @@ public class DataSourceXAResourceRecoveryHelperTests {
|
|||
}
|
||||
|
||||
@Test
|
||||
public void shouldCreateConnectionWithCredentialsAndGetXAResource() throws SQLException {
|
||||
when(this.xaDataSource.getXAConnection(anyString(), anyString())).thenReturn(this.xaConnection);
|
||||
this.recoveryHelper = new DataSourceXAResourceRecoveryHelper(this.xaDataSource, "username", "password");
|
||||
|
||||
public void shouldCreateConnectionWithCredentialsAndGetXAResource()
|
||||
throws SQLException {
|
||||
given(this.xaDataSource.getXAConnection(anyString(), anyString()))
|
||||
.willReturn(this.xaConnection);
|
||||
this.recoveryHelper = new DataSourceXAResourceRecoveryHelper(this.xaDataSource,
|
||||
"username", "password");
|
||||
XAResource[] xaResources = this.recoveryHelper.getXAResources();
|
||||
assertThat(xaResources.length).isEqualTo(1);
|
||||
assertThat(xaResources[0]).isSameAs(this.recoveryHelper);
|
||||
|
@ -80,10 +84,9 @@ public class DataSourceXAResourceRecoveryHelperTests {
|
|||
|
||||
@Test
|
||||
public void shouldFailToCreateConnectionAndNotGetXAResource() throws SQLException {
|
||||
when(this.xaDataSource.getXAConnection()).thenThrow(new SQLException("Test exception"));
|
||||
|
||||
given(this.xaDataSource.getXAConnection())
|
||||
.willThrow(new SQLException("Test exception"));
|
||||
XAResource[] xaResources = this.recoveryHelper.getXAResources();
|
||||
|
||||
assertThat(xaResources.length).isEqualTo(0);
|
||||
verify(this.xaDataSource, times(1)).getXAConnection();
|
||||
verify(this.xaConnection, times(0)).getXAResource();
|
||||
|
@ -93,15 +96,14 @@ public class DataSourceXAResourceRecoveryHelperTests {
|
|||
public void shouldDelegateRecoverCall() throws XAException {
|
||||
this.recoveryHelper.getXAResources();
|
||||
this.recoveryHelper.recover(XAResource.TMSTARTRSCAN);
|
||||
|
||||
verify(this.xaResource, times(1)).recover(XAResource.TMSTARTRSCAN);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void shouldDelegateRecoverCallAndCloseConnection() throws XAException, SQLException {
|
||||
public void shouldDelegateRecoverCallAndCloseConnection()
|
||||
throws XAException, SQLException {
|
||||
this.recoveryHelper.getXAResources();
|
||||
this.recoveryHelper.recover(XAResource.TMENDRSCAN);
|
||||
|
||||
verify(this.xaResource, times(1)).recover(XAResource.TMENDRSCAN);
|
||||
verify(this.xaConnection, times(1)).close();
|
||||
}
|
||||
|
@ -110,7 +112,6 @@ public class DataSourceXAResourceRecoveryHelperTests {
|
|||
public void shouldDelegateStartCall() throws XAException {
|
||||
this.recoveryHelper.getXAResources();
|
||||
this.recoveryHelper.start(null, 0);
|
||||
|
||||
verify(this.xaResource, times(1)).start(null, 0);
|
||||
}
|
||||
|
||||
|
@ -118,7 +119,6 @@ public class DataSourceXAResourceRecoveryHelperTests {
|
|||
public void shouldDelegateEndCall() throws XAException {
|
||||
this.recoveryHelper.getXAResources();
|
||||
this.recoveryHelper.end(null, 0);
|
||||
|
||||
verify(this.xaResource, times(1)).end(null, 0);
|
||||
}
|
||||
|
||||
|
@ -126,7 +126,6 @@ public class DataSourceXAResourceRecoveryHelperTests {
|
|||
public void shouldDelegatePrepareCall() throws XAException {
|
||||
this.recoveryHelper.getXAResources();
|
||||
this.recoveryHelper.prepare(null);
|
||||
|
||||
verify(this.xaResource, times(1)).prepare(null);
|
||||
}
|
||||
|
||||
|
@ -134,7 +133,6 @@ public class DataSourceXAResourceRecoveryHelperTests {
|
|||
public void shouldDelegateCommitCall() throws XAException {
|
||||
this.recoveryHelper.getXAResources();
|
||||
this.recoveryHelper.commit(null, true);
|
||||
|
||||
verify(this.xaResource, times(1)).commit(null, true);
|
||||
}
|
||||
|
||||
|
@ -142,7 +140,6 @@ public class DataSourceXAResourceRecoveryHelperTests {
|
|||
public void shouldDelegateRollbackCall() throws XAException {
|
||||
this.recoveryHelper.getXAResources();
|
||||
this.recoveryHelper.rollback(null);
|
||||
|
||||
verify(this.xaResource, times(1)).rollback(null);
|
||||
}
|
||||
|
||||
|
@ -150,7 +147,6 @@ public class DataSourceXAResourceRecoveryHelperTests {
|
|||
public void shouldDelegateIsSameRMCall() throws XAException {
|
||||
this.recoveryHelper.getXAResources();
|
||||
this.recoveryHelper.isSameRM(null);
|
||||
|
||||
verify(this.xaResource, times(1)).isSameRM(null);
|
||||
}
|
||||
|
||||
|
@ -158,7 +154,6 @@ public class DataSourceXAResourceRecoveryHelperTests {
|
|||
public void shouldDelegateForgetCall() throws XAException {
|
||||
this.recoveryHelper.getXAResources();
|
||||
this.recoveryHelper.forget(null);
|
||||
|
||||
verify(this.xaResource, times(1)).forget(null);
|
||||
}
|
||||
|
||||
|
@ -166,7 +161,6 @@ public class DataSourceXAResourceRecoveryHelperTests {
|
|||
public void shouldDelegateGetTransactionTimeoutCall() throws XAException {
|
||||
this.recoveryHelper.getXAResources();
|
||||
this.recoveryHelper.getTransactionTimeout();
|
||||
|
||||
verify(this.xaResource, times(1)).getTransactionTimeout();
|
||||
}
|
||||
|
||||
|
@ -174,9 +168,7 @@ public class DataSourceXAResourceRecoveryHelperTests {
|
|||
public void shouldDelegateSetTransactionTimeoutCall() throws XAException {
|
||||
this.recoveryHelper.getXAResources();
|
||||
this.recoveryHelper.setTransactionTimeout(0);
|
||||
|
||||
verify(this.xaResource, times(1)).setTransactionTimeout(0);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright 2012-2015 the original author or authors.
|
||||
* Copyright 2012-2016 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
@ -27,12 +27,14 @@ import org.springframework.context.annotation.AnnotationConfigApplicationContext
|
|||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
|
||||
import static org.mockito.BDDMockito.mock;
|
||||
import static org.mockito.BDDMockito.spy;
|
||||
import static org.mockito.BDDMockito.verify;
|
||||
import static org.mockito.Mockito.mock;
|
||||
import static org.mockito.Mockito.spy;
|
||||
import static org.mockito.Mockito.verify;
|
||||
|
||||
/**
|
||||
* @author <a href="mailto:gytis@redhat.com">Gytis Trikleris</a>
|
||||
* Tests for {@link NarayanaBeanFactoryPostProcessor}.
|
||||
*
|
||||
* @author Gytis Trikleris
|
||||
*/
|
||||
public class NarayanaBeanFactoryPostProcessorTests {
|
||||
|
||||
|
@ -41,16 +43,17 @@ public class NarayanaBeanFactoryPostProcessorTests {
|
|||
@Test
|
||||
public void setsDependsOn() {
|
||||
DefaultListableBeanFactory beanFactory = spy(new DefaultListableBeanFactory());
|
||||
|
||||
this.context = new AnnotationConfigApplicationContext(beanFactory);
|
||||
this.context.register(Config.class);
|
||||
this.context.refresh();
|
||||
|
||||
verify(beanFactory).registerDependentBean("narayanaTransactionManager", "dataSource");
|
||||
verify(beanFactory).registerDependentBean("narayanaTransactionManager", "connectionFactory");
|
||||
verify(beanFactory).registerDependentBean("narayanaRecoveryManagerBean", "dataSource");
|
||||
verify(beanFactory).registerDependentBean("narayanaRecoveryManagerBean", "connectionFactory");
|
||||
|
||||
verify(beanFactory).registerDependentBean("narayanaTransactionManager",
|
||||
"dataSource");
|
||||
verify(beanFactory).registerDependentBean("narayanaTransactionManager",
|
||||
"connectionFactory");
|
||||
verify(beanFactory).registerDependentBean("narayanaRecoveryManagerBean",
|
||||
"dataSource");
|
||||
verify(beanFactory).registerDependentBean("narayanaRecoveryManagerBean",
|
||||
"connectionFactory");
|
||||
this.context.close();
|
||||
}
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright 2012-2014 the original author or authors.
|
||||
* Copyright 2012-2016 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
@ -25,52 +25,63 @@ import com.arjuna.ats.arjuna.common.ObjectStoreEnvironmentBean;
|
|||
import com.arjuna.ats.arjuna.common.RecoveryEnvironmentBean;
|
||||
import com.arjuna.ats.jta.common.JTAEnvironmentBean;
|
||||
import com.arjuna.common.internal.util.propertyservice.BeanPopulator;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
/**
|
||||
* @author <a href="mailto:gytis@redhat.com">Gytis Trikleris</a>
|
||||
* Tests for {@link NarayanaConfigurationBean}.
|
||||
*
|
||||
* @author Gytis Trikleris
|
||||
*/
|
||||
public class NarayanaConfigurationBeanTests {
|
||||
|
||||
@Test
|
||||
public void shouldSetDefaultProperties() throws Exception {
|
||||
NarayanaProperties narayanaProperties = new NarayanaProperties();
|
||||
NarayanaConfigurationBean narayanaConfigurationBean = new NarayanaConfigurationBean(narayanaProperties);
|
||||
NarayanaConfigurationBean narayanaConfigurationBean = new NarayanaConfigurationBean(
|
||||
narayanaProperties);
|
||||
narayanaConfigurationBean.afterPropertiesSet();
|
||||
|
||||
assertThat(BeanPopulator.getDefaultInstance(CoreEnvironmentBean.class).getNodeIdentifier()).isEqualTo("1");
|
||||
assertThat(BeanPopulator.getDefaultInstance(ObjectStoreEnvironmentBean.class).getObjectStoreDir())
|
||||
.isEqualTo("target/tx-object-store");
|
||||
assertThat(BeanPopulator.getNamedInstance(ObjectStoreEnvironmentBean.class, "communicationStore").getObjectStoreDir())
|
||||
.isEqualTo("target/tx-object-store");
|
||||
assertThat(BeanPopulator.getNamedInstance(ObjectStoreEnvironmentBean.class, "stateStore").getObjectStoreDir())
|
||||
.isEqualTo("target/tx-object-store");
|
||||
assertThat(BeanPopulator.getDefaultInstance(CoordinatorEnvironmentBean.class).isCommitOnePhase()).isTrue();
|
||||
assertThat(BeanPopulator.getDefaultInstance(CoordinatorEnvironmentBean.class).getDefaultTimeout()).isEqualTo(60);
|
||||
assertThat(BeanPopulator.getDefaultInstance(RecoveryEnvironmentBean.class).getPeriodicRecoveryPeriod()).isEqualTo(120);
|
||||
assertThat(BeanPopulator.getDefaultInstance(RecoveryEnvironmentBean.class).getRecoveryBackoffPeriod()).isEqualTo(10);
|
||||
|
||||
assertThat(BeanPopulator.getDefaultInstance(CoreEnvironmentBean.class)
|
||||
.getNodeIdentifier()).isEqualTo("1");
|
||||
assertThat(BeanPopulator.getDefaultInstance(ObjectStoreEnvironmentBean.class)
|
||||
.getObjectStoreDir()).isEqualTo("target/tx-object-store");
|
||||
assertThat(BeanPopulator
|
||||
.getNamedInstance(ObjectStoreEnvironmentBean.class, "communicationStore")
|
||||
.getObjectStoreDir()).isEqualTo("target/tx-object-store");
|
||||
assertThat(BeanPopulator
|
||||
.getNamedInstance(ObjectStoreEnvironmentBean.class, "stateStore")
|
||||
.getObjectStoreDir()).isEqualTo("target/tx-object-store");
|
||||
assertThat(BeanPopulator.getDefaultInstance(CoordinatorEnvironmentBean.class)
|
||||
.isCommitOnePhase()).isTrue();
|
||||
assertThat(BeanPopulator.getDefaultInstance(CoordinatorEnvironmentBean.class)
|
||||
.getDefaultTimeout()).isEqualTo(60);
|
||||
assertThat(BeanPopulator.getDefaultInstance(RecoveryEnvironmentBean.class)
|
||||
.getPeriodicRecoveryPeriod()).isEqualTo(120);
|
||||
assertThat(BeanPopulator.getDefaultInstance(RecoveryEnvironmentBean.class)
|
||||
.getRecoveryBackoffPeriod()).isEqualTo(10);
|
||||
|
||||
List<String> xaResourceOrphanFilters = Arrays.asList(
|
||||
"com.arjuna.ats.internal.jta.recovery.arjunacore.JTATransactionLogXAResourceOrphanFilter",
|
||||
"com.arjuna.ats.internal.jta.recovery.arjunacore.JTANodeNameXAResourceOrphanFilter");
|
||||
assertThat(BeanPopulator.getDefaultInstance(JTAEnvironmentBean.class).getXaResourceOrphanFilterClassNames())
|
||||
.isEqualTo(xaResourceOrphanFilters);
|
||||
assertThat(BeanPopulator.getDefaultInstance(JTAEnvironmentBean.class)
|
||||
.getXaResourceOrphanFilterClassNames())
|
||||
.isEqualTo(xaResourceOrphanFilters);
|
||||
|
||||
List<String> recoveryModules = Arrays.asList("com.arjuna.ats.internal.arjuna.recovery.AtomicActionRecoveryModule",
|
||||
List<String> recoveryModules = Arrays.asList(
|
||||
"com.arjuna.ats.internal.arjuna.recovery.AtomicActionRecoveryModule",
|
||||
"com.arjuna.ats.internal.jta.recovery.arjunacore.XARecoveryModule");
|
||||
assertThat(BeanPopulator.getDefaultInstance(RecoveryEnvironmentBean.class).getRecoveryModuleClassNames())
|
||||
.isEqualTo(recoveryModules);
|
||||
assertThat(BeanPopulator.getDefaultInstance(RecoveryEnvironmentBean.class)
|
||||
.getRecoveryModuleClassNames()).isEqualTo(recoveryModules);
|
||||
|
||||
List<String> expiryScanners = Arrays
|
||||
.asList("com.arjuna.ats.internal.arjuna.recovery.ExpiredTransactionStatusManagerScanner");
|
||||
assertThat(BeanPopulator.getDefaultInstance(RecoveryEnvironmentBean.class).getExpiryScannerClassNames())
|
||||
.isEqualTo(expiryScanners);
|
||||
List<String> expiryScanners = Arrays.asList(
|
||||
"com.arjuna.ats.internal.arjuna.recovery.ExpiredTransactionStatusManagerScanner");
|
||||
assertThat(BeanPopulator.getDefaultInstance(RecoveryEnvironmentBean.class)
|
||||
.getExpiryScannerClassNames()).isEqualTo(expiryScanners);
|
||||
|
||||
assertThat(BeanPopulator.getDefaultInstance(JTAEnvironmentBean.class).getXaResourceRecoveryClassNames()).isEmpty();
|
||||
assertThat(BeanPopulator.getDefaultInstance(JTAEnvironmentBean.class)
|
||||
.getXaResourceRecoveryClassNames()).isEmpty();
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@ -82,30 +93,44 @@ public class NarayanaConfigurationBeanTests {
|
|||
narayanaProperties.setPeriodicRecoveryPeriod(2);
|
||||
narayanaProperties.setRecoveryBackoffPeriod(3);
|
||||
narayanaProperties.setOnePhaseCommit(false);
|
||||
narayanaProperties.setXaResourceOrphanFilters(Arrays.asList("test-filter-1", "test-filter-2"));
|
||||
narayanaProperties.setRecoveryModules(Arrays.asList("test-module-1", "test-module-2"));
|
||||
narayanaProperties.setExpiryScanners(Arrays.asList("test-scanner-1", "test-scanner-2"));
|
||||
narayanaProperties.setXaResourceOrphanFilters(
|
||||
Arrays.asList("test-filter-1", "test-filter-2"));
|
||||
narayanaProperties
|
||||
.setRecoveryModules(Arrays.asList("test-module-1", "test-module-2"));
|
||||
narayanaProperties
|
||||
.setExpiryScanners(Arrays.asList("test-scanner-1", "test-scanner-2"));
|
||||
|
||||
NarayanaConfigurationBean narayanaConfigurationBean = new NarayanaConfigurationBean(narayanaProperties);
|
||||
NarayanaConfigurationBean narayanaConfigurationBean = new NarayanaConfigurationBean(
|
||||
narayanaProperties);
|
||||
narayanaConfigurationBean.afterPropertiesSet();
|
||||
|
||||
assertThat(BeanPopulator.getDefaultInstance(CoreEnvironmentBean.class).getNodeIdentifier()).isEqualTo("test-id");
|
||||
assertThat(BeanPopulator.getDefaultInstance(ObjectStoreEnvironmentBean.class).getObjectStoreDir())
|
||||
.isEqualTo("test-dir");
|
||||
assertThat(BeanPopulator.getNamedInstance(ObjectStoreEnvironmentBean.class, "communicationStore").getObjectStoreDir())
|
||||
.isEqualTo("test-dir");
|
||||
assertThat(BeanPopulator.getNamedInstance(ObjectStoreEnvironmentBean.class, "stateStore").getObjectStoreDir())
|
||||
.isEqualTo("test-dir");
|
||||
assertThat(BeanPopulator.getDefaultInstance(CoordinatorEnvironmentBean.class).isCommitOnePhase()).isFalse();
|
||||
assertThat(BeanPopulator.getDefaultInstance(CoordinatorEnvironmentBean.class).getDefaultTimeout()).isEqualTo(1);
|
||||
assertThat(BeanPopulator.getDefaultInstance(RecoveryEnvironmentBean.class).getPeriodicRecoveryPeriod()).isEqualTo(2);
|
||||
assertThat(BeanPopulator.getDefaultInstance(RecoveryEnvironmentBean.class).getRecoveryBackoffPeriod()).isEqualTo(3);
|
||||
assertThat(BeanPopulator.getDefaultInstance(JTAEnvironmentBean.class).getXaResourceOrphanFilterClassNames())
|
||||
.isEqualTo(Arrays.asList("test-filter-1", "test-filter-2"));
|
||||
assertThat(BeanPopulator.getDefaultInstance(RecoveryEnvironmentBean.class).getRecoveryModuleClassNames())
|
||||
.isEqualTo(Arrays.asList("test-module-1", "test-module-2"));
|
||||
assertThat(BeanPopulator.getDefaultInstance(RecoveryEnvironmentBean.class).getExpiryScannerClassNames())
|
||||
.isEqualTo(Arrays.asList("test-scanner-1", "test-scanner-2"));
|
||||
assertThat(BeanPopulator.getDefaultInstance(CoreEnvironmentBean.class)
|
||||
.getNodeIdentifier()).isEqualTo("test-id");
|
||||
assertThat(BeanPopulator.getDefaultInstance(ObjectStoreEnvironmentBean.class)
|
||||
.getObjectStoreDir()).isEqualTo("test-dir");
|
||||
assertThat(BeanPopulator
|
||||
.getNamedInstance(ObjectStoreEnvironmentBean.class, "communicationStore")
|
||||
.getObjectStoreDir()).isEqualTo("test-dir");
|
||||
assertThat(BeanPopulator
|
||||
.getNamedInstance(ObjectStoreEnvironmentBean.class, "stateStore")
|
||||
.getObjectStoreDir()).isEqualTo("test-dir");
|
||||
assertThat(BeanPopulator.getDefaultInstance(CoordinatorEnvironmentBean.class)
|
||||
.isCommitOnePhase()).isFalse();
|
||||
assertThat(BeanPopulator.getDefaultInstance(CoordinatorEnvironmentBean.class)
|
||||
.getDefaultTimeout()).isEqualTo(1);
|
||||
assertThat(BeanPopulator.getDefaultInstance(RecoveryEnvironmentBean.class)
|
||||
.getPeriodicRecoveryPeriod()).isEqualTo(2);
|
||||
assertThat(BeanPopulator.getDefaultInstance(RecoveryEnvironmentBean.class)
|
||||
.getRecoveryBackoffPeriod()).isEqualTo(3);
|
||||
assertThat(BeanPopulator.getDefaultInstance(JTAEnvironmentBean.class)
|
||||
.getXaResourceOrphanFilterClassNames())
|
||||
.isEqualTo(Arrays.asList("test-filter-1", "test-filter-2"));
|
||||
assertThat(BeanPopulator.getDefaultInstance(RecoveryEnvironmentBean.class)
|
||||
.getRecoveryModuleClassNames())
|
||||
.isEqualTo(Arrays.asList("test-module-1", "test-module-2"));
|
||||
assertThat(BeanPopulator.getDefaultInstance(RecoveryEnvironmentBean.class)
|
||||
.getExpiryScannerClassNames())
|
||||
.isEqualTo(Arrays.asList("test-scanner-1", "test-scanner-2"));
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright 2012-2014 the original author or authors.
|
||||
* Copyright 2012-2016 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
@ -30,24 +30,26 @@ import org.junit.Before;
|
|||
import org.junit.Test;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
import static org.mockito.BDDMockito.mock;
|
||||
import static org.mockito.BDDMockito.times;
|
||||
import static org.mockito.BDDMockito.verify;
|
||||
import static org.mockito.BDDMockito.when;
|
||||
import static org.mockito.BDDMockito.given;
|
||||
import static org.mockito.Mockito.mock;
|
||||
import static org.mockito.Mockito.times;
|
||||
import static org.mockito.Mockito.verify;
|
||||
|
||||
/**
|
||||
* @author <a href="mailto:gytis@redhat.com">Gytis Trikleris</a>
|
||||
* Tests for {@link NarayanaDataSourceBean}.
|
||||
*
|
||||
* @author Gytis Trikleris
|
||||
*/
|
||||
public class NarayanaDataSourceBeanTests {
|
||||
|
||||
private XADataSource mockDataSource;
|
||||
private XADataSource dataSource;
|
||||
|
||||
private NarayanaDataSourceBean dataSourceBean;
|
||||
|
||||
@Before
|
||||
public void before() {
|
||||
this.mockDataSource = mock(XADataSource.class);
|
||||
this.dataSourceBean = new NarayanaDataSourceBean(this.mockDataSource);
|
||||
this.dataSource = mock(XADataSource.class);
|
||||
this.dataSourceBean = new NarayanaDataSourceBean(this.dataSource);
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@ -62,32 +64,36 @@ public class NarayanaDataSourceBeanTests {
|
|||
|
||||
@Test
|
||||
public void shouldUnwrapDataSource() throws SQLException {
|
||||
assertThat(this.dataSourceBean.unwrap(DataSource.class)).isInstanceOf(DataSource.class);
|
||||
assertThat(this.dataSourceBean.unwrap(DataSource.class)).isSameAs(this.dataSourceBean);
|
||||
assertThat(this.dataSourceBean.unwrap(DataSource.class))
|
||||
.isInstanceOf(DataSource.class);
|
||||
assertThat(this.dataSourceBean.unwrap(DataSource.class))
|
||||
.isSameAs(this.dataSourceBean);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void shouldUnwrapXaDataSource() throws SQLException {
|
||||
assertThat(this.dataSourceBean.unwrap(XADataSource.class)).isInstanceOf(XADataSource.class);
|
||||
assertThat(this.dataSourceBean.unwrap(XADataSource.class)).isSameAs(this.mockDataSource);
|
||||
assertThat(this.dataSourceBean.unwrap(XADataSource.class))
|
||||
.isInstanceOf(XADataSource.class);
|
||||
assertThat(this.dataSourceBean.unwrap(XADataSource.class))
|
||||
.isSameAs(this.dataSource);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void shouldGetConnectionAndCommit() throws SQLException {
|
||||
Connection mockConnection = mock(Connection.class);
|
||||
XAConnection mockXaConnection = mock(XAConnection.class);
|
||||
when(mockXaConnection.getConnection()).thenReturn(mockConnection);
|
||||
when(this.mockDataSource.getXAConnection()).thenReturn(mockXaConnection);
|
||||
given(mockXaConnection.getConnection()).willReturn(mockConnection);
|
||||
given(this.dataSource.getXAConnection()).willReturn(mockXaConnection);
|
||||
|
||||
Properties properties = new Properties();
|
||||
properties.put(TransactionalDriver.XADataSource, this.mockDataSource);
|
||||
properties.put(TransactionalDriver.XADataSource, this.dataSource);
|
||||
|
||||
Connection connection = this.dataSourceBean.getConnection();
|
||||
assertThat(connection).isInstanceOf(ConnectionImple.class);
|
||||
|
||||
connection.commit();
|
||||
|
||||
verify(this.mockDataSource, times(1)).getXAConnection();
|
||||
verify(this.dataSource, times(1)).getXAConnection();
|
||||
verify(mockXaConnection, times(1)).getConnection();
|
||||
verify(mockConnection, times(1)).commit();
|
||||
}
|
||||
|
@ -98,11 +104,12 @@ public class NarayanaDataSourceBeanTests {
|
|||
String password = "testPassword";
|
||||
Connection mockConnection = mock(Connection.class);
|
||||
XAConnection mockXaConnection = mock(XAConnection.class);
|
||||
when(mockXaConnection.getConnection()).thenReturn(mockConnection);
|
||||
when(this.mockDataSource.getXAConnection(username, password)).thenReturn(mockXaConnection);
|
||||
given(mockXaConnection.getConnection()).willReturn(mockConnection);
|
||||
given(this.dataSource.getXAConnection(username, password))
|
||||
.willReturn(mockXaConnection);
|
||||
|
||||
Properties properties = new Properties();
|
||||
properties.put(TransactionalDriver.XADataSource, this.mockDataSource);
|
||||
properties.put(TransactionalDriver.XADataSource, this.dataSource);
|
||||
properties.put(TransactionalDriver.userName, username);
|
||||
properties.put(TransactionalDriver.password, password);
|
||||
|
||||
|
@ -111,7 +118,7 @@ public class NarayanaDataSourceBeanTests {
|
|||
|
||||
connection.commit();
|
||||
|
||||
verify(this.mockDataSource, times(1)).getXAConnection(username, password);
|
||||
verify(this.dataSource, times(1)).getXAConnection(username, password);
|
||||
verify(mockXaConnection, times(1)).getConnection();
|
||||
verify(mockConnection, times(1)).commit();
|
||||
}
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright 2012-2014 the original author or authors.
|
||||
* Copyright 2012-2016 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
@ -17,7 +17,6 @@
|
|||
package org.springframework.boot.jta.narayana;
|
||||
|
||||
import com.arjuna.ats.jbossatx.jta.RecoveryManagerService;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
||||
|
@ -26,34 +25,34 @@ import static org.mockito.Mockito.times;
|
|||
import static org.mockito.Mockito.verify;
|
||||
|
||||
/**
|
||||
* @author <a href="mailto:gytis@redhat.com">Gytis Trikleris</a>
|
||||
* Tests for {@link NarayanaRecoveryManagerBean}.
|
||||
*
|
||||
* @author Gytis Trikleris
|
||||
*/
|
||||
public class NarayanaRecoveryManagerBeanTests {
|
||||
|
||||
private RecoveryManagerService recoveryManagerService;
|
||||
private RecoveryManagerService service;
|
||||
|
||||
private NarayanaRecoveryManagerBean narayanaRecoveryManagerBean;
|
||||
private NarayanaRecoveryManagerBean recoveryManager;
|
||||
|
||||
@Before
|
||||
public void before() {
|
||||
this.recoveryManagerService = mock(RecoveryManagerService.class);
|
||||
this.narayanaRecoveryManagerBean = new NarayanaRecoveryManagerBean(this.recoveryManagerService);
|
||||
this.service = mock(RecoveryManagerService.class);
|
||||
this.recoveryManager = new NarayanaRecoveryManagerBean(this.service);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void shouldCreateAndStartRecoveryManagerService() throws Exception {
|
||||
this.narayanaRecoveryManagerBean.afterPropertiesSet();
|
||||
|
||||
verify(this.recoveryManagerService, times(1)).create();
|
||||
verify(this.recoveryManagerService, times(1)).start();
|
||||
this.recoveryManager.afterPropertiesSet();
|
||||
verify(this.service, times(1)).create();
|
||||
verify(this.service, times(1)).start();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void shouldStopAndDestroyRecoveryManagerService() throws Exception {
|
||||
this.narayanaRecoveryManagerBean.destroy();
|
||||
|
||||
verify(this.recoveryManagerService, times(1)).stop();
|
||||
verify(this.recoveryManagerService, times(1)).destroy();
|
||||
this.recoveryManager.destroy();
|
||||
verify(this.service, times(1)).stop();
|
||||
verify(this.service, times(1)).destroy();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright 2012-2014 the original author or authors.
|
||||
* Copyright 2012-2016 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
@ -25,14 +25,16 @@ import org.jboss.narayana.jta.jms.JmsXAResourceRecoveryHelper;
|
|||
import org.junit.Test;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
import static org.mockito.BDDMockito.mock;
|
||||
import static org.mockito.BDDMockito.times;
|
||||
import static org.mockito.BDDMockito.verify;
|
||||
import static org.mockito.BDDMockito.when;
|
||||
import static org.mockito.BDDMockito.given;
|
||||
import static org.mockito.Matchers.any;
|
||||
import static org.mockito.Mockito.mock;
|
||||
import static org.mockito.Mockito.times;
|
||||
import static org.mockito.Mockito.verify;
|
||||
|
||||
/**
|
||||
* @author <a href="mailto:gytis@redhat.com">Gytis Trikleris</a>
|
||||
* Tests for {@link NarayanaXAConnectionFactoryWrapper}.
|
||||
*
|
||||
* @author Gytis Trikleris
|
||||
*/
|
||||
public class NarayanaXAConnectionFactoryWrapperTests {
|
||||
|
||||
|
@ -40,34 +42,36 @@ public class NarayanaXAConnectionFactoryWrapperTests {
|
|||
|
||||
private TransactionManager transactionManager = mock(TransactionManager.class);
|
||||
|
||||
private NarayanaRecoveryManagerBean narayanaRecoveryManagerBean = mock(NarayanaRecoveryManagerBean.class);
|
||||
private NarayanaRecoveryManagerBean recoveryManager = mock(
|
||||
NarayanaRecoveryManagerBean.class);
|
||||
|
||||
private NarayanaProperties narayanaProperties = mock(NarayanaProperties.class);
|
||||
private NarayanaProperties properties = mock(NarayanaProperties.class);
|
||||
|
||||
private NarayanaXAConnectionFactoryWrapper wrapper = new NarayanaXAConnectionFactoryWrapper(this.transactionManager,
|
||||
this.narayanaRecoveryManagerBean, this.narayanaProperties);
|
||||
private NarayanaXAConnectionFactoryWrapper wrapper = new NarayanaXAConnectionFactoryWrapper(
|
||||
this.transactionManager, this.recoveryManager, this.properties);
|
||||
|
||||
@Test
|
||||
public void wrap() {
|
||||
ConnectionFactory wrapped = this.wrapper.wrapConnectionFactory(this.connectionFactory);
|
||||
ConnectionFactory wrapped = this.wrapper
|
||||
.wrapConnectionFactory(this.connectionFactory);
|
||||
assertThat(wrapped).isInstanceOf(ConnectionFactoryProxy.class);
|
||||
verify(this.narayanaRecoveryManagerBean, times(1))
|
||||
verify(this.recoveryManager, times(1))
|
||||
.registerXAResourceRecoveryHelper(any(JmsXAResourceRecoveryHelper.class));
|
||||
verify(this.narayanaProperties, times(1)).getRecoveryJmsUser();
|
||||
verify(this.narayanaProperties, times(1)).getRecoveryJmsPass();
|
||||
verify(this.properties, times(1)).getRecoveryJmsUser();
|
||||
verify(this.properties, times(1)).getRecoveryJmsPass();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void wrapWithCredentials() {
|
||||
when(this.narayanaProperties.getRecoveryJmsUser()).thenReturn("userName");
|
||||
when(this.narayanaProperties.getRecoveryJmsPass()).thenReturn("password");
|
||||
ConnectionFactory wrapped = this.wrapper.wrapConnectionFactory(this.connectionFactory);
|
||||
|
||||
given(this.properties.getRecoveryJmsUser()).willReturn("userName");
|
||||
given(this.properties.getRecoveryJmsPass()).willReturn("password");
|
||||
ConnectionFactory wrapped = this.wrapper
|
||||
.wrapConnectionFactory(this.connectionFactory);
|
||||
assertThat(wrapped).isInstanceOf(ConnectionFactoryProxy.class);
|
||||
verify(this.narayanaRecoveryManagerBean, times(1))
|
||||
verify(this.recoveryManager, times(1))
|
||||
.registerXAResourceRecoveryHelper(any(JmsXAResourceRecoveryHelper.class));
|
||||
verify(this.narayanaProperties, times(2)).getRecoveryJmsUser();
|
||||
verify(this.narayanaProperties, times(1)).getRecoveryJmsPass();
|
||||
verify(this.properties, times(2)).getRecoveryJmsUser();
|
||||
verify(this.properties, times(1)).getRecoveryJmsPass();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright 2012-2014 the original author or authors.
|
||||
* Copyright 2012-2016 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
@ -22,48 +22,49 @@ import javax.sql.XADataSource;
|
|||
import org.junit.Test;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
import static org.mockito.BDDMockito.mock;
|
||||
import static org.mockito.BDDMockito.times;
|
||||
import static org.mockito.BDDMockito.verify;
|
||||
import static org.mockito.BDDMockito.when;
|
||||
import static org.mockito.BDDMockito.given;
|
||||
import static org.mockito.Matchers.any;
|
||||
import static org.mockito.Mockito.mock;
|
||||
import static org.mockito.Mockito.times;
|
||||
import static org.mockito.Mockito.verify;
|
||||
|
||||
/**
|
||||
* @author <a href="mailto:gytis@redhat.com">Gytis Trikleris</a>
|
||||
* Tests for {@link NarayanaXADataSourceWrapper}.
|
||||
*
|
||||
* @author Gytis Trikleris
|
||||
*/
|
||||
public class NarayanaXADataSourceWrapperTests {
|
||||
|
||||
private XADataSource dataSource = mock(XADataSource.class);
|
||||
|
||||
private NarayanaRecoveryManagerBean narayanaRecoveryManagerBean = mock(NarayanaRecoveryManagerBean.class);
|
||||
private NarayanaRecoveryManagerBean recoveryManager = mock(
|
||||
NarayanaRecoveryManagerBean.class);
|
||||
|
||||
private NarayanaProperties narayanaProperties = mock(NarayanaProperties.class);
|
||||
private NarayanaProperties properties = mock(NarayanaProperties.class);
|
||||
|
||||
private NarayanaXADataSourceWrapper wrapper = new NarayanaXADataSourceWrapper(this.narayanaRecoveryManagerBean,
|
||||
this.narayanaProperties);
|
||||
private NarayanaXADataSourceWrapper wrapper = new NarayanaXADataSourceWrapper(
|
||||
this.recoveryManager, this.properties);
|
||||
|
||||
@Test
|
||||
public void wrap() {
|
||||
DataSource wrapped = this.wrapper.wrapDataSource(this.dataSource);
|
||||
|
||||
assertThat(wrapped).isInstanceOf(NarayanaDataSourceBean.class);
|
||||
verify(this.narayanaRecoveryManagerBean, times(1))
|
||||
.registerXAResourceRecoveryHelper(any(DataSourceXAResourceRecoveryHelper.class));
|
||||
verify(this.narayanaProperties, times(1)).getRecoveryDbUser();
|
||||
verify(this.narayanaProperties, times(1)).getRecoveryDbPass();
|
||||
verify(this.recoveryManager, times(1)).registerXAResourceRecoveryHelper(
|
||||
any(DataSourceXAResourceRecoveryHelper.class));
|
||||
verify(this.properties, times(1)).getRecoveryDbUser();
|
||||
verify(this.properties, times(1)).getRecoveryDbPass();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void wrapWithCredentials() {
|
||||
when(this.narayanaProperties.getRecoveryDbUser()).thenReturn("userName");
|
||||
when(this.narayanaProperties.getRecoveryDbPass()).thenReturn("password");
|
||||
given(this.properties.getRecoveryDbUser()).willReturn("userName");
|
||||
given(this.properties.getRecoveryDbPass()).willReturn("password");
|
||||
DataSource wrapped = this.wrapper.wrapDataSource(this.dataSource);
|
||||
|
||||
assertThat(wrapped).isInstanceOf(NarayanaDataSourceBean.class);
|
||||
verify(this.narayanaRecoveryManagerBean, times(1))
|
||||
.registerXAResourceRecoveryHelper(any(DataSourceXAResourceRecoveryHelper.class));
|
||||
verify(this.narayanaProperties, times(2)).getRecoveryDbUser();
|
||||
verify(this.narayanaProperties, times(1)).getRecoveryDbPass();
|
||||
verify(this.recoveryManager, times(1)).registerXAResourceRecoveryHelper(
|
||||
any(DataSourceXAResourceRecoveryHelper.class));
|
||||
verify(this.properties, times(2)).getRecoveryDbUser();
|
||||
verify(this.properties, times(1)).getRecoveryDbPass();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue