MongoDB的从Heroku的Java应用程序“没有SNI名义发送”错误

时间:2019-02-03 02:38:49

标签: mongodb heroku mongodb-java sni mongodb-atlas

我跟着this tutorial部署一个示例应用程序的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的驱动程序?任何帮助表示赞赏。

编辑:turned out客户端提到它希望连接到如TLS安全的一部分的服务器的名称SNI。而且似乎有一种方式来手动indicate the name in python driver。有什么办法可以从Java做到这一点?仍然不解本地运行应用程序时,为什么这不是一个问题。

1 个答案:

答案 0 :(得分:0)

我用来连接集群的代码是错误的。我遵循了docs的指示,并提到了这一点:

  

要连接到Atlas M0(免费层)集群,必须使用Java   版本8或更高版本,并使用支持以下内容的Java驱动程序版本   MongoDB 3.4。

因此,我在1.8文件中将Java版本更改为system.properties

java.runtime.version=1.8

先前已将其设置为1.7。我还收到了关于我使用的一种方法的弃用警告。因此,我再次遵循docs来使用最新的代码,它的工作就像一个魅力。

真正的收获是每次都参考官方文档:)