【问题标题】:com.mongodb.MongoSocketReadException: Prematurely reached end of stream with mongodb-driver-core-4.4.0com.mongodb.MongoSocketReadException:使用 mongodb-driver-core-4.4.0 提前到达流的末尾
【发布时间】:2022-01-31 06:35:32
【问题描述】:

我正在尝试将 spring boot 升级到 2.6.2,它内置了 mongodb-driver-core-4.4.0 jar。它无法连接到 MongoDB,出现以下异常。我已经尝试了很多来解决问题,无法解决。也没有找到解决方案的文章。如果有人可以提供解决方案,那将有很大帮助。请帮助我

com.mongodb.MongoSocketReadException: Prematurely reached end of stream
    at com.mongodb.internal.connection.SocketStream.read(SocketStream.java:112) ~[mongodb-driver-core-4.4.0.jar:na]
    at com.mongodb.internal.connection.SocketStream.read(SocketStream.java:131) ~[mongodb-driver-core-4.4.0.jar:na]
    at com.mongodb.internal.connection.InternalStreamConnection.receiveResponseBuffers(InternalStreamConnection.java:718) ~[mongodb-driver-core-4.4.0.jar:na]
    at com.mongodb.internal.connection.InternalStreamConnection.receiveMessageWithAdditionalTimeout(InternalStreamConnection.java:576) ~[mongodb-driver-core-4.4.0.jar:na]
    at com.mongodb.internal.connection.InternalStreamConnection.receiveCommandMessageResponse(InternalStreamConnection.java:415) ~[mongodb-driver-core-4.4.0.jar:na]
    at com.mongodb.internal.connection.InternalStreamConnection.sendAndReceive(InternalStreamConnection.java:342) ~[mongodb-driver-core-4.4.0.jar:na]
    at com.mongodb.internal.connection.CommandHelper.sendAndReceive(CommandHelper.java:96) ~[mongodb-driver-core-4.4.0.jar:na]
    at com.mongodb.internal.connection.CommandHelper.executeCommand(CommandHelper.java:44) ~[mongodb-driver-core-4.4.0.jar:na]
    at com.mongodb.internal.connection.InternalStreamConnectionInitializer.initializeConnectionDescription(InternalStreamConnectionInitializer.java:131) ~[mongodb-driver-core-4.4.0.jar:na]
    at com.mongodb.internal.connection.InternalStreamConnectionInitializer.startHandshake(InternalStreamConnectionInitializer.java:73) ~[mongodb-driver-core-4.4.0.jar:na]
    at com.mongodb.internal.connection.InternalStreamConnection.open(InternalStreamConnection.java:182) ~[mongodb-driver-core-4.4.0.jar:na]
    at com.mongodb.internal.connection.DefaultServerMonitor$ServerMonitorRunnable.lookupServerDescription(DefaultServerMonitor.java:188) ~[mongodb-driver-core-4.4.0.jar:na]
    at com.mongodb.internal.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:152) ~[mongodb-driver-core-4.4.0.jar:na]
    at java.lang.Thread.run(Thread.java:748) [na:1.8.0_231]

2022-01-31 11:48:58.991  INFO 16080 --- [ org.mongodb.driver.cluster               : Exception in monitor thread while connecting to server 

com.mongodb.MongoSocketReadException: Exception receiving message

Java 代码

KeyStore keystore = KeyStore.getInstance("PKCS12");
            try (InputStream in = new ClassPathResource("mongodb.pkcs12").getInputStream()) {
                keystore.load(in, "password".toCharArray());
            } catch (IOException e) {
                e.printStackTrace();
            } catch (CertificateException e) {
                e.printStackTrace();
            }
            KeyManagerFactory keyManagerFactory = 

    KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
                 keyManagerFactory.init(keystore, "password".toCharArray());
    
                TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
                 trustManagerFactory.init(keystore);
    
                SSLContext sslContext = SSLContext.getInstance("TLS");
                sslContext.init(keyManagerFactory.getKeyManagers(), trustManagerFactory.getTrustManagers(), new SecureRandom());
         String conns = String.format("mongodb://username:password@hostname:port/databasename?ssl=true&authSource=admin&authMechanism=SCRAM-SHA-1&socketTimeoutMS=500000&connectTimeoutMS=500000&waitQueueTimeoutMS=3600000&serverSelectionTimeout=300000");
                    
                   MongoClientSettings.Builder mcsb = MongoClientSettings.builder();
                    MongoClientSettings mcs = mcsb
                            .applicationName("Sample-Service")
                            //.credential(mongoCredential)
                            .applyToSslSettings(sslb ->
                                    sslb.enabled(true)
                                            .invalidHostNameAllowed(true))
                            .applyConnectionString(new ConnectionString(conns))
                            .applyToSslSettings(builder -> {
                                builder.enabled(true);
                                builder.context(sslContext);
        
                            })
                            .applyToConnectionPoolSettings(builder ->
                                    builder.maxConnectionIdleTime(86400000, TimeUnit.MILLISECONDS))
                            .build();
        
                    MongoClient client = MongoClients.create(mcs);

【问题讨论】:

  • 尝试将 maxIdleTimeMS=60000 添加到 conns URI
  • 此错误的一个常见原因是当服务器配置为需要 TLS 时,未在客户端使用 TLS。检查服务器日志以查看它是否记录了有关连接的任何内容。
  • @R2D2 我已经尝试过 maxIdleTimeMS=60000 但它仍然给出了同样的异常
  • 您还可以检查负载均衡器中的超时、应用程序和服务器之间的防火墙,您可以将 maxIdleTimeMS 减小到更小的值...
  • @Joe,我在客户端使用了 TLS,但仍然失败并出现同样的异常

标签: mongodb spring-boot


【解决方案1】:

此问题通常发生在您的服务器由于超时而关闭连接,但您的应用程序尚未意识到时,解决方案是添加如果缺少 maxIdleTimeMS,以便应用程序在服务器识别连接之前在空闲时关闭连接必须关闭。 这对于释放服务器资源也很重要。

【讨论】:

    猜你喜欢
    • 2018-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-12
    相关资源
    最近更新 更多