Unable to connect to mongoDB using connection String in apache camel

22 views Asked by At

I have written the below code and it works fine in my local machine.

import org.apache.camel.builder.RouteBuilder; 
import org.apache.camel.component.mongodb.MongoDbConstants; 
import org.apache.camel.model.dataformat.JsonLibrary; 
import org.springframework.stereotype.Component;

@Component 
public class MongoDBRoute extends RouteBuilder {

    @Override
    public void configure() throws Exception {
        rest("/data/{type}")
            .get()
            .produces("application/json")
            .to("direct:query");
    
        from("direct:query")
            .doTry()
                .setHeader(MongoDbConstants.CRITERIA)
                .simple("{ 'type': ${header.type} }")
                .setHeader(MongoDbConstants.FIELDS, constant("{ 'fieldName': 1 }"))
                .to("mongodb:myDb?database=mydb&collection=mycollection&operation=findOneByQuery") 
                .log("${body}")
            .endDoTry()
            .doCatch(Exception.class)
                .setHeader("CamelHttpResponseCode", constant(500))
                .setBody(constant("Internal Server Error: MongoDB connection failed"))
                    .end();
    }

}

But now I want to use a connection string which I am fetching from a vault, the database name and collection name too will be fetched from vault. What changes do I need to make?

I have tried this:

import org.apache.camel.builder.RouteBuilder; 
import org.apache.camel.component.mongodb.MongoDbConstants; 
import org.apache.camel.model.dataformat.JsonLibrary; 
import org.springframework.stereotype.Component; 
import org.springframework.vault.core.VaultTemplate;

@Component 
public class MongoDBRoute extends RouteBuilder {

    private final VaultTemplate vaultTemplate;

    public MongoDBRoute(VaultTemplate vaultTemplate) {
        this.vaultTemplate = vaultTemplate;
    }

    @Override
    public void configure() throws Exception {
        String connectionString = vaultTemplate.read("mongodb/staging/connectionString", String.class);
        String dbName = vaultTemplate.read("mongodb/staging/databaseName", String.class);
        String collectionName = vaultTemplate.read("mongodb/staging/collectionName", String.class);
    
        rest("/data/{type}")
            .get()
                .produces("application/json")
                .to("direct:query");
    
        from("direct:query")
            .doTry()
                .setHeader(MongoDbConstants.CRITERIA).simple("{ 'type': ${header.type} }")
                .setHeader(MongoDbConstants.FIELDS, constant("{ 'fieldName': 1 }"))
                .toF("mongodb:%s?database=%s&collection=%s&operation=findOneByQuery", connectionString, dbName, collectionName)
                .log("${body}")
            .doCatch(Exception.class)
                .setHeader("CamelHttpResponseCode", constant(500))
                .setBody(constant("Internal Server Error: MongoDB connection failed"))
                    .end();
    }
}

But I receive the error: com.mongodb.MongoTimeoutException: Timed out after 30000 ms while waiting to connect.

0

There are 0 answers