testcontainers-java
66 строк · 2.6 Кб
1package org.testcontainers.containers;
2
3import com.mongodb.ReadConcern;
4import com.mongodb.ReadPreference;
5import com.mongodb.TransactionOptions;
6import com.mongodb.WriteConcern;
7import com.mongodb.client.ClientSession;
8import com.mongodb.client.MongoClient;
9import com.mongodb.client.MongoClients;
10import com.mongodb.client.MongoCollection;
11import com.mongodb.client.TransactionBody;
12import org.bson.Document;
13
14import static org.assertj.core.api.Assertions.assertThat;
15
16public class AbstractMongo {
17
18protected void executeTx(MongoDBContainer mongoDBContainer) {
19final MongoClient mongoSyncClientBase = MongoClients.create(mongoDBContainer.getConnectionString());
20final MongoClient mongoSyncClient = MongoClients.create(mongoDBContainer.getReplicaSetUrl());
21mongoSyncClient
22.getDatabase("mydb1")
23.getCollection("foo")
24.withWriteConcern(WriteConcern.MAJORITY)
25.insertOne(new Document("abc", 0));
26mongoSyncClient
27.getDatabase("mydb2")
28.getCollection("bar")
29.withWriteConcern(WriteConcern.MAJORITY)
30.insertOne(new Document("xyz", 0));
31mongoSyncClientBase
32.getDatabase("mydb3")
33.getCollection("baz")
34.withWriteConcern(WriteConcern.MAJORITY)
35.insertOne(new Document("def", 0));
36
37final ClientSession clientSession = mongoSyncClient.startSession();
38final TransactionOptions txnOptions = TransactionOptions
39.builder()
40.readPreference(ReadPreference.primary())
41.readConcern(ReadConcern.LOCAL)
42.writeConcern(WriteConcern.MAJORITY)
43.build();
44
45final String trxResult = "Inserted into collections in different databases";
46
47TransactionBody<String> txnBody = () -> {
48final MongoCollection<Document> coll1 = mongoSyncClient.getDatabase("mydb1").getCollection("foo");
49final MongoCollection<Document> coll2 = mongoSyncClient.getDatabase("mydb2").getCollection("bar");
50
51coll1.insertOne(clientSession, new Document("abc", 1));
52coll2.insertOne(clientSession, new Document("xyz", 999));
53return trxResult;
54};
55
56try {
57final String trxResultActual = clientSession.withTransaction(txnBody, txnOptions);
58assertThat(trxResultActual).isEqualTo(trxResult);
59} catch (RuntimeException re) {
60throw new IllegalStateException(re.getMessage(), re);
61} finally {
62clientSession.close();
63mongoSyncClient.close();
64}
65}
66}
67