Skip to content

Commit

Permalink
[feature#36] support for transactions with mongoDB 4.0 (#37)
Browse files Browse the repository at this point in the history
  • Loading branch information
kaiso committed Dec 2, 2018
1 parent 9c87485 commit d884dc4
Show file tree
Hide file tree
Showing 4 changed files with 220 additions and 9 deletions.
45 changes: 39 additions & 6 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,22 +5,22 @@

<groupId>io.github.kaiso.relmongo</groupId>
<artifactId>relmongo</artifactId>
<version>2.3.0</version>
<version>3.0.0</version>
<packaging>jar</packaging>

<name>relmongo</name>
<url>https://kaiso.github.io/relmongo/</url>
<description>Make use of relations in MongoDB</description>

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.plugin.source.version>3.0.1</maven.plugin.source.version>
<maven.plugin.javadoc.version>3.0.1</maven.plugin.javadoc.version>
<spring.data.version>2.0.8.RELEASE</spring.data.version>
<spring.version>5.0.6.RELEASE</spring.version>
<mongo.driver.version>3.7.0</mongo.driver.version>
<spring.data.version>2.1.3.RELEASE</spring.data.version>
<spring.version>5.1.3.RELEASE</spring.version>
<mongo.driver.version>3.9.1</mongo.driver.version>
<junit.jupiter.version>5.2.0</junit.jupiter.version>
<junit.platform.version>1.2.0</junit.platform.version>
</properties>
Expand Down Expand Up @@ -90,6 +90,13 @@
<scope>provided</scope>
</dependency>

<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongo-java-driver</artifactId>
<version>${mongo.driver.version}</version>
</dependency>


<!-- test dependencies -->
<dependency>
<groupId>org.junit.jupiter</groupId>
Expand All @@ -108,7 +115,7 @@
<dependency>
<groupId>de.flapdoodle.embed</groupId>
<artifactId>de.flapdoodle.embed.mongo</artifactId>
<version>2.0.1</version>
<version>2.1.1</version>
<scope>test</scope>
</dependency>
<dependency>
Expand All @@ -117,6 +124,32 @@
<version>${spring.version}</version>
<scope>test</scope>
</dependency>

<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.11.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-1.2-api</artifactId>
<version>2.11.1</version>
<scope>test</scope>
</dependency>

<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.11.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.11.1</version>
<scope>test</scope>
</dependency>
</dependencies>


Expand Down
110 changes: 110 additions & 0 deletions src/test/java/io/github/kaiso/relmongo/tests/TransactionsTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
package io.github.kaiso.relmongo.tests;

import io.github.kaiso.relmongo.data.model.Car;
import io.github.kaiso.relmongo.data.model.DrivingLicense;
import io.github.kaiso.relmongo.data.model.House;
import io.github.kaiso.relmongo.data.model.Passport;
import io.github.kaiso.relmongo.data.model.Person;
import io.github.kaiso.relmongo.data.model.State;
import io.github.kaiso.relmongo.data.repository.PersonRepository;
import io.github.kaiso.relmongo.tests.common.AbstractBaseTest;

import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.mongodb.MongoDbFactory;
import org.springframework.data.mongodb.MongoTransactionException;
import org.springframework.data.mongodb.MongoTransactionManager;
import org.springframework.data.mongodb.core.MongoOperations;
import org.springframework.stereotype.Service;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

@ContextConfiguration(classes = { TransactionsTest.class })
public class TransactionsTest extends AbstractBaseTest {

@Autowired
private TransactionalBean transactionalBean;

@Service
public static class TransactionalBean {

@Autowired
private PersonRepository repository;

@Autowired
private MongoOperations mongoOperations;

public void before() {

mongoOperations.dropCollection(DrivingLicense.class);
mongoOperations.dropCollection(Passport.class);
mongoOperations.dropCollection(Person.class);
mongoOperations.dropCollection(House.class);
mongoOperations.dropCollection(Car.class);
mongoOperations.dropCollection(State.class);

// create collection
mongoOperations.createCollection(Person.class);
}

@Transactional(propagation = Propagation.REQUIRES_NEW)
public void savePerson(Person person) {
repository.save(person);
}

@Transactional(propagation = Propagation.REQUIRES_NEW)
public void savePersonAndDropCollection(Person person) {
repository.save(person);
repository.count();
mongoOperations.dropCollection(Person.class);
}

}

@Configuration
@EnableTransactionManagement
public static class TransactionConfig {

@Bean
MongoTransactionManager transactionManager(MongoDbFactory dbFactory) {
return new MongoTransactionManager(dbFactory);
}

}

@BeforeEach
public void beforeEach() {
transactionalBean.before();
}

@Test
@Disabled("this test works only on replicaset environment")
public void shouldSaveInTransaction() {

Person person = new Person();
person.setName("Dave");
person.setEmail("dave@mail.com");
transactionalBean.savePerson(person);

}

@Test
@Disabled("this test works only on replicaset environment")
public void shouldSaveInTransaction_excepttion() {
Assertions.assertThrows(MongoTransactionException.class, () -> {
Person person = new Person();
person.setName("Dave");
person.setEmail("dave@mail.com");
transactionalBean.savePersonAndDropCollection(person);
});

}

}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import com.mongodb.Mongo;
import com.mongodb.MongoClient;
import com.mongodb.ServerAddress;

import de.flapdoodle.embed.mongo.MongodExecutable;
import de.flapdoodle.embed.mongo.MongodProcess;
Expand All @@ -12,18 +13,49 @@
import de.flapdoodle.embed.process.runtime.Network;
import io.github.kaiso.relmongo.config.EnableRelMongo;

import org.apache.logging.log4j.core.config.ConfigurationSource;
import org.apache.logging.log4j.core.config.Configurator;
import org.apache.logging.log4j.core.config.builder.api.ConfigurationBuilderFactory;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.extension.ExtendWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.data.mongodb.MongoDbFactory;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.SimpleMongoDbFactory;
import org.springframework.data.mongodb.repository.config.EnableMongoRepositories;
import org.springframework.test.context.junit.jupiter.SpringExtension;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Collections;

@EnableRelMongo
@EnableMongoRepositories(basePackages = "io.github.kaiso.relmongo.data")
@ExtendWith(SpringExtension.class)
@ComponentScan(basePackages = { "io.github.kaiso.relmongo.tests" })
public abstract class AbstractBaseTest {

private static Logger logger = LoggerFactory.getLogger(AbstractBaseTest.class);

static {
ConfigurationSource configurationSource;
try {
configurationSource = new ConfigurationSource(
new FileInputStream(new File(System.getProperty("user.dir") + "/src/test/resources/log4j2-test.yaml")));
Configurator.initialize(ConfigurationBuilderFactory.newConfigurationBuilder().setConfigurationSource(configurationSource).build(true));
logger.info("Logger initialized !");
} catch (IOException e) {
e.printStackTrace();
}



}

/**
* please store Starter or RuntimeConfig in a static final field
Expand All @@ -43,7 +75,10 @@ protected static void setUp() throws Exception {
.net(new Net("localhost", 55777, Network.localhostIsIPv6())).build());
_mongod = _mongodExe.start();

_mongo = new MongoClient("localhost", 55777);
_mongo = new MongoClient(Collections.singletonList(new ServerAddress("127.0.0.1", 55777)));
// _mongo = new MongoClient(Arrays.asList(new ServerAddress("127.0.0.1",
// 30001),new ServerAddress("127.0.0.1", 30002),new ServerAddress("127.0.0.1",
// 30003)));
}

@AfterAll
Expand All @@ -58,9 +93,13 @@ public Mongo mongo() {
return _mongo;
}

public @Bean MongoDbFactory mongoDbFactory() {
return new SimpleMongoDbFactory(_mongo, "test");
}

@Bean
public MongoTemplate mongoTemplate() throws Exception {
return new MongoTemplate(_mongo, "test");
public MongoTemplate mongoTemplate(MongoDbFactory mongoDbFactory) throws Exception {
return new MongoTemplate(mongoDbFactory);
}

}
29 changes: 29 additions & 0 deletions src/test/resources/log4j2-test.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
Configutation:
name: Default

Properties:
Property:
name: log-path
value: "logs"

Appenders:

Console:
name: Console_Appender
target: SYSTEM_OUT
PatternLayout:
pattern: "[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n"

Loggers:

Root:
level: debug
AppenderRef:
- ref: Console_Appender

Logger:
- name: thing.pack.appender
level: debug
AppenderRef:
- ref: Console_Appender
level: error

0 comments on commit d884dc4

Please sign in to comment.