This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/master by this push: new e4c4d0e CAMEL-15792 + camel-couchbase polishing (#4613) e4c4d0e is described below commit e4c4d0e101f9a6677c4999dcc9560f16d6b88f94 Author: Matej Melko <6814482+mme...@users.noreply.github.com> AuthorDate: Mon Nov 16 22:24:56 2020 +0100 CAMEL-15792 + camel-couchbase polishing (#4613) * CAMEL-15792: Migrate camel-couchbase integration tests to use testcontainers * camel-couchbase: Add switch to consumer to return either full document or view result add connectTimeout --- .../apache/camel/catalog/components/couchbase.json | 2 + .../camel/catalog/docs/couchbase-component.adoc | 4 +- components/camel-couchbase/pom.xml | 64 +++++++++++++ .../couchbase/CouchbaseEndpointConfigurer.java | 12 +++ .../couchbase/CouchbaseEndpointUriFactory.java | 38 ++++---- .../camel/component/couchbase/couchbase.json | 2 + .../src/main/docs/couchbase-component.adoc | 4 +- .../component/couchbase/CouchbaseConstants.java | 3 +- .../component/couchbase/CouchbaseConsumer.java | 13 ++- .../component/couchbase/CouchbaseEndpoint.java | 38 +++++++- ...Test.java => ConsumeMessagesWithLimitTest.java} | 21 ++-- .../component/couchbase/CouchbaseEndpointTest.java | 21 +++- .../couchbase/CouchbaseIntegrationTestBase.java | 72 ++++++++++++++ .../couchbase/ProduceMessagesSimpleTest.java | 13 ++- ...est.java => ProduceMessagesWithAutoIDTest.java} | 8 +- ...ntegrationTest.java => RemoveMessagesTest.java} | 23 +++-- .../dsl/CouchbaseEndpointBuilderFactory.java | 106 +++++++++++++++++++++ .../modules/ROOT/pages/couchbase-component.adoc | 4 +- 18 files changed, 386 insertions(+), 62 deletions(-) diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/couchbase.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/couchbase.json index 39b3e9d..c655efe 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/couchbase.json +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/couchbase.json @@ -38,6 +38,7 @@ "consumerProcessedStrategy": { "kind": "parameter", "displayName": "Consumer Processed Strategy", "group": "consumer", "label": "consumer", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "none", "description": "Define the consumer Processed strategy to use" }, "descending": { "kind": "parameter", "displayName": "Descending", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Define if this operation is descending or not" }, "designDocumentName": { "kind": "parameter", "displayName": "Design Document Name", "group": "consumer", "label": "consumer", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "beer", "description": "The design document name to use" }, + "fullDocument": { "kind": "parameter", "displayName": "Full Document", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "If true consumer will return complete document instead data defined in view" }, "limit": { "kind": "parameter", "displayName": "Limit", "group": "consumer", "label": "consumer", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "defaultValue": -1, "description": "The output limit to use" }, "rangeEndKey": { "kind": "parameter", "displayName": "Range End Key", "group": "consumer", "label": "consumer", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Define a range for the end key" }, "rangeStartKey": { "kind": "parameter", "displayName": "Range Start Key", "group": "consumer", "label": "consumer", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Define a range for the start key" }, @@ -56,6 +57,7 @@ "replicateTo": { "kind": "parameter", "displayName": "Replicate To", "group": "producer", "label": "producer", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 0, "description": "Where to replicate the data" }, "startingIdForInsertsFrom": { "kind": "parameter", "displayName": "Starting Id For Inserts From", "group": "producer", "label": "producer", "required": false, "type": "integer", "javaType": "long", "deprecated": false, "autowired": false, "secret": false, "description": "Define the starting Id where we are doing an insert operation" }, "additionalHosts": { "kind": "parameter", "displayName": "Additional Hosts", "group": "advanced", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The additional hosts" }, + "connectTimeout": { "kind": "parameter", "displayName": "Connect Timeout", "group": "advanced", "label": "advanced", "required": false, "type": "duration", "javaType": "long", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "2500", "description": "Define the timeoutconnect in milliseconds" }, "queryTimeout": { "kind": "parameter", "displayName": "Query Timeout", "group": "advanced", "label": "advanced", "required": false, "type": "duration", "javaType": "long", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "2500", "description": "Define the operation timeout in milliseconds" }, "synchronous": { "kind": "parameter", "displayName": "Synchronous", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported)." }, "backoffErrorThreshold": { "kind": "parameter", "displayName": "Backoff Error Threshold", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "description": "The number of subsequent error polls (failed due some error) that should happen before the backoffMultipler should kick-in." }, diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/couchbase-component.adoc b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/couchbase-component.adoc index fb752bf..d4b2054 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/couchbase-component.adoc +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/couchbase-component.adoc @@ -73,7 +73,7 @@ with the following path and query parameters: |=== -=== Query Parameters (44 parameters): +=== Query Parameters (46 parameters): [width="100%",cols="2,5,^1,2",options="header"] @@ -87,6 +87,7 @@ with the following path and query parameters: | *consumerProcessedStrategy* (consumer) | Define the consumer Processed strategy to use | none | String | *descending* (consumer) | Define if this operation is descending or not | false | boolean | *designDocumentName* (consumer) | The design document name to use | beer | String +| *fullDocument* (consumer) | If true consumer will return complete document instead data defined in view | false | boolean | *limit* (consumer) | The output limit to use | -1 | int | *rangeEndKey* (consumer) | Define a range for the end key | | String | *rangeStartKey* (consumer) | Define a range for the start key | | String @@ -105,6 +106,7 @@ with the following path and query parameters: | *replicateTo* (producer) | Where to replicate the data | 0 | int | *startingIdForInsertsFrom* (producer) | Define the starting Id where we are doing an insert operation | | long | *additionalHosts* (advanced) | The additional hosts | | String +| *connectTimeout* (advanced) | Define the timeoutconnect in milliseconds | 2500 | long | *queryTimeout* (advanced) | Define the operation timeout in milliseconds | 2500 | long | *synchronous* (advanced) | Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported). | false | boolean | *backoffErrorThreshold* (scheduler) | The number of subsequent error polls (failed due some error) that should happen before the backoffMultipler should kick-in. | | int diff --git a/components/camel-couchbase/pom.xml b/components/camel-couchbase/pom.xml index 109800f..eb228d2 100644 --- a/components/camel-couchbase/pom.xml +++ b/components/camel-couchbase/pom.xml @@ -70,6 +70,70 @@ <scope>test</scope> </dependency> + <!-- test infra --> + <dependency> + <groupId>org.apache.camel</groupId> + <artifactId>camel-test-infra-common</artifactId> + <version>${project.version}</version> + <type>test-jar</type> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.apache.camel</groupId> + <artifactId>camel-test-infra-couchbase</artifactId> + <version>${project.version}</version> + <type>test-jar</type> + <scope>test</scope> + </dependency> + </dependencies> + <profiles> + <!-- activate test if the docker socket file is accessible --> + <profile> + <id>couchbase-tests-docker-file</id> + <activation> + <file> + <exists>/var/run/docker.sock</exists> + </file> + </activation> + <build> + <plugins> + <plugin> + <artifactId>maven-surefire-plugin</artifactId> + <configuration> + <skipTests>${skipTests}</skipTests> + <forkCount>1</forkCount> + <systemPropertyVariables> + <visibleassertions.silence>true</visibleassertions.silence> + </systemPropertyVariables> + </configuration> + </plugin> + </plugins> + </build> + </profile> + <!-- activate test if the DOCKER_HOST env var is set --> + <profile> + <id>couchbase-tests-docker-env</id> + <activation> + <property> + <name>env.DOCKER_HOST</name> + </property> + </activation> + <build> + <plugins> + <plugin> + <artifactId>maven-surefire-plugin</artifactId> + <configuration> + <skipTests>${skipTests}</skipTests> + <forkCount>1</forkCount> + <systemPropertyVariables> + <visibleassertions.silence>true</visibleassertions.silence> + </systemPropertyVariables> + </configuration> + </plugin> + </plugins> + </build> + </profile> + </profiles> </project> diff --git a/components/camel-couchbase/src/generated/java/org/apache/camel/component/couchbase/CouchbaseEndpointConfigurer.java b/components/camel-couchbase/src/generated/java/org/apache/camel/component/couchbase/CouchbaseEndpointConfigurer.java index d3aa0ea..05114fe 100644 --- a/components/camel-couchbase/src/generated/java/org/apache/camel/component/couchbase/CouchbaseEndpointConfigurer.java +++ b/components/camel-couchbase/src/generated/java/org/apache/camel/component/couchbase/CouchbaseEndpointConfigurer.java @@ -35,6 +35,8 @@ public class CouchbaseEndpointConfigurer extends PropertyConfigurerSupport imple case "bridgeErrorHandler": target.setBridgeErrorHandler(property(camelContext, boolean.class, value)); return true; case "bucket": target.setBucket(property(camelContext, java.lang.String.class, value)); return true; case "collection": target.setCollection(property(camelContext, java.lang.String.class, value)); return true; + case "connecttimeout": + case "connectTimeout": target.setConnectTimeout(property(camelContext, java.time.Duration.class, value).toMillis()); return true; case "consumerprocessedstrategy": case "consumerProcessedStrategy": target.setConsumerProcessedStrategy(property(camelContext, java.lang.String.class, value)); return true; case "delay": target.setDelay(property(camelContext, long.class, value)); return true; @@ -45,6 +47,8 @@ public class CouchbaseEndpointConfigurer extends PropertyConfigurerSupport imple case "exceptionHandler": target.setExceptionHandler(property(camelContext, org.apache.camel.spi.ExceptionHandler.class, value)); return true; case "exchangepattern": case "exchangePattern": target.setExchangePattern(property(camelContext, org.apache.camel.ExchangePattern.class, value)); return true; + case "fulldocument": + case "fullDocument": target.setFullDocument(property(camelContext, boolean.class, value)); return true; case "greedy": target.setGreedy(property(camelContext, boolean.class, value)); return true; case "initialdelay": case "initialDelay": target.setInitialDelay(property(camelContext, long.class, value)); return true; @@ -116,6 +120,8 @@ public class CouchbaseEndpointConfigurer extends PropertyConfigurerSupport imple case "bridgeErrorHandler": return boolean.class; case "bucket": return java.lang.String.class; case "collection": return java.lang.String.class; + case "connecttimeout": + case "connectTimeout": return long.class; case "consumerprocessedstrategy": case "consumerProcessedStrategy": return java.lang.String.class; case "delay": return long.class; @@ -126,6 +132,8 @@ public class CouchbaseEndpointConfigurer extends PropertyConfigurerSupport imple case "exceptionHandler": return org.apache.camel.spi.ExceptionHandler.class; case "exchangepattern": case "exchangePattern": return org.apache.camel.ExchangePattern.class; + case "fulldocument": + case "fullDocument": return boolean.class; case "greedy": return boolean.class; case "initialdelay": case "initialDelay": return long.class; @@ -198,6 +206,8 @@ public class CouchbaseEndpointConfigurer extends PropertyConfigurerSupport imple case "bridgeErrorHandler": return target.isBridgeErrorHandler(); case "bucket": return target.getBucket(); case "collection": return target.getCollection(); + case "connecttimeout": + case "connectTimeout": return target.getConnectTimeout(); case "consumerprocessedstrategy": case "consumerProcessedStrategy": return target.getConsumerProcessedStrategy(); case "delay": return target.getDelay(); @@ -208,6 +218,8 @@ public class CouchbaseEndpointConfigurer extends PropertyConfigurerSupport imple case "exceptionHandler": return target.getExceptionHandler(); case "exchangepattern": case "exchangePattern": return target.getExchangePattern(); + case "fulldocument": + case "fullDocument": return target.isFullDocument(); case "greedy": return target.isGreedy(); case "initialdelay": case "initialDelay": return target.getInitialDelay(); diff --git a/components/camel-couchbase/src/generated/java/org/apache/camel/component/couchbase/CouchbaseEndpointUriFactory.java b/components/camel-couchbase/src/generated/java/org/apache/camel/component/couchbase/CouchbaseEndpointUriFactory.java index 7188a04..5ef1684 100644 --- a/components/camel-couchbase/src/generated/java/org/apache/camel/component/couchbase/CouchbaseEndpointUriFactory.java +++ b/components/camel-couchbase/src/generated/java/org/apache/camel/component/couchbase/CouchbaseEndpointUriFactory.java @@ -20,38 +20,24 @@ public class CouchbaseEndpointUriFactory extends org.apache.camel.support.compon private static final Set<String> PROPERTY_NAMES; private static final Set<String> SECRET_PROPERTY_NAMES; static { - Set<String> props = new HashSet<>(47); - props.add("backoffMultiplier"); - props.add("queryTimeout"); + Set<String> props = new HashSet<>(49); props.add("consumerProcessedStrategy"); props.add("synchronous"); - props.add("skip"); props.add("initialDelay"); props.add("descending"); - props.add("scheduler"); props.add("protocol"); props.add("hostname"); props.add("password"); props.add("bridgeErrorHandler"); - props.add("useFixedDelay"); props.add("viewName"); - props.add("additionalHosts"); - props.add("runLoggingLevel"); - props.add("backoffErrorThreshold"); - props.add("scope"); + props.add("fullDocument"); props.add("limit"); + props.add("connectTimeout"); props.add("greedy"); props.add("scheduledExecutorService"); - props.add("rangeEndKey"); - props.add("key"); props.add("repeatCount"); - props.add("timeUnit"); props.add("sendEmptyMessageWhenIdle"); - props.add("autoStartIdForInserts"); - props.add("persistTo"); - props.add("producerRetryPause"); props.add("schedulerProperties"); - props.add("exchangePattern"); props.add("rangeStartKey"); props.add("collection"); props.add("designDocumentName"); @@ -61,11 +47,27 @@ public class CouchbaseEndpointUriFactory extends org.apache.camel.support.compon props.add("bucket"); props.add("lazyStartProducer"); props.add("delay"); - props.add("pollStrategy"); props.add("port"); props.add("producerRetryAttempts"); props.add("startScheduler"); props.add("exceptionHandler"); + props.add("backoffMultiplier"); + props.add("queryTimeout"); + props.add("skip"); + props.add("scheduler"); + props.add("useFixedDelay"); + props.add("additionalHosts"); + props.add("runLoggingLevel"); + props.add("backoffErrorThreshold"); + props.add("scope"); + props.add("rangeEndKey"); + props.add("key"); + props.add("timeUnit"); + props.add("autoStartIdForInserts"); + props.add("persistTo"); + props.add("producerRetryPause"); + props.add("exchangePattern"); + props.add("pollStrategy"); props.add("operation"); props.add("username"); PROPERTY_NAMES = Collections.unmodifiableSet(props); diff --git a/components/camel-couchbase/src/generated/resources/org/apache/camel/component/couchbase/couchbase.json b/components/camel-couchbase/src/generated/resources/org/apache/camel/component/couchbase/couchbase.json index 39b3e9d..c655efe 100644 --- a/components/camel-couchbase/src/generated/resources/org/apache/camel/component/couchbase/couchbase.json +++ b/components/camel-couchbase/src/generated/resources/org/apache/camel/component/couchbase/couchbase.json @@ -38,6 +38,7 @@ "consumerProcessedStrategy": { "kind": "parameter", "displayName": "Consumer Processed Strategy", "group": "consumer", "label": "consumer", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "none", "description": "Define the consumer Processed strategy to use" }, "descending": { "kind": "parameter", "displayName": "Descending", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Define if this operation is descending or not" }, "designDocumentName": { "kind": "parameter", "displayName": "Design Document Name", "group": "consumer", "label": "consumer", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "beer", "description": "The design document name to use" }, + "fullDocument": { "kind": "parameter", "displayName": "Full Document", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "If true consumer will return complete document instead data defined in view" }, "limit": { "kind": "parameter", "displayName": "Limit", "group": "consumer", "label": "consumer", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "defaultValue": -1, "description": "The output limit to use" }, "rangeEndKey": { "kind": "parameter", "displayName": "Range End Key", "group": "consumer", "label": "consumer", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Define a range for the end key" }, "rangeStartKey": { "kind": "parameter", "displayName": "Range Start Key", "group": "consumer", "label": "consumer", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Define a range for the start key" }, @@ -56,6 +57,7 @@ "replicateTo": { "kind": "parameter", "displayName": "Replicate To", "group": "producer", "label": "producer", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 0, "description": "Where to replicate the data" }, "startingIdForInsertsFrom": { "kind": "parameter", "displayName": "Starting Id For Inserts From", "group": "producer", "label": "producer", "required": false, "type": "integer", "javaType": "long", "deprecated": false, "autowired": false, "secret": false, "description": "Define the starting Id where we are doing an insert operation" }, "additionalHosts": { "kind": "parameter", "displayName": "Additional Hosts", "group": "advanced", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The additional hosts" }, + "connectTimeout": { "kind": "parameter", "displayName": "Connect Timeout", "group": "advanced", "label": "advanced", "required": false, "type": "duration", "javaType": "long", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "2500", "description": "Define the timeoutconnect in milliseconds" }, "queryTimeout": { "kind": "parameter", "displayName": "Query Timeout", "group": "advanced", "label": "advanced", "required": false, "type": "duration", "javaType": "long", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "2500", "description": "Define the operation timeout in milliseconds" }, "synchronous": { "kind": "parameter", "displayName": "Synchronous", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported)." }, "backoffErrorThreshold": { "kind": "parameter", "displayName": "Backoff Error Threshold", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "description": "The number of subsequent error polls (failed due some error) that should happen before the backoffMultipler should kick-in." }, diff --git a/components/camel-couchbase/src/main/docs/couchbase-component.adoc b/components/camel-couchbase/src/main/docs/couchbase-component.adoc index fb752bf..d4b2054 100644 --- a/components/camel-couchbase/src/main/docs/couchbase-component.adoc +++ b/components/camel-couchbase/src/main/docs/couchbase-component.adoc @@ -73,7 +73,7 @@ with the following path and query parameters: |=== -=== Query Parameters (44 parameters): +=== Query Parameters (46 parameters): [width="100%",cols="2,5,^1,2",options="header"] @@ -87,6 +87,7 @@ with the following path and query parameters: | *consumerProcessedStrategy* (consumer) | Define the consumer Processed strategy to use | none | String | *descending* (consumer) | Define if this operation is descending or not | false | boolean | *designDocumentName* (consumer) | The design document name to use | beer | String +| *fullDocument* (consumer) | If true consumer will return complete document instead data defined in view | false | boolean | *limit* (consumer) | The output limit to use | -1 | int | *rangeEndKey* (consumer) | Define a range for the end key | | String | *rangeStartKey* (consumer) | Define a range for the start key | | String @@ -105,6 +106,7 @@ with the following path and query parameters: | *replicateTo* (producer) | Where to replicate the data | 0 | int | *startingIdForInsertsFrom* (producer) | Define the starting Id where we are doing an insert operation | | long | *additionalHosts* (advanced) | The additional hosts | | String +| *connectTimeout* (advanced) | Define the timeoutconnect in milliseconds | 2500 | long | *queryTimeout* (advanced) | Define the operation timeout in milliseconds | 2500 | long | *synchronous* (advanced) | Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported). | false | boolean | *backoffErrorThreshold* (scheduler) | The number of subsequent error polls (failed due some error) that should happen before the backoffMultipler should kick-in. | | int diff --git a/components/camel-couchbase/src/main/java/org/apache/camel/component/couchbase/CouchbaseConstants.java b/components/camel-couchbase/src/main/java/org/apache/camel/component/couchbase/CouchbaseConstants.java index 2bb0831..ce934e0 100644 --- a/components/camel-couchbase/src/main/java/org/apache/camel/component/couchbase/CouchbaseConstants.java +++ b/components/camel-couchbase/src/main/java/org/apache/camel/component/couchbase/CouchbaseConstants.java @@ -23,7 +23,7 @@ package org.apache.camel.component.couchbase; public interface CouchbaseConstants { String COUCHBASE_URI_ERROR - = "Invalid URI. Format must be of the form couchbase:http[s]://hostname[:port]?[options...]"; + = "Invalid URI. Format must be of the form couchbase:http[s]://hostname[:port]?bucket=[bucket][&options...]"; String COUCHBASE_PUT = "CCB_PUT"; String COUCHBASE_GET = "CCB_GET"; String COUCHBASE_DELETE = "CCB_DEL"; @@ -40,6 +40,7 @@ public interface CouchbaseConstants { int DEFAULT_COUCHBASE_PORT = 8091; int DEFAULT_TTL = 0; long DEFAULT_QUERY_TIMEOUT = 2500; + long DEFAULT_CONNECT_TIMEOUT = 30000; String DEFAULT_CONSUME_PROCESSED_STRATEGY = "none"; diff --git a/components/camel-couchbase/src/main/java/org/apache/camel/component/couchbase/CouchbaseConsumer.java b/components/camel-couchbase/src/main/java/org/apache/camel/component/couchbase/CouchbaseConsumer.java index 2f0481f..ab6d5fc 100644 --- a/components/camel-couchbase/src/main/java/org/apache/camel/component/couchbase/CouchbaseConsumer.java +++ b/components/camel-couchbase/src/main/java/org/apache/camel/component/couchbase/CouchbaseConsumer.java @@ -16,8 +16,7 @@ */ package org.apache.camel.component.couchbase; -import java.util.List; - +import com.couchbase.client.core.deps.com.fasterxml.jackson.databind.JsonNode; import com.couchbase.client.java.Bucket; import com.couchbase.client.java.Collection; import com.couchbase.client.java.Scope; @@ -119,11 +118,15 @@ public class CouchbaseConsumer extends DefaultScheduledPollConsumer { String consumerProcessedStrategy = endpoint.getConsumerProcessedStrategy(); for (ViewRow row : result.rows()) { - + Object doc; String id = row.id().get(); - Object doc = collection.get(id); + if (endpoint.isFullDocument()) { + doc = collection.get(id); + } else { + doc = row.valueAs(Object.class); + } - String key = (String) row.keyAs(List.class).get().get(0); + String key = row.keyAs(JsonNode.class).get().asText(); String designDocumentName = endpoint.getDesignDocumentName(); String viewName = endpoint.getViewName(); diff --git a/components/camel-couchbase/src/main/java/org/apache/camel/component/couchbase/CouchbaseEndpoint.java b/components/camel-couchbase/src/main/java/org/apache/camel/component/couchbase/CouchbaseEndpoint.java index 4477784..893cfd0 100644 --- a/components/camel-couchbase/src/main/java/org/apache/camel/component/couchbase/CouchbaseEndpoint.java +++ b/components/camel-couchbase/src/main/java/org/apache/camel/component/couchbase/CouchbaseEndpoint.java @@ -30,6 +30,7 @@ import com.couchbase.client.java.Bucket; import com.couchbase.client.java.Cluster; import com.couchbase.client.java.ClusterOptions; import com.couchbase.client.java.env.ClusterEnvironment; +import org.apache.camel.CamelException; import org.apache.camel.Category; import org.apache.camel.Consumer; import org.apache.camel.Processor; @@ -42,6 +43,7 @@ import org.apache.camel.support.ScheduledPollEndpoint; import static org.apache.camel.component.couchbase.CouchbaseConstants.COUCHBASE_PUT; import static org.apache.camel.component.couchbase.CouchbaseConstants.COUCHBASE_URI_ERROR; +import static org.apache.camel.component.couchbase.CouchbaseConstants.DEFAULT_CONNECT_TIMEOUT; import static org.apache.camel.component.couchbase.CouchbaseConstants.DEFAULT_CONSUME_PROCESSED_STRATEGY; import static org.apache.camel.component.couchbase.CouchbaseConstants.DEFAULT_COUCHBASE_PORT; import static org.apache.camel.component.couchbase.CouchbaseConstants.DEFAULT_DESIGN_DOCUMENT_NAME; @@ -124,6 +126,8 @@ public class CouchbaseEndpoint extends ScheduledPollEndpoint { private String rangeStartKey; @UriParam(label = "consumer") private String rangeEndKey = ""; + @UriParam(label = "consumer", defaultValue = "false") + private boolean fullDocument = true; // Consumer strategy @UriParam(label = "consumer", defaultValue = DEFAULT_CONSUME_PROCESSED_STRATEGY) @@ -133,6 +137,10 @@ public class CouchbaseEndpoint extends ScheduledPollEndpoint { @UriParam(label = "advanced", defaultValue = "2500", javaType = "java.time.Duration") private long queryTimeout = DEFAULT_QUERY_TIMEOUT; + // Connection fine tuning parameters + @UriParam(label = "advanced", defaultValue = "2500", javaType = "java.time.Duration") + private long connectTimeout = DEFAULT_CONNECT_TIMEOUT; + public CouchbaseEndpoint() { } @@ -433,6 +441,17 @@ public class CouchbaseEndpoint extends ScheduledPollEndpoint { this.rangeEndKey = rangeEndKey; } + public boolean isFullDocument() { + return fullDocument; + } + + /** + * If true consumer will return complete document instead data defined in view + */ + public void setFullDocument(boolean fullDocument) { + this.fullDocument = fullDocument; + } + public String getConsumerProcessedStrategy() { return consumerProcessedStrategy; } @@ -455,6 +474,17 @@ public class CouchbaseEndpoint extends ScheduledPollEndpoint { this.queryTimeout = queryTimeout; } + public long getConnectTimeout() { + return connectTimeout; + } + + /** + * Define the timeoutconnect in milliseconds + */ + public void setConnectTimeout(long connectTimeout) { + this.connectTimeout = connectTimeout; + } + public URI[] makeBootstrapURI() throws URISyntaxException { if (additionalHosts == null || "".equals(additionalHosts)) { @@ -492,9 +522,15 @@ public class CouchbaseEndpoint extends ScheduledPollEndpoint { List<URI> hosts = Arrays.asList(makeBootstrapURI()); String connectionString; + if (bucket == null || bucket.isEmpty()) { + throw new CamelException(COUCHBASE_URI_ERROR); + } + ClusterEnvironment.Builder cfb = ClusterEnvironment.builder(); if (queryTimeout != DEFAULT_QUERY_TIMEOUT) { - cfb.timeoutConfig().queryTimeout(Duration.ofMillis(queryTimeout)); + cfb.timeoutConfig() + .connectTimeout(Duration.ofMillis(connectTimeout)) + .queryTimeout(Duration.ofMillis(queryTimeout)); } ClusterEnvironment env = cfb.build(); diff --git a/components/camel-couchbase/src/test/java/org/apache/camel/component/couchbase/ConsumeBeerMessagesWithLimitIntegrationTest.java b/components/camel-couchbase/src/test/java/org/apache/camel/component/couchbase/ConsumeMessagesWithLimitTest.java similarity index 69% rename from components/camel-couchbase/src/test/java/org/apache/camel/component/couchbase/ConsumeBeerMessagesWithLimitIntegrationTest.java rename to components/camel-couchbase/src/test/java/org/apache/camel/component/couchbase/ConsumeMessagesWithLimitTest.java index 99a5c44..5b5b1bc 100644 --- a/components/camel-couchbase/src/test/java/org/apache/camel/component/couchbase/ConsumeBeerMessagesWithLimitIntegrationTest.java +++ b/components/camel-couchbase/src/test/java/org/apache/camel/component/couchbase/ConsumeMessagesWithLimitTest.java @@ -16,20 +16,30 @@ */ package org.apache.camel.component.couchbase; +import java.util.concurrent.TimeUnit; + import org.apache.camel.builder.RouteBuilder; import org.apache.camel.component.mock.MockEndpoint; -import org.apache.camel.test.junit5.CamelTestSupport; +import org.junit.After; import org.junit.jupiter.api.Test; -public class ConsumeBeerMessagesWithLimitIntegrationTest extends CamelTestSupport { +public class ConsumeMessagesWithLimitTest extends CouchbaseIntegrationTestBase { @Test public void testQueryForBeers() throws Exception { + for (int i = 0; i < 15; i++) { + cluster.bucket(bucketName).defaultCollection().upsert("DocumentID_" + i, "message" + i); + } MockEndpoint mock = getMockEndpoint("mock:result"); mock.expectedMessageCount(10); - assertMockEndpointsSatisfied(); + assertMockEndpointsSatisfied(30, TimeUnit.SECONDS); + + } + @After + public void cleanBucket() { + cluster.buckets().flushBucket(bucketName); } @Override @@ -37,9 +47,8 @@ public class ConsumeBeerMessagesWithLimitIntegrationTest extends CamelTestSuppor return new RouteBuilder() { @Override public void configure() throws Exception { - - // need couchbase installed on localhost with beer-sample data - from("couchbase:http://localhost/beer-sample?username=root&password=123456&designDocumentName=beer&viewName=brewery_beers&limit=10") + from(String.format("%s&designDocumentName=%s&viewName=%s&limit=10", getConnectionUri(), bucketName, bucketName)) + .log("message received") .to("mock:result"); } }; diff --git a/components/camel-couchbase/src/test/java/org/apache/camel/component/couchbase/CouchbaseEndpointTest.java b/components/camel-couchbase/src/test/java/org/apache/camel/component/couchbase/CouchbaseEndpointTest.java index 2d68579..cf2468b 100644 --- a/components/camel-couchbase/src/test/java/org/apache/camel/component/couchbase/CouchbaseEndpointTest.java +++ b/components/camel-couchbase/src/test/java/org/apache/camel/component/couchbase/CouchbaseEndpointTest.java @@ -16,7 +16,9 @@ */ package org.apache.camel.component.couchbase; -import com.couchbase.client.core.error.InvalidArgumentException; +import java.util.HashMap; +import java.util.Map; + import org.apache.camel.Processor; import org.junit.jupiter.api.Test; @@ -71,8 +73,12 @@ public class CouchbaseEndpointTest { @Test public void testCouchbaseEndpointCreateProducer() throws Exception { - assertThrows(InvalidArgumentException.class, - () -> new CouchbaseEndpoint("couchbase:localhost:80/bucket", new CouchbaseComponent()).createProducer()); + Map<String, Object> params = new HashMap<>(); + params.put("bucket", "bucket"); + assertThrows(IllegalArgumentException.class, + () -> new CouchbaseComponent() + .createEndpoint("couchbase:localhost:80/bucket", "couchbase:localhost:80/bucket", params) + .createProducer()); } @Test @@ -80,8 +86,13 @@ public class CouchbaseEndpointTest { Processor p = exchange -> { // Nothing to do }; - assertThrows(InvalidArgumentException.class, - () -> new CouchbaseEndpoint("couchbase:localhost:80/bucket", new CouchbaseComponent()).createConsumer(p)); + Map<String, Object> params = new HashMap<>(); + params.put("bucket", "bucket"); + + assertThrows(IllegalArgumentException.class, + () -> new CouchbaseComponent() + .createEndpoint("couchbase:localhost:80/bucket", "couchbase:localhost:80/bucket", params) + .createConsumer(p)); } @Test diff --git a/components/camel-couchbase/src/test/java/org/apache/camel/component/couchbase/CouchbaseIntegrationTestBase.java b/components/camel-couchbase/src/test/java/org/apache/camel/component/couchbase/CouchbaseIntegrationTestBase.java new file mode 100644 index 0000000..c0ecf38 --- /dev/null +++ b/components/camel-couchbase/src/test/java/org/apache/camel/component/couchbase/CouchbaseIntegrationTestBase.java @@ -0,0 +1,72 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.camel.component.couchbase; + +import java.util.Collections; + +import com.couchbase.client.java.Bucket; +import com.couchbase.client.java.Cluster; +import com.couchbase.client.java.manager.bucket.BucketSettings; +import com.couchbase.client.java.manager.bucket.BucketType; +import com.couchbase.client.java.manager.view.DesignDocument; +import com.couchbase.client.java.manager.view.View; +import com.couchbase.client.java.view.DesignDocumentNamespace; +import org.apache.camel.test.infra.common.TestUtils; +import org.apache.camel.test.infra.couchbase.services.CouchbaseService; +import org.apache.camel.test.infra.couchbase.services.CouchbaseServiceFactory; +import org.apache.camel.test.junit5.CamelTestSupport; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.extension.RegisterExtension; + +public class CouchbaseIntegrationTestBase extends CamelTestSupport { + @RegisterExtension + public static CouchbaseService service = CouchbaseServiceFactory.getService(); + + protected static String bucketName; + protected static Cluster cluster; + + @BeforeAll + static void setUpCouchbase() { + bucketName = "testBucket" + TestUtils.randomWithRange(0, 100); + cluster = Cluster.connect(service.getConnectionString(), service.getUsername(), service.getPassword()); + + cluster.buckets().createBucket( + BucketSettings.create(bucketName).bucketType(BucketType.COUCHBASE).flushEnabled(true)); + + Bucket bucket = cluster.bucket(bucketName); + DesignDocument designDoc = new DesignDocument( + bucketName, + Collections.singletonMap(bucketName, new View("function (doc, meta) { emit(meta.id, doc);}"))); + cluster.bucket(bucketName).viewIndexes().upsertDesignDocument(designDoc, DesignDocumentNamespace.PRODUCTION); + + } + + @AfterAll + public static void tearDownCouchbase() { + cluster.buckets().dropBucket(bucketName); + cluster.disconnect(); + service.shutdown(); + } + + public String getConnectionUri() { + return String.format("couchbase:http://%s:%d?bucket=%s&username=%s&password=%s", service.getHostname(), + service.getPort(), bucketName, service.getUsername(), service.getPassword()); + } + +} diff --git a/components/camel-couchbase/src/test/java/org/apache/camel/component/couchbase/ProduceMessagesSimpleTest.java b/components/camel-couchbase/src/test/java/org/apache/camel/component/couchbase/ProduceMessagesSimpleTest.java index e1424a3..03137e0 100644 --- a/components/camel-couchbase/src/test/java/org/apache/camel/component/couchbase/ProduceMessagesSimpleTest.java +++ b/components/camel-couchbase/src/test/java/org/apache/camel/component/couchbase/ProduceMessagesSimpleTest.java @@ -16,18 +16,17 @@ */ package org.apache.camel.component.couchbase; +import java.time.Duration; + import org.apache.camel.builder.RouteBuilder; import org.apache.camel.component.mock.MockEndpoint; -import org.apache.camel.test.junit5.CamelTestSupport; -import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; -public class ProduceMessagesSimpleTest extends CamelTestSupport { +public class ProduceMessagesSimpleTest extends CouchbaseIntegrationTestBase { - // Ignore test since build environment does not have any couchbase instance - @Disabled @Test public void testInsert() throws Exception { + cluster.bucket(bucketName).waitUntilReady(Duration.ofSeconds(30)); MockEndpoint mock = getMockEndpoint("mock:result"); mock.expectedMessageCount(1); @@ -44,8 +43,8 @@ public class ProduceMessagesSimpleTest extends CamelTestSupport { public void configure() throws Exception { // need couchbase installed on localhost - from("direct:start").setHeader(CouchbaseConstants.HEADER_ID, constant("blabla:120771")) - .to("couchbase:http://192.168.1.102/test?additionalHosts=localhost&username=root&password=123456") + from("direct:start").setHeader(CouchbaseConstants.HEADER_ID, constant("SimpleDocument_1")) + .to(getConnectionUri()) .to("mock:result"); } diff --git a/components/camel-couchbase/src/test/java/org/apache/camel/component/couchbase/ProduceMessagesWithAutoIDIntegrationTest.java b/components/camel-couchbase/src/test/java/org/apache/camel/component/couchbase/ProduceMessagesWithAutoIDTest.java similarity index 82% rename from components/camel-couchbase/src/test/java/org/apache/camel/component/couchbase/ProduceMessagesWithAutoIDIntegrationTest.java rename to components/camel-couchbase/src/test/java/org/apache/camel/component/couchbase/ProduceMessagesWithAutoIDTest.java index 8727d96..4eee7a6 100644 --- a/components/camel-couchbase/src/test/java/org/apache/camel/component/couchbase/ProduceMessagesWithAutoIDIntegrationTest.java +++ b/components/camel-couchbase/src/test/java/org/apache/camel/component/couchbase/ProduceMessagesWithAutoIDTest.java @@ -18,10 +18,9 @@ package org.apache.camel.component.couchbase; import org.apache.camel.builder.RouteBuilder; import org.apache.camel.component.mock.MockEndpoint; -import org.apache.camel.test.junit5.CamelTestSupport; import org.junit.jupiter.api.Test; -public class ProduceMessagesWithAutoIDIntegrationTest extends CamelTestSupport { +public class ProduceMessagesWithAutoIDTest extends CouchbaseIntegrationTestBase { @Test public void testInsert() throws Exception { @@ -32,7 +31,6 @@ public class ProduceMessagesWithAutoIDIntegrationTest extends CamelTestSupport { template.sendBody("direct:start", "ugol2"); assertMockEndpointsSatisfied(); - } @Override @@ -40,10 +38,8 @@ public class ProduceMessagesWithAutoIDIntegrationTest extends CamelTestSupport { return new RouteBuilder() { @Override public void configure() throws Exception { - - // need couchbase installed on localhost from("direct:start").to( - "couchbase:http://localhost/test?username=root&password=123456&autoStartIdForInserts=true&startingIdForInsertsFrom=1000") + getConnectionUri() + "&autoStartIdForInserts=true&startingIdForInsertsFrom=1000") .to("mock:result"); } }; diff --git a/components/camel-couchbase/src/test/java/org/apache/camel/component/couchbase/RemoveMessagesIntegrationTest.java b/components/camel-couchbase/src/test/java/org/apache/camel/component/couchbase/RemoveMessagesTest.java similarity index 64% rename from components/camel-couchbase/src/test/java/org/apache/camel/component/couchbase/RemoveMessagesIntegrationTest.java rename to components/camel-couchbase/src/test/java/org/apache/camel/component/couchbase/RemoveMessagesTest.java index e952e75..26bf3b1 100644 --- a/components/camel-couchbase/src/test/java/org/apache/camel/component/couchbase/RemoveMessagesIntegrationTest.java +++ b/components/camel-couchbase/src/test/java/org/apache/camel/component/couchbase/RemoveMessagesTest.java @@ -18,18 +18,23 @@ package org.apache.camel.component.couchbase; import org.apache.camel.builder.RouteBuilder; import org.apache.camel.component.mock.MockEndpoint; -import org.apache.camel.test.junit5.CamelTestSupport; import org.junit.jupiter.api.Test; -public class RemoveMessagesIntegrationTest extends CamelTestSupport { +import static org.apache.camel.component.couchbase.CouchbaseConstants.COUCHBASE_DELETE; +import static org.apache.camel.component.couchbase.CouchbaseConstants.HEADER_ID; + +public class RemoveMessagesTest extends CouchbaseIntegrationTestBase { @Test - public void testInsert() throws Exception { + public void testDelete() throws Exception { + for (int i = 0; i < 15; i++) { + cluster.bucket(bucketName).defaultCollection().upsert("DocumentID_" + i, "message" + i); + } + MockEndpoint mock = getMockEndpoint("mock:result"); - mock.expectedMessageCount(2); - template.sendBody("direct:start", "ugol1"); - template.sendBody("direct:start", "ugol2"); + template.sendBodyAndHeader("direct:start", "delete the document ", HEADER_ID, "DocumentID_1"); + template.sendBodyAndHeader("direct:start", "delete the document", HEADER_ID, "DocumentID_2"); assertMockEndpointsSatisfied(); @@ -40,10 +45,8 @@ public class RemoveMessagesIntegrationTest extends CamelTestSupport { return new RouteBuilder() { @Override public void configure() throws Exception { - - // need couchbase installed on localhost - from("direct:start").setHeader(CouchbaseConstants.HEADER_ID, constant("120770")) - .to("couchbase:http://localhost/default?username=root&password=123456&operation='DELETE'") + from("direct:start") + .to(getConnectionUri() + "&operation=" + COUCHBASE_DELETE) .to("mock:result"); } }; diff --git a/core/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/CouchbaseEndpointBuilderFactory.java b/core/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/CouchbaseEndpointBuilderFactory.java index 38e13a2..f6ed0b5 100644 --- a/core/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/CouchbaseEndpointBuilderFactory.java +++ b/core/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/CouchbaseEndpointBuilderFactory.java @@ -181,6 +181,34 @@ public interface CouchbaseEndpointBuilderFactory { return this; } /** + * If true consumer will return complete document instead data defined + * in view. + * + * The option is a: <code>boolean</code> type. + * + * Default: false + * Group: consumer + */ + default CouchbaseEndpointConsumerBuilder fullDocument( + boolean fullDocument) { + doSetProperty("fullDocument", fullDocument); + return this; + } + /** + * If true consumer will return complete document instead data defined + * in view. + * + * The option will be converted to a <code>boolean</code> type. + * + * Default: false + * Group: consumer + */ + default CouchbaseEndpointConsumerBuilder fullDocument( + String fullDocument) { + doSetProperty("fullDocument", fullDocument); + return this; + } + /** * The output limit to use. * * The option is a: <code>int</code> type. @@ -813,6 +841,32 @@ public interface CouchbaseEndpointBuilderFactory { return this; } /** + * Define the timeoutconnect in milliseconds. + * + * The option is a: <code>long</code> type. + * + * Default: 2500 + * Group: advanced + */ + default AdvancedCouchbaseEndpointConsumerBuilder connectTimeout( + long connectTimeout) { + doSetProperty("connectTimeout", connectTimeout); + return this; + } + /** + * Define the timeoutconnect in milliseconds. + * + * The option will be converted to a <code>long</code> type. + * + * Default: 2500 + * Group: advanced + */ + default AdvancedCouchbaseEndpointConsumerBuilder connectTimeout( + String connectTimeout) { + doSetProperty("connectTimeout", connectTimeout); + return this; + } + /** * Define the operation timeout in milliseconds. * * The option is a: <code>long</code> type. @@ -1174,6 +1228,32 @@ public interface CouchbaseEndpointBuilderFactory { return this; } /** + * Define the timeoutconnect in milliseconds. + * + * The option is a: <code>long</code> type. + * + * Default: 2500 + * Group: advanced + */ + default AdvancedCouchbaseEndpointProducerBuilder connectTimeout( + long connectTimeout) { + doSetProperty("connectTimeout", connectTimeout); + return this; + } + /** + * Define the timeoutconnect in milliseconds. + * + * The option will be converted to a <code>long</code> type. + * + * Default: 2500 + * Group: advanced + */ + default AdvancedCouchbaseEndpointProducerBuilder connectTimeout( + String connectTimeout) { + doSetProperty("connectTimeout", connectTimeout); + return this; + } + /** * Define the operation timeout in milliseconds. * * The option is a: <code>long</code> type. @@ -1331,6 +1411,32 @@ public interface CouchbaseEndpointBuilderFactory { return this; } /** + * Define the timeoutconnect in milliseconds. + * + * The option is a: <code>long</code> type. + * + * Default: 2500 + * Group: advanced + */ + default AdvancedCouchbaseEndpointBuilder connectTimeout( + long connectTimeout) { + doSetProperty("connectTimeout", connectTimeout); + return this; + } + /** + * Define the timeoutconnect in milliseconds. + * + * The option will be converted to a <code>long</code> type. + * + * Default: 2500 + * Group: advanced + */ + default AdvancedCouchbaseEndpointBuilder connectTimeout( + String connectTimeout) { + doSetProperty("connectTimeout", connectTimeout); + return this; + } + /** * Define the operation timeout in milliseconds. * * The option is a: <code>long</code> type. diff --git a/docs/components/modules/ROOT/pages/couchbase-component.adoc b/docs/components/modules/ROOT/pages/couchbase-component.adoc index 00d8017..43fe3e2 100644 --- a/docs/components/modules/ROOT/pages/couchbase-component.adoc +++ b/docs/components/modules/ROOT/pages/couchbase-component.adoc @@ -75,7 +75,7 @@ with the following path and query parameters: |=== -=== Query Parameters (44 parameters): +=== Query Parameters (46 parameters): [width="100%",cols="2,5,^1,2",options="header"] @@ -89,6 +89,7 @@ with the following path and query parameters: | *consumerProcessedStrategy* (consumer) | Define the consumer Processed strategy to use | none | String | *descending* (consumer) | Define if this operation is descending or not | false | boolean | *designDocumentName* (consumer) | The design document name to use | beer | String +| *fullDocument* (consumer) | If true consumer will return complete document instead data defined in view | false | boolean | *limit* (consumer) | The output limit to use | -1 | int | *rangeEndKey* (consumer) | Define a range for the end key | | String | *rangeStartKey* (consumer) | Define a range for the start key | | String @@ -107,6 +108,7 @@ with the following path and query parameters: | *replicateTo* (producer) | Where to replicate the data | 0 | int | *startingIdForInsertsFrom* (producer) | Define the starting Id where we are doing an insert operation | | long | *additionalHosts* (advanced) | The additional hosts | | String +| *connectTimeout* (advanced) | Define the timeoutconnect in milliseconds | 2500 | long | *queryTimeout* (advanced) | Define the operation timeout in milliseconds | 2500 | long | *synchronous* (advanced) | Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported). | false | boolean | *backoffErrorThreshold* (scheduler) | The number of subsequent error polls (failed due some error) that should happen before the backoffMultipler should kick-in. | | int