I'm trying to integrate document DB with java spring boot. I have setup SSH tunnel and port forwarding and established connection from command line to AWS Document DB and successfully able to insert data in db. I am trying to accomplish the connection from JAVA Spring boot. I have attached my configuration files below. The issue is when i do a crud API i get this error
org.mongodb.driver.cluster: No server chosen by WritableServerSelector from cluster description ClusterDescription{type=UNKNOWN, connectionMode=SINGLE, serverDescriptions=[ServerDescription{address=DocumentDB-25.ccouih7cdiv2.ap-northeast-1.docdb.amazonaws.com:27017, type=UNKNOWN, state=CONNECTING}]}. Waiting for 30000 ms before timing out Blockquote
Need your help on this. If you have any better working solution i would be happy to try it out if this is a dead end
package com.platform.assetmanagement.utils.config;
import com.mongodb.ConnectionString;
import com.mongodb.MongoClientSettings;
import com.mongodb.connection.SslSettings;
import com.mongodb.reactivestreams.client.MongoClient;
import com.mongodb.reactivestreams.client.MongoClients;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManagerFactory;
import javax.swing.plaf.PanelUI;
import java.io.FileInputStream;
import java.security.KeyStore;
@Configuration
public class DocumentDBConfig {
String template = "mongodb://%s:%s@%s/test?retryWrites=false&directConnection=true&ssl=true&tlsAllowInvalidHostnames=true&readpreference=%s";
String username = "*****";
String password = "*****";
String clusterEndpoint = "DocumentDB-25.ccouih7cdiv2.ap-northeast-1.docdb.amazonaws.com:27017";
String tunnel = "localhost:27017";
String readPreference = "secondaryPreferred";
public final String connectionString = String.format(template, username, password, clusterEndpoint, readPreference);
String truststore = "truststore.jks";
String truststorePassword = "changeit";
@Bean
public MongoClient mongoClient() {
try {
setSslProperties();
ConnectionString connectionString = new ConnectionString(this.connectionString);
// Load the keystore
KeyStore trustStore = KeyStore.getInstance("PKCS12");
trustStore.load(new FileInputStream("truststore.jks"), "changeit".toCharArray());
// Initialize trust manager factory
TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
trustManagerFactory.init(trustStore);
// Initialize SSL context
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, trustManagerFactory.getTrustManagers(), null);
// Configure SSL settings
MongoClientSettings settings = MongoClientSettings.builder()
.applyToSslSettings(builder -> {
builder.enabled(true);
builder.invalidHostNameAllowed(true);
builder.context(sslContext);
})
.applyConnectionString(connectionString)
.build();
return MongoClients.create(settings);
} catch (Exception e) {
// Handle exception
System.out.println(e.getLocalizedMessage());
return null;
}
}
private void setSslProperties() {
System.setProperty("javax.net.ssl.trustStore","truststore.jks" );
System.setProperty("javax.net.ssl.trustStorePassword", "changeit");
}
}
More info on error
reactor.core.Exceptions$ErrorCallbackNotImplemented:
org.springframework.dao.DataAccessResourceFailureException: Timed out after 30000 ms
while waiting for a server that matches WritableServerSelector. Client view of cluster
state is {type=UNKNOWN, servers=[{address=platform-docdb-2024-03-11-10-48-
25.ccouih7cdiv2.ap-northeast-1.docdb.amazonaws.com:27017, type=UNKNOWN,state=CONNECTING}]
Caused by: org.springframework.dao.DataAccessResourceFailureException: Timed out after
30000 ms while waiting for a server that matches WritableServerSelector. Client view of
cluster state is {type=UNKNOWN, servers=[{address=platform-docdb-2024-03-11-10-48-
25.ccouih7cdiv2.ap-northeast-1.docdb.amazonaws.com:27017, type=UNKNOWN,
state=CONNECTING}] at
org.springframework.data.mongodb.core.MongoExceptionTranslator.translateExceptionIfPossible(MongoExceptionTranslator.java:88) ~[spring-data-mongodb-4.2.2.jar:4.2.2]
at org.springframework.data.mongodb.core.ReactiveMongoTemplate.potentiallyConvertRuntimeException(ReactiveMongoTemplate.java:2762) ~[spring-data-mongodb-4.2.2.jar:4.2.2]
at org.springframework.data.mongodb.core.ReactiveMongoTemplate.lambda$translateException$98(ReactiveMongoTemplate.java:2745) ~[spring-data-mongodb-4.2.2.jar:4.2.2]
at reactor.core.publisher.Mono.lambda$onErrorMap$28(Mono.java:3799) ~[reactor-core-3.6.2.jar:3.6.2]
at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onError(FluxOnErrorResume.java:94) ~[reactor-core-3.6.2.jar:3.6.2]
at reactor.core.publisher.MonoFlatMap$FlatMapMain.secondError(MonoFlatMap.java:241) ~[reactor-core-3.6.2.jar:3.6.2]
at reactor.core.publisher.MonoFlatMap$FlatMapInner.onError(MonoFlatMap.java:315) ~[reactor-core-3.6.2.jar:3.6.2]
at reactor.core.publisher.FluxMap$MapSubscriber.onError(FluxMap.java:134) ~[reactor-core-3.6.2.jar:3.6.2]
at reactor.core.publisher.MonoNext$NextSubscriber.onError(MonoNext.java:93) ~[reactor-core-3.6.2.jar:3.6.2]
at reactor.core.publisher.FluxMap$MapSubscriber.onError(FluxMap.java:134) ~[reactor-core-3.6.2.jar:3.6.2]
at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onError(FluxOnErrorResume.java:106) ~[reactor-core-3.6.2.jar:3.6.2]
at reactor.core.publisher.Operators.error(Operators.java:198) ~[reactor-core-3.6.2.jar:3.6.2]
at reactor.core.publisher.MonoError.subscribe(MonoError.java:53) ~[reactor-core-3.6.2.jar:3.6.2]
at reactor.core.publisher.Mono.subscribe(Mono.java:4512) ~[reactor-core-3.6.2.jar:3.6.2]
at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onError(FluxOnErrorResume.java:103) ~[reactor-core-3.6.2.jar:3.6.2]
at reactor.core.publisher.MonoNext$NextSubscriber.onError(MonoNext.java:93) ~[reactor-core-3.6.2.jar:3.6.2]
at reactor.core.publisher.MonoNext$NextSubscriber.onError(MonoNext.java:93) ~[reactor-core-3.6.2.jar:3.6.2]
at reactor.core.publisher.MonoFlatMap$FlatMapMain.secondError(MonoFlatMap.java:241) ~[reactor-core-3.6.2.jar:3.6.2]
at reactor.core.publisher.MonoFlatMap$FlatMapInner.onError(MonoFlatMap.java:315) ~[reactor-core-3.6.2.jar:3.6.2]
at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onError(MonoPeekTerminal.java:258) ~[reactor-core-3.6.2.jar:3.6.2]
at reactor.core.publisher.MonoCreate$DefaultMonoSink.error(MonoCreate.java:205) ~[reactor-core-3.6.2.jar:3.6.2]
at com.mongodb.reactivestreams.client.internal.MongoOperationPublisher.lambda$sinkToCallback$33(MongoOperationPublisher.java:521) ~[mongodb-driver-reactivestreams-4.11.1.jar:na]
at com.mongodb.reactivestreams.client.internal.OperationExecutorImpl.lambda$execute$9(OperationExecutorImpl.java:126) ~[mongodb-driver-reactivestreams-4.11.1.jar:na]
at com.mongodb.internal.async.ErrorHandlingResultCallback.onResult(ErrorHandlingResultCallback.java:47) ~[mongodb-driver-core-4.11.1.jar:na]
at com.mongodb.internal.operation.AsyncOperationHelper.lambda$exceptionTransformingCallback$16(AsyncOperationHelper.java:331) ~[mongodb-driver-core-4.11.1.jar:na]
at com.mongodb.internal.async.function.AsyncCallbackSupplier.lambda$whenComplete$1(AsyncCallbackSupplier.java:97) ~[mongodb-driver-core-4.11.1.jar:na]
at com.mongodb.internal.async.function.RetryingAsyncCallbackSupplier$RetryingCallback.onResult(RetryingAsyncCallbackSupplier.java:111) ~[mongodb-driver-core-4.11.1.jar:na]
at com.mongodb.internal.async.ErrorHandlingResultCallback.onResult(ErrorHandlingResultCallback.java:47) ~[mongodb-driver-core-4.11.1.jar:na]
at com.mongodb.internal.operation.AsyncOperationHelper.lambda$withAsyncSuppliedResource$3(AsyncOperationHelper.java:130) ~[mongodb-driver-core-4.11.1.jar:na]
at com.mongodb.reactivestreams.client.internal.ClientSessionBinding$WrappingCallback.onResult(ClientSessionBinding.java:295) ~[mongodb-driver-reactivestreams-4.11.1.jar:na]
at com.mongodb.reactivestreams.client.internal.ClientSessionBinding$WrappingCallback.onResult(ClientSessionBinding.java:285) ~[mongodb-driver-reactivestreams-4.11.1.jar:na]
at com.mongodb.internal.binding.AsyncClusterBinding.lambda$getAsyncClusterBindingConnectionSource$1(AsyncClusterBinding.java:153) ~[mongodb-driver-core-4.11.1.jar:na]
at com.mongodb.internal.connection.BaseCluster$ServerSelectionRequest.onResult(BaseCluster.java:405) ~[mongodb-driver-core-4.11.1.jar:na]
at com.mongodb.internal.connection.BaseCluster.handleServerSelectionRequest(BaseCluster.java:275) ~[mongodb-driver-core-4.11.1.jar:na]
at com.mongodb.internal.connection.BaseCluster.access$700(BaseCluster.java:69) ~[mongodb-driver-core-4.11.1.jar:na]
at com.mongodb.internal.connection.BaseCluster$WaitQueueHandler.run(BaseCluster.java:455) ~[mongodb-driver-core-4.11.1.jar:na]
at java.base/java.lang.Thread.run(Thread.java:840) ~[na:na]
Caused by: com.mongodb.MongoTimeoutException: Timed out after 30000 ms while waiting for a server that matches WritableServerSelector. Client view of cluster state is {type=UNKNOWN, servers=[{address=platform-docdb-2024-03-11-10-48-25.ccouih7cdiv2.ap-northeast-1.docdb.amazonaws.com:27017, type=UNKNOWN, state=CONNECTING}]
at com.mongodb.internal.connection.BaseCluster.createTimeoutException(BaseCluster.java:380) ~[mongodb-driver-core-4.11.1.jar:na]
... 4 common frames omitted
2024-03-13T21:59:52.335+05:30 INFO 163587 --- [onaws.com:27017] org.mongodb.driver.cluster : Exception in monitor thread while connecting to server platform-docdb-2024-03-11-10-48-25.ccouih7cdiv2.ap-northeast-1.docdb.amazonaws.com:27017
com.mongodb.MongoSocketOpenException: Exception opening socket
at com.mongodb.connection.TlsChannelStreamFactoryFactory$TlsChannelStream.lambda$openAsync$0(TlsChannelStreamFactoryFactory.java:251) ~[mongodb-driver-core-4.11.1.jar:na]
at com.mongodb.connection.TlsChannelStreamFactoryFactory$SelectorMonitor.lambda$start$0(TlsChannelStreamFactoryFactory.java:145) ~[mongodb-driver-core-4.11.1.jar:na]
at java.base/java.lang.Thread.run(Thread.java:840) ~[na:na]
Caused by: java.net.ConnectException: Connection timed out
at java.base/sun.nio.ch.Net.pollConnect(Native Method) ~[na:na]
at java.base/sun.nio.ch.Net.pollConnectNow(Net.java:672) ~[na:na]
at java.base/sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:946) ~[na:na]
at com.mongodb.connection.TlsChannelStreamFactoryFactory$TlsChannelStream.lambda$openAsync$0(TlsChannelStreamFactoryFactory.java:223) ~[mongodb-driver-core-4.11.1.jar:na]
... 2 common frames omitted