MongoDB "нет SNI-имя отправлено" ошибка из Java-приложения heroku - PullRequest
0 голосов
/ 03 февраля 2019

Я следовал этому руководству , чтобы развернуть пример приложения в Heroku.Я просто добавил приведенный ниже метод в класс MyResource и возвратил результат из него вместо "Hello World" из getIt() метода.Я подключаюсь к кластеру свободных уровней Atlas:

static String getMessage() {
        MongoClient mongoClient = new MongoClient(new MongoClientURI("mongodb://<USER>:<PASSWORD>@cluster0-shard-00-00-2lbue.mongodb.net:27017,cluster0-shard-00-01-2lbue.mongodb.net:27017,cluster0-shard-00-02-2lbue.mongodb.net:27017/test?ssl=true&replicaSet=Cluster0-shard-0&authSource=admin"));
        DB database = mongoClient.getDB("mastery");
        DBCollection collection = database.getCollection("summary");

        DBObject query = new BasicDBObject("_id", new ObjectId("5c563fa2645d6b444c018dcb"));
        DBCursor cursor = collection.find(query);

        return (String)cursor.one().get("message");
    }

Это драйвер, который я использую:

<dependency>
      <groupId>org.mongodb</groupId>
      <artifactId>mongodb-driver</artifactId>
      <version>3.9.1</version>
</dependency>

Это мой импорт:

import com.mongodb.*;

Приложение отлично работает из моей локальной системы.Но я сталкиваюсь с приведенной ниже ошибкой при развертывании приложения в Heroku и обращении к службе:

INFO: Exception in monitor thread while connecting to server cluster0-shard-00-01-2lbue.mongodb.net:27017
com.mongodb.MongoCommandException: Command failed with error 8000 (AtlasError): 'no SNI name sent, make sure using a MongoDB 3.4+ driver/shell.' on server cluster0-shard-00-01-2lbue.mongodb.net:27017. The full response is { "ok" : 0, "errmsg" : "no SNI name sent, make sure using a MongoDB 3.4+ driver/shell.", "code" : 8000, "codeName" : "AtlasError" }
at com.mongodb.internal.connection.ProtocolHelper.getCommandFailureException(ProtocolHelper.java:179)
at com.mongodb.internal.connection.InternalStreamConnection.receiveCommandMessageResponse(InternalStreamConnection.java:299)
at com.mongodb.internal.connection.InternalStreamConnection.sendAndReceive(InternalStreamConnection.java:255)
at com.mongodb.internal.connection.CommandHelper.sendAndReceive(CommandHelper.java:83)
at com.mongodb.internal.connection.CommandHelper.executeCommand(CommandHelper.java:33)
at com.mongodb.internal.connection.InternalStreamConnectionInitializer.initializeConnectionDescription(InternalStreamConnectionInitializer.java:106)
at com.mongodb.internal.connection.InternalStreamConnectionInitializer.initialize(InternalStreamConnectionInitializer.java:63)
at com.mongodb.internal.connection.InternalStreamConnection.open(InternalStreamConnection.java:127)
at com.mongodb.internal.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:117)
at java.lang.Thread.run(Thread.java:748)

Что это за имя SNI?Я могу понять, что водители могут выбрать его с моей машины, но не с машины Heroku.Но я не знаю, как решить эту проблему!Есть ли способ настроить Heroku для отображения имени SNI, когда драйвер запрашивает его?Можем ли мы получить это значение вручную где-нибудь из Heroku и напрямую передать его драйверам MongoDB?Любая помощь приветствуется.

РЕДАКТИРОВАТЬ: Оказалось , что клиент упоминает имя SNI сервера, к которому он хочет подключиться, как часть безопасности TLS.И, кажется, есть способ вручную указать имя в драйвере питона .Есть ли способ сделать это из Java?Все еще озадачен, почему это не проблема при локальном запуске приложения.

1 Ответ

0 голосов
/ 09 февраля 2019

Код, который я использовал для подключения к кластеру, оказался неверным.Я следовал указаниям docs и там упоминалось следующее:

Чтобы подключиться к кластеру Atlas M0 (Free Tier), вы должны использовать Java версии 8 или выше и использоватьВерсия драйвера Java, поддерживающая MongoDB 3.4.

Поэтому я изменил версию Java на 1.8 в system.properties файле:

java.runtime.version=1.8

Ранее было установлено значение 1.7,Я также получал предупреждение об устаревании одного из методов, которые я использовал.Поэтому я снова последовал за документами , чтобы использовать последний код, и он работал как чудо.

Реальный вывод здесь - ссылаться на официальные документы каждый раз:)

...