Java Mongo驱动程序无意中连接到本地主机

时间:2020-06-25 08:14:05

标签: java mongodb mongodb-java

我下载了用于Java的mongo驱动程序(mongo-java-driver-3.12.4.jar),并将MongoClient连接到远程主机。

与远程主机的连接已成功建立。 但是除了这个预期的连接之外,我在日志中还显示错误消息,指示驱动程序尝试连接到没有mongo db的本地主机:

09:52:52,082 INFO  [org.mongodb.driver.cluster] (default task-1) Cluster created with settings {hosts=[127.0.0.1:27017], mode=SINGLE, requiredClusterType=UNKNOWN, serverSelectionTimeout='30000 ms', maxWaitQueueSize=500}
09:52:52,843 INFO  [org.mongodb.driver.cluster] (default task-1) Cluster created with settings {hosts=[remoteHost:27017], mode=SINGLE, requiredClusterType=UNKNOWN, serverSelectionTimeout='30000 ms', maxWaitQueueSize=500}
09:52:52,879 INFO  [org.mongodb.driver.cluster] (default task-1) Cluster description not yet available. Waiting for 30000 ms before timing out
09:52:53,159 INFO  [org.mongodb.driver.connection] (cluster-ClusterId{value='5ef457d443933341aa40d5f3', description='null'}-remoteHost:27017) Opened connection [connectionId{localValue:2, serverValue:373}] to remoteHost:27017
09:52:53,219 INFO  [org.mongodb.driver.cluster] (cluster-ClusterId{value='5ef457d443933341aa40d5f3', description='null'}-remoteHost:27017) Monitor thread successfully connected to server with description ServerDescription{address=remoteHost:27017, type=STANDALONE, state=CONNECTED, ok=true, version=ServerVersion{versionList=[3, 6, 18]}, minWireVersion=0, maxWireVersion=6, maxDocumentSize=16777216, logicalSessionTimeoutMinutes=30, roundTripTimeNanos=54329200}
09:52:53,707 INFO  [org.mongodb.driver.connection] (default task-1) Opened connection [connectionId{localValue:3, serverValue:374}] to remoteHost:27017
09:52:54,198 INFO  [org.mongodb.driver.cluster] (cluster-ClusterId{value='5ef457d443933341aa40d5f2', description='null'}-127.0.0.1:27017) Exception in monitor thread while connecting to server 127.0.0.1:27017: com.mongodb.MongoSocketOpenException: Exception opening socket
    at com.mongodb.internal.connection.SocketStream.open(SocketStream.java:70)
    at com.mongodb.internal.connection.InternalStreamConnection.open(InternalStreamConnection.java:128)
    at com.mongodb.internal.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:117)
    at java.lang.Thread.run(Unknown Source)
Caused by: java.net.ConnectException: Connection refused: connect
    at java.net.TwoStacksPlainSocketImpl.socketConnect(Native Method)
    at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source)
    at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source)
    at java.net.AbstractPlainSocketImpl.connect(Unknown Source)
    at java.net.PlainSocketImpl.connect(Unknown Source)
    at java.net.SocksSocketImpl.connect(Unknown Source)
    at java.net.Socket.connect(Unknown Source)
    at com.mongodb.internal.connection.SocketStreamHelper.initialize(SocketStreamHelper.java:64)
    at com.mongodb.internal.connection.SocketStream.initializeSocket(SocketStream.java:79)
    at com.mongodb.internal.connection.SocketStream.open(SocketStream.java:65)
    ... 3 more

我使用MongoClient(ServerAddress addr, MongoCredential credential, MongoClientOptions options)设置到远程主机的连接设置。我从来没有使用localhost或127.0.0.1。

驱动程序为何尝试连接到本地主机,更重要的是如何禁用此行为? :)

编辑: 这是我初始化MongoClient的方法:

{
    ...
    String connectionString = "mongodb://user:password@remoteHost:27017/";
    MongoClientURI clientURI = new MongoClientURI(connectionString);
    mongoClient = new MongoClient(createServerAddress(clientURI.getHosts().get(0)), clientURI.getCredentials(), addOptions(clientURI.getOptions()));
    MongoDatabase db = mongoClient.getDatabase(dbName);
    ...
}

private ServerAddress createServerAddress(String host) {
    if (host.contains(":")) {
        String[] parts = host.split(":");
        return new ServerAddress(parts[0], Integer.parseInt(parts[1]));
    } else {
        return new ServerAddress(host);
    }
}

private MongoClientOptions addOptions(MongoClientOptions options) {
    Builder builder = new Builder(options);

    File ksFile = new File(config.getKeystorePath()));
    char[] password = config.getKeystorePassword()).toCharArray();

    if (ksFile.exists()) {
        try {
            KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());

            try (FileInputStream fis = new FileInputStream(ksFile)) {
                ks.load(fis, password);
            }

            TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
            tmf.init(ks);

            SSLContext sslContext = SSLContext.getInstance("TLS");
            sslContext.init(null, tmf.getTrustManagers(), null);
            builder.sslEnabled(true);
            builder.sslContext(sslContext);
        } catch (Exception e) {
            logger.error("TLS initialization failed: ", e.getCause());
        }
    }
    return builder.build();
}

0 个答案:

没有答案