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.