Ошибка при попытке запустить интеграционные тесты для ReplicaSet MongoDB.JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Ошибка при попытке запустить интеграционные тесты для ReplicaSet MongoDB.

Сообщение Anonymous »

Я использую тестовый контейнер для интеграционного тестирования. Однако при использовании в узлах ReplicaSet 3 тесты завершаются с ошибкой

DEBUG 18112 --- [ Test worker] org.mongodb.driver.connection : Пул соединений создан для mongod3:27019 с использованием параметров maxIdleTimeMS=0, minPoolSize=5, maxPoolSize=100, maxConnecting=2, waitQueueTimeoutMS=120000
2024-10-27T19:50:25.790+03:00 DEBUG 18112 --- [Тестовый работник] org.mongodb.driver.cluster: обновление описания кластера до {type=REPLICA_SET, server=[{address=mongod1:27017, type=UNKNOWN, state=CONNECTING}, {address=mongod2:27018, type=UNKNOWN , state=CONNECTING}, {address=mongod3:27019, type=UNKNOWN, state=CONNECTING}]
: ..... создано с настройками MongoClientSettings{readPreference=ReadPreference{name= PrimaryPreferred, hedgeOptions = null}, writeConcern = WriteConcern {w = большинство, wTimeout = null мс, журнал = null}, retryWrites = true, retryReads = true, readConcern = ReadConcern {level = null}, credential = MongoCredential {механизм = null, userName='root', source='admin', пароль=, engineProperties=}, TransportSettings=null, CommandListeners=[], codecRegistry=ProvidersCodecRegistry{codecProviders=[ValueCodecProvider{}, BsonValueCodecProvider{}, DBRefCodecProvider{}, DBObjectCodecProvider{} , DocumentCodecProvider{}, CollectionCodecProvider{}, IterableCodecProvider{}, MapCodecProvider{}, GeoJsonCodecProvider{}, GridFSFileCodecProvider{}, Jsr310CodecProvider{}, JsonObjectCodecProvider{}, BsonCodecProvider{}, EnumCodecProvider{}, com.mongodb.client.model.mql .ExpressionCodecProvider@4bfe83d, com.mongodb.Jep395RecordCodecProvider@5906ebfb, com.mongodb.KotlinCodecProvider@10fc1a22]}, loggerSettings=LoggerSettings{maxDocumentLength=1000}, ClusterSettings={hosts=[mongod1:27017, mongod2:2701 8, монгод3:27019] , srvServiceName=mongodb, mode=MULTIPLE, requireClusterType=REPLICA_SET, requireReplicaSetName='rs0', serverSelector='null', ClusterListeners='[]', serverSelectionTimeout='30000 мс', localThreshold='15 мс'}, SocketSettings=SocketSettings {connectTimeoutMS = 10000, readTimeoutMS = 0, getBufferSize = 0, proxySettings = ProxySettings {хост = null, порт = null, имя пользователя = null, пароль = null}}, heartbeatSocketSettings = SocketSettings {connectTimeoutMS = 10000, readTimeoutMS = 10000, getBufferSize = 0 , proxySettings=ProxySettings{хост=null, порт=null, имя пользователя=null, пароль=null}}, ConnectionPoolSettings=ConnectionPoolSettings{maxSize=100, minSize=5, maxWaitTimeMS=120000, maxConnectionLifeTimeMS=0, maxConnectionIdleTimeMS=0, MaintenanceInitialDelayMS=0 , MaintenanceFrequencyMS=60000, ConnectionPoolListeners=[], maxConnecting=2}, serverSettings=ServerSettings{heartbeatFrequencyMS=10000, minHeartbeatFrequencyMS=500, serverListeners='[]', serverMonitorListeners='[]'}, sslSettings=SslSettings{enabled=false, validHostNameAllowed=false, context=null}, applicationName='null', compressList=[], uuidRepresentation=UNSPECIFIED, serverApi=null, autoEncryptionSettings=null, dnsClient=null, inetAddressResolver=null, contextProvider=null
: Исключение в потоке монитора при подключении к серверу mongod3:27019

com.mongodb.MongoSocketOpenException: Исключение при открытии сокетаЯ запустил интеграционный тест, и кажется, что произошла попытка инициализировать данные соединения, указанные в application.yml и application-test.yml игнорируется.
Testcontainers создает монго, в котором есть только один узел, но это не работает.

Код: Выделить всё

….
@Transactional(readOnly = true)
public Flux findAll(int page, int size) {

Pageable pageable = PageRequest.of(page, size);
return accountRepository.findAllByIdNotNullOrderByIdAsc(pageable)
.map(this::mapToDto);
}
….

Код: Выделить всё

@ActiveProfiles("test")
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT,
classes = DemoApplication.class)
@Testcontainers
@AutoConfigureWebTestClient
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
class AccountControllerIntegrationTest {

@Autowired
private WebTestClient webTestClient;

@Autowired
private AccountRepository accountRepository;

@Container
static MongoDBContainer mongoDBContainer = new MongoDBContainer("mongo:4.4.2")
.withCommand("--replSet", "rs0")
.withExposedPorts(27017);

static{
mongoDBContainer.start();
}

@DynamicPropertySource
static void setProperties(DynamicPropertyRegistry registry) {

String replicaSetUrl = mongoDBContainer.getReplicaSetUrl();
System.out.println("MongoDB URL: " + replicaSetUrl);

String modifiedUrl = replicaSetUrl + "&readPreference=primary";
registry.add("spring.data.mongodb.uri", () ->  modifiedUrl);
}

@BeforeEach
void setUp() {
accountRepository.deleteAll().block();
}
…..

```java
@Primary
@Validated
@Data
@ConfigurationProperties(prefix = "mongodb.uri", ignoreUnknownFields = false)
public class MongoCustomProperties {

private SetMongoProperties set = new SetMongoProperties();

@Data
public static class SetMongoProperties {
String prefix = "mongodb://";
private String hostFirst = "localhost";
private String hostSecond = "localhost";
private String hostThird = "localhost";
private int portFirstInstance = 27017;
private int portSecondInstance = 27018;
private int portThirdInstance = 27019;
private String database = "accounts";
private String username = "root";
private String password = "root";
private String authenticationDatabase = "admin";
private String replicaSetName = "replicaSet";
private int maxPoolSize = 100;
private int minPoolSize = 5;
private boolean retryWrites = true;
private String writeAcknowledgement = "majority";           private String readPreference = "primaryPreferred";

Код: Выделить всё

@Configuration
@RequiredArgsConstructor
@EnableConfigurationProperties(MongoCustomProperties.class)
@EnableReactiveMongoRepositories(basePackages = "com.example.demo.repository")
public class MongoConfig extends AbstractReactiveMongoConfiguration {

private final MongoCustomProperties mongoProperties;

@Override
protected String getDatabaseName() {
return mongoProperties.getSet().getDatabase();
}

@Override
public com.mongodb.reactivestreams.client.MongoClient reactiveMongoClient() {

String mongoUri = mongoProperties.getSet().buildUri();

return com.mongodb.reactivestreams.client.MongoClients.create(mongoUri);
}

@Bean
public ReactiveMongoTemplate reactiveMongoTemplate() {
return new ReactiveMongoTemplate(reactiveMongoClient(), getDatabaseName());
}

@Bean
public ReactiveMongoTransactionManager transactionManager(ReactiveMongoDatabaseFactory factory) {
return new ReactiveMongoTransactionManager(factory);
}
}

application.yml

Код: Выделить всё

spring:
autoconfigure:
exclude:
- org.springframework.boot.autoconfigure.mongo.embedded.EmbeddedMongoAutoConfiguration
server:
port: 9080

mongodb:
uri:
set:
prefix: 'mongodb://'
host-first: mongod1
host-second: mongod2
host-third: mongod3
port-first-instance: 27017
port-second-instance: 27018
port-third-instance: 27019
database: accounts
username: root
password: root
authentication-database: admin
replicaSet-name: rs0
maxPoolSize: 100
minPoolSize: 5
retryWrites: true
writeAcknowledgement: majority
readPreference: primaryPreferred

application-test.yml

Код: Выделить всё

spring:
autoconfigure:
exclude:
- org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration
- org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration
- org.springframework.boot.autoconfigure.data.mongo.MongoReactiveDataAutoConfiguration
- org.springframework.boot.autoconfigure.data.mongo.MongoReactiveRepositoriesAutoConfiguration
- org.springframework.boot.autoconfigure.data.mongo.MongoRepositoriesAutoConfiguration

Я тоже использовал этот подход

Код: Выделить всё

    @Container
static MongoDBContainer mongoDBContainer1 = new MongoDBContainer(DockerImageName.parse("mongo:latest"))
.withCommand("--replSet", "rs0")
.withExposedPorts(27017);

@Container
static MongoDBContainer mongoDBContainer2 = new MongoDBContainer(DockerImageName.parse("mongo:latest"))
.withCommand("--replSet", "rs0")
.withExposedPorts(27018);

@Container
static MongoDBContainer mongoDBContainer3 = new MongoDBContainer(DockerImageName.parse("mongo:latest"))
.withCommand("--replSet", "rs0")
.withExposedPorts(27019);

static {
mongoDBContainer1.start();
mongoDBContainer2.start();
mongoDBContainer3.start();

try {
Thread.sleep(10000);
String initCommand = String.format("mongo --host %s --port %d --eval \"rs.initiate({_id: 'rs0', members: [{_id: 0, host: '%s:%d'}, {_id: 1, host: '%s:%d'}, {_id: 2, host: '%s:%d'}]})\"",
mongoDBContainer1.getHost(), mongoDBContainer1.getMappedPort(27017),
mongoDBContainer2.getHost(), mongoDBContainer2.getMappedPort(27018),
mongoDBContainer3.getHost(), mongoDBContainer3.getMappedPort(27019));

Runtime.getRuntime().exec(initCommand);
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
}
2024-10-27T20:24:52.649+03:00 INFO 9636 - - - [- локальный хост: 2624] org.mongodb.driver.cluster :Локальный хост сервера: 2629 больше не является членом набора реплик. Удаление кластера из представления клиента.
2024-10-27T20:24:52.651+03:00 ОТЛАДКА 9636 - - - [- локальный хост: 2624] org.mongodb.driver.connection: пул соединений закрыт для локального доступ: 2629
2024-10-27T20:24:52.653+03:00 INFO 9636 - - - [- локальный хост: 2624] org.mongodb.driver.cluster: Локальный хост сервера: 2624 больше не является членом набора реплик. Удаление кластера из представления клиента.
2024-10-27T20:24:52.654+03:00 INFO 9636 - - - [4961e6dbc:27017] org.mongodb.driver.cluster: Исключение в потоке мониторинга при подключении на сервер f914961e6dbc:27017

com.mongodb.MongoSocketException: пока неизвестно (f914961e6dbc)
У кого есть есть идеи, почему так происходит?
Может быть, у кого-то есть понимание, как это работает и что здесь нужно исправить?

Подробнее здесь: https://stackoverflow.com/questions/791 ... et-mongodb
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»