0

I am trying to create simple spring boot application with reactive mongodb reactive. My mongodb is running in the local and I am able to connect using GUI. I am using Mongo version 4.2. Not sure if I am missing something. I found similar question here but did not help. Below is my code.Any help is really appreciated.

Exception

Exception in monitor thread while connecting to server localhost:27071

com.mongodb.MongoSocketOpenException: Exception opening socket
at com.mongodb.internal.connection.AsynchronousSocketChannelStream$OpenCompletionHandler.failed(AsynchronousSocketChannelStream.java:124) ~[mongodb-driver-core-4.1.2.jar:na]
at java.base/sun.nio.ch.Invoker.invokeUnchecked(Invoker.java:129) ~[na:na]
at java.base/sun.nio.ch.UnixAsynchronousSocketChannelImpl.finishConnect(UnixAsynchronousSocketChannelImpl.java:285) ~[na:na]
at java.base/sun.nio.ch.UnixAsynchronousSocketChannelImpl.finish(UnixAsynchronousSocketChannelImpl.java:200) ~[na:na]
at java.base/sun.nio.ch.UnixAsynchronousSocketChannelImpl.onEvent(UnixAsynchronousSocketChannelImpl.java:215) ~[na:na]
at java.base/sun.nio.ch.KQueuePort$EventHandlerTask.run(KQueuePort.java:312) ~[na:na]
at java.base/sun.nio.ch.AsynchronousChannelGroupImpl$1.run(AsynchronousChannelGroupImpl.java:112) ~[na:na]
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130) ~[na:na]
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:630) ~[na:na]
at java.base/java.lang.Thread.run(Thread.java:832) ~[na:na]
Caused by: java.net.ConnectException: Connection refused
at java.base/sun.nio.ch.UnixAsynchronousSocketChannelImpl.checkConnect(Native Method) ~[na:na]
at java.base/sun.nio.ch.UnixAsynchronousSocketChannelImpl.finishConnect(UnixAsynchronousSocketChannelImpl.java:254) ~[na:na]
... 7 common frames omitted

Pom.xml

<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>

    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-mongodb-reactive</artifactId>
    </dependency>
    <dependency>
        <groupId>de.flapdoodle.embed</groupId>
        <artifactId>de.flapdoodle.embed.mongo</artifactId>
        <scope>test</scope>
    </dependency>

Reactive Mongo Config

import com.mongodb.ConnectionString;
import com.mongodb.MongoClientSettings;
import com.mongodb.ReadConcern;
import com.mongodb.ReadPreference;
import com.mongodb.WriteConcern;
import com.mongodb.reactivestreams.client.MongoClient;
import com.mongodb.reactivestreams.client.MongoClients;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.mongodb.core.ReactiveMongoTemplate;


@Configuration
public class ReactiveMongoConfig {

@Value("${spring.data.mongodb.uri}")
private String uri;

@Value("${spring.data.mongodb.database}")
private String database;


@Bean
public MongoClient reactiveMongoClient() {
    System.out.println("Creating mongo client  ");
    return MongoClients.create(createMongoClientSettings());
}

@Bean("reactiveMongoTemplate")
public ReactiveMongoTemplate reactiveMongoTemplate() {
    System.out.println("Creating mongo reactiveMongoTemplate  " + database);
    return new ReactiveMongoTemplate(reactiveMongoClient(), database);
}

private MongoClientSettings createMongoClientSettings() {
    System.out.println("Creating mongo client  " + uri);
    ConnectionString ConnectionString = new ConnectionString(uri);
    MongoClientSettings mongoClientSettings = MongoClientSettings.builder()
            .readConcern(ReadConcern.DEFAULT)
            .writeConcern(WriteConcern.MAJORITY)
            .readPreference(ReadPreference.primary())
            .applyConnectionString(ConnectionString)
            .build();
    return mongoClientSettings;
}
}

Application.properties

spring.data.mongodb.database=cam
spring.data.mongodb.uri=mongodb://localhost:27071

Application.java

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration;
import org.springframework.boot.autoconfigure.mongo.MongoReactiveAutoConfiguration;

@SpringBootApplication
@EnableAutoConfiguration(exclude={MongoReactiveAutoConfiguration.class, 
MongoAutoConfiguration.class})
public class TestApplication implements CommandLineRunner {

public static void main(String[] args) {
    SpringApplication.run(TestApplication.class, args);
}

@Autowired
TestService service;

@Override
public void run(String... args) throws Exception {
    System.out.println("Entering command line run method.");
    service.testService();
}
}

Service.java

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.ReactiveMongoTemplate;
import org.springframework.stereotype.Service;
import reactor.core.publisher.Mono;

@Service
public class TestService {

@Autowired
ReactiveMongoTemplate reactiveMongoTemplate;

public void testService() {
    Mono<Boolean> isExist = reactiveMongoTemplate.collectionExists("SourceSystemAccount");
    System.out.println("Mono boolean " + isExist);
    if (!isExist.block()) {
        reactiveMongoTemplate.createCollection("SourceSystemAccount");
    }
}
}
Harini
  • 105
  • 3
  • 13

1 Answers1

0

Is your port correct in the properties? If you are trying to use the default mongo port it should be 27017 and not 27071.

Or you can just use: spring.data.mongodb.uri=mongodb://localhost

you don't need to specify the port, because by using "mongodb://" spring already knows you want to use port 27017

MadTyrael
  • 125
  • 2
  • 13