Я следовал этому руководству , чтобы развернуть пример приложения в 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?Все еще озадачен, почему это не проблема при локальном запуске приложения.