Satish Patro
Satish Patro

Reputation: 4404

how to give mongodb socketkeepalive in spring boot application?

In spring boot if we want to connect to mongodb, we can create a configuration file for mongodb or writing datasource in application.properties

I am following the second way

For me, I am gettint this error

"Timeout while receiving message; nested exception is com.mongodb.MongoSocketReadTimeoutException: Timeout while receiving message

.

spring.data.mongodb.uri = mongodb://mongodb0.example.com:27017/admin

I am gettint this error If I am not using my app for 6/7 hours and after that If I try to hit any controller to retrieve data from Mongodb. After 1/2 try I am able to get

Question - Is it the normal behavior of mongodb? So, in my case it is closing the socket after some particular hours

I read some blogs where it was written you can give socket-keep-alive, so the connection pool will not close

In spring boot mongodb connection, we can pass options in uri like

spring.data.mongodb.uri = mongodb://mongodb0.example.com:27017/admin/?replicaSet=test&connectTimeoutMS=300000

So, I want to give socket-keep-alive options for spring.data.mongodb.uri like replicaset here.

I searched the official site, but can't able to find any

Upvotes: 0

Views: 8603

Answers (2)

Kaj
Kaj

Reputation: 2503

You can achieve this by providing a MongoClientOptions bean. Spring Data's MongoAutoConfiguration will pick this MongoClientOptions bean up and use it further on:

@Bean
public MongoClientOptions mongoClientOptions() {
    return MongoClientOptions.builder()
            .socketKeepAlive(true)
            .build();
}

Also note that the socket-keep-alive option is deprecated (and defaulted to true) since mongo-driver version 3.5 (used by spring-data since version 2.0.0 of spring-data-mongodb)

Upvotes: 3

charlycou
charlycou

Reputation: 1998

You can achieve to pass this option using MongoClientOptionsFactoryBean.

public MongoClientOptions mongoClientOptions() {
    try {
        final MongoClientOptionsFactoryBean bean = new MongoClientOptionsFactoryBean();
        bean.setSocketKeepAlive(true);
        bean.afterPropertiesSet();
        return bean.getObject();
    } catch (final Exception e) {
        throw new BeanCreationException(e.getMessage(), e);
    }
}

Here an example of this configuration by extending AbstractMongoConfiguration:

@Configuration
public class DataportalApplicationConfig extends AbstractMongoConfiguration {

    //@Value: inject property values into components
    @Value("${spring.data.mongodb.uri}")
    private String uri;
    @Value("${spring.data.mongodb.database}")
    private String database;

    /**
     * Configure the MongoClient with the uri
     *
     * @return MongoClient.class
     */
    @Override
    public MongoClient mongoClient() {
        return new MongoClient(new MongoClientURI(uri,mongoClientOptions().builder()));
    }

Upvotes: 2

Related Questions