Проблемы с подключением к уровню Mongo Atlas Free с использованием последней версии клиента mongo

У меня есть бесплатная учетная запись Mongo Atlas, которая содержит базу данных с одной коллекцией. Клиент только читает коллекции и извлекает строки, поэтому я создал учетную запись с доступом только для чтения. Эта учетная запись протестирована через графический интерфейс компаса и работает нормально.

Однако я сталкиваюсь с проблемами, когда пытаюсь подключиться через mongo java API.

Первый код:

MongoClient mongoClient = MongoClients.create(this.mongoURI);
MongoDatabase database = mongoClient.getDatabase(this.database);
MongoCollection<Document> collection = database.getCollection(this.collectionName);

Приведенный выше фрагмент кода работал нормально, пока я работал на своем локальном хосте (докеризированном mongodb).

Mongo Atlas предложил использовать следующий код для подключения:

mongodb+srv://dev2:<password>@cluster0-ldxfb.mongodb.net/test?retryWrites=true

(Для справки, пожалуйста, найдите журналы первого кода в конце вопроса.)

Мне никогда не удавалось правильно работать с этой строкой в ​​качестве значения this.mongoURI. Сервер никогда не отвечал данными, каждый вызов вызывал исключение.

После нескольких часов борьбы с этой проблемой я смог вернуть некоторые данные, используя этот подход:

Второй код:

MongoCredential credential = MongoCredential.createScramSha1Credential("dev2", "admin", "apass".toCharArray());
        MongoClientSettings settings = MongoClientSettings.builder()
                .credential(credential)
                .retryWrites(false)
                .applyToConnectionPoolSettings(builder ->
                        builder.maxConnectionIdleTime(60000, TimeUnit.MILLISECONDS))
                .applyToSslSettings(builder -> builder.enabled(true))
                .applyToClusterSettings(builder -> {
                    builder.hosts(Arrays.asList(
                            new ServerAddress("cluster0-shard-00-00-ldxfb.mongodb.net", 27017),
                            new ServerAddress("cluster0-shard-00-01-ldxfb.mongodb.net", 27017),
                            new ServerAddress("cluster0-shard-00-02-ldxfb.mongodb.net", 27017)
                    ));
                    builder.requiredReplicaSetName("Cluster0-shard-0");
                })
                .build();

        MongoClient mongoClient = MongoClients.create(settings);
        MongoDatabase database = mongoClient.getDatabase(this.database);
        MongoCollection<Document> collection = database.getCollection(this.collectionName);

Используя этот код, я могу получить данные, даже если время отклика составляет> 2 секунд.

Интересно, сталкивался ли кто-то еще с этой проблемой и сумел ли подключиться и получить данные с меньшим количеством кода.

Почему первый код не работает? Я знаю, что есть обходные пути, однако я хочу понять, почему код, который предлагает монго, не удался. ЖУРНАЛЫ

2019.04.02 10:17:01 INFO org.mongodb.driver.cluster Thread[nioEventLoopGroup-3-2,10,main]: Cluster created with settings {hosts=[127.0.0.1:27017], srvHost=cluster0-ldxfb.mongodb.net, mode=MULTIPLE, requiredClusterType=REPLICA_SET, serverSelectionTimeout='30000 ms', maxWaitQueueSize=500, requiredReplicaSetName='Cluster0-shard-0'}
2019.04.02 10:17:01 WARNING io.helidon.webserver.RequestRouting Thread[nioEventLoopGroup-3-2,10,main]: Default error handler: Unhandled exception encountered.
java.util.concurrent.ExecutionException: Unhandled 'cause' of this exception encountered.
    at io.helidon.webserver.RequestRouting$RoutedRequest.defaultHandler(RequestRouting.java:408)
    REMOVE SOME LINES
    at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:163)
    at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:644)
    at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:579)
    at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:496)
    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:458)
    at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:897)
    at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
    at java.base/java.lang.Thread.run(Thread.java:834)
Caused by: java.lang.NullPointerException
    at com.mongodb.internal.connection.BaseCluster.getDescription(BaseCluster.java:176)
    at com.mongodb.internal.connection.AbstractMultiServerCluster.getDescription(AbstractMultiServerCluster.java:53)
    at com.mongodb.client.internal.MongoClientDelegate.getConnectedClusterDescription(MongoClientDelegate.java:136)
    at com.mongodb.client.internal.MongoClientDelegate.createClientSession(MongoClientDelegate.java:94)
    at com.mongodb.client.internal.MongoClientDelegate$DelegateOperationExecutor.getClientSession(MongoClientDelegate.java:249)
    at com.mongodb.client.internal.MongoClientDelegate$DelegateOperationExecutor.execute(MongoClientDelegate.java:172)
    at com.mongodb.client.internal.MongoCollectionImpl.executeCount(MongoCollectionImpl.java:249)
    at com.mongodb.client.internal.MongoCollectionImpl.countDocuments(MongoCollectionImpl.java:218)
    at com.mongodb.client.internal.MongoCollectionImpl.countDocuments(MongoCollectionImpl.java:213)
    at io.lef.guides.se.rawina.Names.getMongoNameLastOrMiddle(Names.java:165)
    at io.lef.guides.se.rawina.Names.getNameLastOrMiddle(Names.java:221)
    at io.helidon.webserver.RequestRouting$RoutedRequest.next(RequestRouting.java:352)
    ... 29 more

person Captain Nemo    schedule 02.04.2019    source источник
comment
@ Нил Ланн, я не вижу правильного ответа в твоей ссылке. Пожалуйста, снова откройте.   -  person Captain Nemo    schedule 02.04.2019
comment
Я вижу очень четкий и правильный ответ, показывающий правильную структуру URI и методы для вызова соединения, а также примечания о поддерживаемых версиях драйверов. Я предлагаю вам следовать ему. Ваш настоящий вопрос показывает, что нет.   -  person Neil Lunn    schedule 02.04.2019
comment
@NeilLunn, когда я использую MongoClient mongoClient = MongoClients.create(mongodb+srv://dev2:[email protected]/db?retryWrites=true); Я получаю исключение. Я уже видел этот вопрос и попробовал предложенные решения. Я все еще получаю эту ошибку, поэтому ваше дублирование не решает мой вопрос. Пожалуйста, снова откройте.   -  person Captain Nemo    schedule 02.04.2019