【发布时间】: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