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 14cafe1  CAMEL-13092: camel-servlet/camel-http when returning gzip 
response in streamning mode should not set Content-Length header.
14cafe1 is described below

commit 14cafe1d26f6b200da7540d9f0c30e43abfacc17
Author: Claus Ibsen <claus.ib...@gmail.com>
AuthorDate: Wed Mar 24 07:31:52 2021 +0100

    CAMEL-13092: camel-servlet/camel-http when returning gzip response in 
streamning mode should not set Content-Length header.
---
 .../camel/http/common/DefaultHttpBinding.java      |  37 ++--
 .../camel-servlet/src/test/data/big-payload.json   | 213 +++++++++++++++++++++
 .../servlet/ServletStreamingGzipChunkedTest.java   | 105 ++++++++++
 3 files changed, 339 insertions(+), 16 deletions(-)

diff --git 
a/components/camel-http-common/src/main/java/org/apache/camel/http/common/DefaultHttpBinding.java
 
b/components/camel-http-common/src/main/java/org/apache/camel/http/common/DefaultHttpBinding.java
index 3a0bdfd..bb40022 100644
--- 
a/components/camel-http-common/src/main/java/org/apache/camel/http/common/DefaultHttpBinding.java
+++ 
b/components/camel-http-common/src/main/java/org/apache/camel/http/common/DefaultHttpBinding.java
@@ -33,6 +33,7 @@ import java.util.Locale;
 import java.util.Map;
 import java.util.TimeZone;
 import java.util.concurrent.TimeoutException;
+import java.util.zip.GZIPOutputStream;
 
 import javax.activation.DataHandler;
 import javax.servlet.ServletOutputStream;
@@ -595,25 +596,29 @@ public class DefaultHttpBinding implements HttpBinding {
     }
 
     protected void doWriteGZIPResponse(Message message, HttpServletResponse 
response, Exchange exchange) throws IOException {
-        byte[] bytes;
-        try {
-            bytes = message.getMandatoryBody(byte[].class);
-        } catch (InvalidPayloadException e) {
-            throw RuntimeCamelException.wrapRuntimeCamelException(e);
-        }
-
-        byte[] data = GZIPHelper.compressGZIP(bytes);
         ServletOutputStream os = response.getOutputStream();
-        try {
+        GZIPOutputStream gos = new GZIPOutputStream(os);
+
+        Object body = exchange.getIn().getBody();
+        if (body instanceof InputStream) {
+            InputStream is = (InputStream) body;
             if (LOG.isDebugEnabled()) {
-                LOG.debug("Streaming response as GZIP in non-chunked mode with 
content-length {} and buffer size: {}",
-                        data.length, response.getBufferSize());
+                LOG.debug("Streaming GZIP response in chunked mode with buffer 
size {}", response.getBufferSize());
             }
-            response.setContentLength(data.length);
-            os.write(data);
-            os.flush();
-        } finally {
-            IOHelper.close(os);
+            copyStream(is, gos, response.getBufferSize());
+        } else {
+            byte[] bytes;
+            try {
+                bytes = message.getMandatoryBody(byte[].class);
+            } catch (InvalidPayloadException e) {
+                throw RuntimeCamelException.wrapRuntimeCamelException(e);
+            }
+            if (LOG.isDebugEnabled()) {
+                LOG.debug("Writing GZIP response in chunked mode from byte 
array with length: {}", bytes.length);
+            }
+            gos.write(bytes);
+            gos.flush();
+            IOHelper.close(gos);
         }
     }
 
diff --git a/components/camel-servlet/src/test/data/big-payload.json 
b/components/camel-servlet/src/test/data/big-payload.json
new file mode 100644
index 0000000..b6089dc
--- /dev/null
+++ b/components/camel-servlet/src/test/data/big-payload.json
@@ -0,0 +1,213 @@
+{
+  "groups": [
+    { "name": "camel.main", "description": "camel-main configurations.", 
"sourceType": "org.apache.camel.main.DefaultConfigurationProperties" },
+    { "name": "camel.faulttolerance", "description": "camel-fault-tolerance 
configurations.", "sourceType": 
"org.apache.camel.main.FaultToleranceConfigurationProperties" },
+    { "name": "camel.hystrix", "description": "camel-hystrix configurations.", 
"sourceType": "org.apache.camel.main.HystrixConfigurationProperties" },
+    { "name": "camel.resilience4j", "description": "camel-resilience4j 
configurations.", "sourceType": 
"org.apache.camel.main.Resilience4jConfigurationProperties" },
+    { "name": "camel.rest", "description": "camel-rest configurations.", 
"sourceType": "org.apache.camel.spi.RestConfiguration" },
+    { "name": "camel.health", "description": "camel-health configurations.", 
"sourceType": "org.apache.camel.main.HealthConfigurationProperties" },
+    { "name": "camel.lra", "description": "camel-lra configurations.", 
"sourceType": "org.apache.camel.main.LraConfigurationProperties" },
+    { "name": "camel.threadpool", "description": "camel-threadpool 
configurations.", "sourceType": 
"org.apache.camel.main.ThreadPoolConfigurationProperties" }
+  ],
+  "properties": [
+    { "name": "camel.main.allowUseOriginalMessage", "description": "Sets 
whether to allow access to the original message from Camel's error handler, or 
from org.apache.camel.spi.UnitOfWork.getOriginalInMessage(). Turning this off 
can optimize performance, as defensive copy of the original message is not 
needed. Default is false.", "sourceType": 
"org.apache.camel.main.DefaultConfigurationProperties", "type": "boolean", 
"javaType": "boolean" },
+    { "name": "camel.main.autoConfigurationEnabled", "description": "Whether 
auto configuration of components, dataformats, languages is enabled or not. 
When enabled the configuration parameters are loaded from the properties 
component and optionally from the classpath file 
META-INF\/services\/org\/apache\/camel\/autowire.properties. You can prefix the 
parameters in the properties file with: - camel.component.name.option1=value1 - 
camel.component.name.option2=value2 - camel.dataformat.na [...]
+    { "name": "camel.main.autoConfigurationEnvironmentVariablesEnabled", 
"description": "Whether auto configuration should include OS environment 
variables as well. When enabled this allows to overrule any configuration using 
an OS environment variable. For example to set a shutdown timeout of 5 seconds: 
CAMEL_MAIN_SHUTDOWNTIMEOUT=5. This option is default enabled.", "sourceType": 
"org.apache.camel.main.MainConfigurationProperties", "type": "boolean", 
"javaType": "boolean", "defaultValue [...]
+    { "name": "camel.main.autoConfigurationFailFast", "description": "Whether 
auto configuration should fail fast when configuring one ore more properties 
fails for whatever reason such as a invalid property name, etc. This option is 
default enabled.", "sourceType": 
"org.apache.camel.main.MainConfigurationProperties", "type": "boolean", 
"javaType": "boolean", "defaultValue": true },
+    { "name": "camel.main.autoConfigurationLogSummary", "description": 
"Whether auto configuration should log a summary with the configured 
properties. This option is default enabled.", "sourceType": 
"org.apache.camel.main.MainConfigurationProperties", "type": "boolean", 
"javaType": "boolean", "defaultValue": true },
+    { "name": "camel.main.autoConfigurationSystemPropertiesEnabled", 
"description": "Whether auto configuration should include JVM system properties 
as well. When enabled this allows to overrule any configuration using a JVM 
system property. For example to set a shutdown timeout of 5 seconds: -D 
camel.main.shutdown-timeout=5. Note that JVM system properties take precedence 
over OS environment variables. This option is default enabled.", "sourceType": 
"org.apache.camel.main.MainConfigurat [...]
+    { "name": "camel.main.autoStartup", "description": "Sets whether the 
object should automatically start when Camel starts. Important: Currently only 
routes can be disabled, as CamelContext's are always started. Note: When 
setting auto startup false on CamelContext then that takes precedence and no 
routes are started. You would need to start CamelContext explicit using the 
org.apache.camel.CamelContext.start() method, to start the context, and then 
you would need to start the routes ma [...]
+    { "name": "camel.main.autowiredEnabled", "description": "Whether 
autowiring is enabled. This is used for automatic autowiring options (the 
option must be marked as autowired) by looking up in the registry to find if 
there is a single instance of matching type, which then gets configured on the 
component. This can be used for automatic configuring JDBC data sources, JMS 
connection factories, AWS Clients, etc. Default is true.", "sourceType": 
"org.apache.camel.main.DefaultConfiguration [...]
+    { "name": "camel.main.backlogTracing", "description": "Sets whether 
backlog tracing is enabled or not. Default is false.", "sourceType": 
"org.apache.camel.main.DefaultConfigurationProperties", "type": "boolean", 
"javaType": "boolean" },
+    { "name": "camel.main.beanIntrospectionExtendedStatistics", "description": 
"Sets whether bean introspection uses extended statistics. The default is 
false.", "sourceType": "org.apache.camel.main.DefaultConfigurationProperties", 
"type": "boolean", "javaType": "boolean" },
+    { "name": "camel.main.beanIntrospectionLoggingLevel", "description": "Sets 
the logging level used by bean introspection, logging activity of its usage. 
The default is TRACE.", "sourceType": 
"org.apache.camel.main.DefaultConfigurationProperties", "type": "object", 
"javaType": "org.apache.camel.LoggingLevel", "enum": [ "ERROR", "WARN", "INFO", 
"DEBUG", "TRACE", "OFF" ] },
+    { "name": "camel.main.beanPostProcessorEnabled", "description": "Can be 
used to turn off bean post processing. Be careful to turn this off, as this 
means that beans that use Camel annotations such as 
org.apache.camel.EndpointInject , org.apache.camel.ProducerTemplate , 
org.apache.camel.Produce , org.apache.camel.Consume etc will not be injected 
and in use. Turning this off should only be done if you are sure you do not use 
any of these Camel features. Not all runtimes allow turning t [...]
+    { "name": "camel.main.caseInsensitiveHeaders", "description": "Whether to 
use case sensitive or insensitive headers. Important: When using case sensitive 
(this is set to false). Then the map is case sensitive which means headers such 
as content-type and Content-Type are two different keys which can be a problem 
for some protocols such as HTTP based, which rely on case insensitive headers. 
However case sensitive implementations can yield faster performance. Therefore 
use case sensitiv [...]
+    { "name": "camel.main.configurationClasses", "description": "Sets classes 
names that will be used to configure the camel context as example by providing 
custom beans through org.apache.camel.BindToRegistry annotation.", 
"sourceType": "org.apache.camel.main.MainConfigurationProperties", "type": 
"string", "javaType": "java.lang.String" },
+    { "name": "camel.main.configurations", "description": "Sets the 
configuration objects used to configure the camel context.", "sourceType": 
"org.apache.camel.main.MainConfigurationProperties", "type": "object", 
"javaType": "java.util.List" },
+    { "name": "camel.main.consumerTemplateCacheSize", "description": "Consumer 
template endpoints cache size.", "sourceType": 
"org.apache.camel.main.DefaultConfigurationProperties", "type": "integer", 
"javaType": "int", "defaultValue": 1000 },
+    { "name": "camel.main.durationHitExitCode", "description": "Sets the exit 
code for the application if duration was hit", "sourceType": 
"org.apache.camel.main.MainConfigurationProperties", "type": "integer", 
"javaType": "int" },
+    { "name": "camel.main.durationMaxIdleSeconds", "description": "To specify 
for how long time in seconds Camel can be idle before automatic terminating the 
JVM. You can use this to run Camel for a short while.", "sourceType": 
"org.apache.camel.main.DefaultConfigurationProperties", "type": "integer", 
"javaType": "int" },
+    { "name": "camel.main.durationMaxMessages", "description": "To specify how 
many messages to process by Camel before automatic terminating the JVM. You can 
use this to run Camel for a short while.", "sourceType": 
"org.apache.camel.main.DefaultConfigurationProperties", "type": "integer", 
"javaType": "int" },
+    { "name": "camel.main.durationMaxSeconds", "description": "To specify for 
how long time in seconds to keep running the JVM before automatic terminating 
the JVM. You can use this to run Camel for a short while.", "sourceType": 
"org.apache.camel.main.DefaultConfigurationProperties", "type": "integer", 
"javaType": "int" },
+    { "name": "camel.main.endpointBridgeErrorHandler", "description": "Allows 
for bridging the consumer to the Camel routing Error Handler, which mean any 
exceptions occurred while the consumer is trying to pickup incoming messages, 
or the likes, will now be processed as a message and handled by the routing 
Error Handler. By default the consumer will use the 
org.apache.camel.spi.ExceptionHandler to deal with exceptions, that will be 
logged at WARN\/ERROR level and ignored. The default va [...]
+    { "name": "camel.main.endpointLazyStartProducer", "description": "Whether 
the producer should be started lazy (on the first message). By starting lazy 
you can use this to allow CamelContext and routes to startup in situations 
where a producer may otherwise fail during starting and cause the route to fail 
being started. By deferring this startup to be lazy then the startup failure 
can be handled during routing messages via Camel's routing error handlers. 
Beware that when the first mes [...]
+    { "name": "camel.main.endpointRuntimeStatisticsEnabled", "description": 
"Sets whether endpoint runtime statistics is enabled (gathers runtime usage of 
each incoming and outgoing endpoints). The default value is false.", 
"sourceType": "org.apache.camel.main.DefaultConfigurationProperties", "type": 
"boolean", "javaType": "boolean" },
+    { "name": "camel.main.exchangeFactory", "description": "Controls whether 
to pool (reuse) exchanges or create new exchanges (prototype). Using pooled 
will reduce JVM garbage collection overhead by avoiding to re-create Exchange 
instances per message each consumer receives. The default is prototype mode.", 
"sourceType": "org.apache.camel.main.DefaultConfigurationProperties", "type": 
"string", "javaType": "java.lang.String", "defaultValue": "default", "enum": [ 
"default", "prototype", " [...]
+    { "name": "camel.main.exchangeFactoryCapacity", "description": "The 
capacity the pool (for each consumer) uses for storing exchanges. The default 
capacity is 100.", "sourceType": 
"org.apache.camel.main.DefaultConfigurationProperties", "type": "integer", 
"javaType": "int", "defaultValue": 100 },
+    { "name": "camel.main.exchangeFactoryStatisticsEnabled", "description": 
"Configures whether statistics is enabled on exchange factory.", "sourceType": 
"org.apache.camel.main.DefaultConfigurationProperties", "type": "boolean", 
"javaType": "boolean" },
+    { "name": "camel.main.fileConfigurations", "description": "Directory to 
load additional configuration files that contains configuration values that 
takes precedence over any other configuration. This can be used to refer to 
files that may have secret configuration that has been mounted on the file 
system for containers. You can specify a pattern to load from sub directories 
and a name pattern such as \/var\/app\/secret\/.properties, multiple 
directories can be separated by comma.", " [...]
+    { "name": "camel.main.inflightRepositoryBrowseEnabled", "description": 
"Sets whether the inflight repository should allow browsing each inflight 
exchange. This is by default disabled as there is a very slight performance 
overhead when enabled.", "sourceType": 
"org.apache.camel.main.DefaultConfigurationProperties", "type": "boolean", 
"javaType": "boolean" },
+    { "name": "camel.main.javaRoutesExcludePattern", "description": "Used for 
exclusive filtering RouteBuilder classes which are collected from the registry 
or via classpath scanning. The exclusive filtering takes precedence over 
inclusive filtering. The pattern is using Ant-path style pattern. Multiple 
patterns can be specified separated by comma. For example to exclude all 
classes starting with Bar use: &#42;&#42;\/Bar&#42; To exclude all routes form 
a specific package use: com\/mycomp [...]
+    { "name": "camel.main.javaRoutesIncludePattern", "description": "Used for 
inclusive filtering RouteBuilder classes which are collected from the registry 
or via classpath scanning. The exclusive filtering takes precedence over 
inclusive filtering. The pattern is using Ant-path style pattern. Multiple 
patterns can be specified separated by comma. Multiple patterns can be 
specified separated by comma. For example to include all classes starting with 
Foo use: &#42;&#42;\/Foo To include a [...]
+    { "name": "camel.main.jmxEnabled", "description": "Enable JMX in your 
Camel application.", "sourceType": 
"org.apache.camel.main.DefaultConfigurationProperties", "type": "boolean", 
"javaType": "boolean", "defaultValue": true },
+    { "name": "camel.main.jmxManagementNamePattern", "description": "The 
naming pattern for creating the CamelContext JMX management name. The default 
pattern is #name#", "sourceType": 
"org.apache.camel.main.DefaultConfigurationProperties", "type": "string", 
"javaType": "java.lang.String", "defaultValue": "#name#" },
+    { "name": "camel.main.jmxManagementStatisticsLevel", "description": "Sets 
the JMX statistics level, the level can be set to Extended to gather additional 
information The default value is Default.", "sourceType": 
"org.apache.camel.main.DefaultConfigurationProperties", "type": "object", 
"javaType": "org.apache.camel.ManagementStatisticsLevel", "defaultValue": 
"Default", "enum": [ "Extended", "Default", "RoutesOnly", "Off" ] },
+    { "name": "camel.main.lightweight", "description": "Configure the context 
to be lightweight. This will trigger some optimizations and memory reduction 
options. Lightweight context have some limitations. At this moment, dynamic 
endpoint destinations are not supported.", "sourceType": 
"org.apache.camel.main.DefaultConfigurationProperties", "type": "boolean", 
"javaType": "boolean" },
+    { "name": "camel.main.loadTypeConverters", "description": "Whether to load 
custom type converters by scanning classpath. This is used for backwards 
compatibility with Camel 2.x. Its recommended to migrate to use fast type 
converter loading by setting Converter(loader = true) on your custom type 
converter classes.", "sourceType": 
"org.apache.camel.main.DefaultConfigurationProperties", "type": "boolean", 
"javaType": "boolean" },
+    { "name": "camel.main.logDebugMaxChars", "description": "Is used to limit 
the maximum length of the logging Camel message bodies. If the message body is 
longer than the limit, the log message is clipped. Use -1 to have unlimited 
length. Use for example 1000 to log at most 1000 characters.", "sourceType": 
"org.apache.camel.main.DefaultConfigurationProperties", "type": "integer", 
"javaType": "int" },
+    { "name": "camel.main.logExhaustedMessageBody", "description": "Sets 
whether to log exhausted message body with message history. Default is false.", 
"sourceType": "org.apache.camel.main.DefaultConfigurationProperties", "type": 
"boolean", "javaType": "boolean" },
+    { "name": "camel.main.logMask", "description": "Sets whether log mask is 
enabled or not. Default is false.", "sourceType": 
"org.apache.camel.main.DefaultConfigurationProperties", "type": "boolean", 
"javaType": "boolean" },
+    { "name": "camel.main.mdcLoggingKeysPattern", "description": "Sets the 
pattern used for determine which custom MDC keys to propagate during message 
routing when the routing engine continues routing asynchronously for the given 
message. Setting this pattern to will propagate all custom keys. Or setting the 
pattern to foo,bar will propagate any keys starting with either foo or bar. 
Notice that a set of standard Camel MDC keys are always propagated which starts 
with camel. as key name.  [...]
+    { "name": "camel.main.messageHistory", "description": "Sets whether 
message history is enabled or not. Default is false.", "sourceType": 
"org.apache.camel.main.DefaultConfigurationProperties", "type": "boolean", 
"javaType": "boolean" },
+    { "name": "camel.main.name", "description": "Sets the name of the 
CamelContext.", "sourceType": 
"org.apache.camel.main.DefaultConfigurationProperties", "type": "string", 
"javaType": "java.lang.String" },
+    { "name": "camel.main.packageScanRouteBuilders", "description": "Sets 
package names for scanning for org.apache.camel.builder.RouteBuilder classes as 
candidates to be included. If you are using Spring Boot then its instead 
recommended to use Spring Boots component scanning and annotate your route 
builder classes with Component. In other words only use this for Camel Main in 
standalone mode.", "sourceType": 
"org.apache.camel.main.MainConfigurationProperties", "type": "string", "javaTy 
[...]
+    { "name": "camel.main.producerTemplateCacheSize", "description": "Producer 
template endpoints cache size.", "sourceType": 
"org.apache.camel.main.DefaultConfigurationProperties", "type": "integer", 
"javaType": "int", "defaultValue": 1000 },
+    { "name": "camel.main.routeControllerBackOffDelay", "description": 
"Backoff delay in millis when restarting a route that failed to startup.", 
"sourceType": "org.apache.camel.main.DefaultConfigurationProperties", "type": 
"integer", "javaType": "long" },
+    { "name": "camel.main.routeControllerBackOffMaxAttempts", "description": 
"Backoff maximum number of attempts to restart a route that failed to startup. 
When this threshold has been exceeded then the controller will give up 
attempting to restart the route, and the route will remain as stopped.", 
"sourceType": "org.apache.camel.main.DefaultConfigurationProperties", "type": 
"integer", "javaType": "long" },
+    { "name": "camel.main.routeControllerBackOffMaxDelay", "description": 
"Backoff maximum delay in millis when restarting a route that failed to 
startup.", "sourceType": 
"org.apache.camel.main.DefaultConfigurationProperties", "type": "integer", 
"javaType": "long" },
+    { "name": "camel.main.routeControllerBackOffMaxElapsedTime", 
"description": "Backoff maximum elapsed time in millis, after which the backoff 
should be considered exhausted and no more attempts should be made.", 
"sourceType": "org.apache.camel.main.DefaultConfigurationProperties", "type": 
"integer", "javaType": "long" },
+    { "name": "camel.main.routeControllerBackOffMultiplier", "description": 
"Backoff multiplier to use for exponential backoff. This is used to extend the 
delay between restart attempts.", "sourceType": 
"org.apache.camel.main.DefaultConfigurationProperties", "type": "number", 
"javaType": "double" },
+    { "name": "camel.main.routeControllerExcludeRoutes", "description": 
"Pattern for filtering routes to be excluded as supervised. The pattern is 
matching on route id, and endpoint uri for the route. Multiple patterns can be 
separated by comma. For example to exclude all JMS routes, you can say jms:. 
And to exclude routes with specific route ids 
mySpecialRoute,myOtherSpecialRoute. The pattern supports wildcards and uses the 
matcher from org.apache.camel.support.PatternHelper#matchPatter [...]
+    { "name": "camel.main.routeControllerIncludeRoutes", "description": 
"Pattern for filtering routes to be included as supervised. The pattern is 
matching on route id, and endpoint uri for the route. Multiple patterns can be 
separated by comma. For example to include all kafka routes, you can say 
kafka:. And to include routes with specific route ids myRoute,myOtherRoute. The 
pattern supports wildcards and uses the matcher from 
org.apache.camel.support.PatternHelper#matchPattern.", "sour [...]
+    { "name": "camel.main.routeControllerInitialDelay", "description": 
"Initial delay in milli seconds before the route controller starts, after 
CamelContext has been started.", "sourceType": 
"org.apache.camel.main.DefaultConfigurationProperties", "type": "integer", 
"javaType": "long" },
+    { "name": "camel.main.routeControllerLoggingLevel", "description": "Sets 
the logging level used for logging route activity (such as starting and 
stopping routes). The default logging level is DEBUG.", "sourceType": 
"org.apache.camel.main.DefaultConfigurationProperties", "type": "object", 
"javaType": "org.apache.camel.LoggingLevel", "defaultValue": "DEBUG", "enum": [ 
"ERROR", "WARN", "INFO", "DEBUG", "TRACE", "OFF" ], "deprecated": true },
+    { "name": "camel.main.routeControllerSuperviseEnabled", "description": "To 
enable using supervising route controller which allows Camel to startup and 
then the controller takes care of starting the routes in a safe manner. This 
can be used when you want to startup Camel despite a route may otherwise fail 
fast during startup and cause Camel to fail to startup as well. By delegating 
the route startup to the supervising route controller then its manages the 
startup using a background th [...]
+    { "name": "camel.main.routeControllerThreadPoolSize", "description": "The 
number of threads used by the route controller scheduled thread pool that are 
used for restarting routes. The pool uses 1 thread by default, but you can 
increase this to allow the controller to concurrently attempt to restart 
multiple routes in case more than one route has problems starting.", 
"sourceType": "org.apache.camel.main.DefaultConfigurationProperties", "type": 
"integer", "javaType": "int" },
+    { "name": "camel.main.routeControllerUnhealthyOnExhausted", "description": 
"Whether to mark the route as unhealthy (down) when all restarting attempts 
(backoff) have failed and the route is not successfully started and the route 
manager is giving up. Setting this to true allows health checks to know about 
this and can report the Camel application as DOWN. The default is false.", 
"sourceType": "org.apache.camel.main.DefaultConfigurationProperties", "type": 
"boolean", "javaType": "boolean" },
+    { "name": "camel.main.routeFilterExcludePattern", "description": "Used for 
filtering routes routes matching the given pattern, which follows the following 
rules: - Match by route id - Match by route input endpoint uri The matching is 
using exact match, by wildcard and regular expression as documented by 
PatternHelper#matchPattern(String,String) . For example to only include routes 
which starts with foo in their route id's, use: include=foo&#42; And to exclude 
routes which starts from [...]
+    { "name": "camel.main.routeFilterIncludePattern", "description": "Used for 
filtering routes matching the given pattern, which follows the following rules: 
- Match by route id - Match by route input endpoint uri The matching is using 
exact match, by wildcard and regular expression as documented by 
PatternHelper#matchPattern(String,String) . For example to only include routes 
which starts with foo in their route id's, use: include=foo&#42; And to exclude 
routes which starts from JMS en [...]
+    { "name": "camel.main.routesBuilderClasses", "description": "Sets classes 
names that implement RoutesBuilder .", "sourceType": 
"org.apache.camel.main.MainConfigurationProperties", "type": "string", 
"javaType": "java.lang.String" },
+    { "name": "camel.main.routesBuilders", "description": "Sets the 
RoutesBuilder instances.", "sourceType": 
"org.apache.camel.main.MainConfigurationProperties", "type": "object", 
"javaType": "java.util.List" },
+    { "name": "camel.main.routesCollectorEnabled", "description": "Whether the 
routes collector is enabled or not. When enabled Camel will auto-discover 
routes (RouteBuilder instances from the registry and also load additional 
routes from the file system). The routes collector is default enabled.", 
"sourceType": "org.apache.camel.main.DefaultConfigurationProperties", "type": 
"boolean", "javaType": "boolean", "defaultValue": true },
+    { "name": "camel.main.routesExcludePattern", "description": "Used for 
exclusive filtering of routes from directories. The exclusive filtering takes 
precedence over inclusive filtering. The pattern is using Ant-path style 
pattern. Multiple patterns can be specified separated by comma, as example, to 
exclude all the routes from a directory whose name contains foo use: 
&#42;&#42;\/foo.", "sourceType": 
"org.apache.camel.main.DefaultConfigurationProperties", "type": "string", 
"javaType":  [...]
+    { "name": "camel.main.routesIncludePattern", "description": "Used for 
inclusive filtering of routes from directories. The exclusive filtering takes 
precedence over inclusive filtering. The pattern is using Ant-path style 
pattern. Multiple patterns can be specified separated by comma, as example, to 
include all the routes from a directory whose name contains foo use: 
&#42;&#42;\/foo.", "sourceType": 
"org.apache.camel.main.DefaultConfigurationProperties", "type": "string", 
"javaType":  [...]
+    { "name": "camel.main.shutdownLogInflightExchangesOnTimeout", 
"description": "Sets whether to log information about the inflight Exchanges 
which are still running during a shutdown which didn't complete without the 
given timeout. This requires to enable the option 
inflightRepositoryBrowseEnabled.", "sourceType": 
"org.apache.camel.main.DefaultConfigurationProperties", "type": "boolean", 
"javaType": "boolean", "defaultValue": true },
+    { "name": "camel.main.shutdownNowOnTimeout", "description": "Sets whether 
to force shutdown of all consumers when a timeout occurred and thus not all 
consumers was shutdown within that period. You should have good reasons to set 
this option to false as it means that the routes keep running and is halted 
abruptly when CamelContext has been shutdown.", "sourceType": 
"org.apache.camel.main.DefaultConfigurationProperties", "type": "boolean", 
"javaType": "boolean", "defaultValue": true },
+    { "name": "camel.main.shutdownRoutesInReverseOrder", "description": "Sets 
whether routes should be shutdown in reverse or the same order as they were 
started.", "sourceType": 
"org.apache.camel.main.DefaultConfigurationProperties", "type": "boolean", 
"javaType": "boolean", "defaultValue": true },
+    { "name": "camel.main.shutdownSuppressLoggingOnTimeout", "description": 
"Whether Camel should try to suppress logging during shutdown and timeout was 
triggered, meaning forced shutdown is happening. And during forced shutdown we 
want to avoid logging errors\/warnings et all in the logs as a side-effect of 
the forced timeout. Notice the suppress is a best effort as there may still be 
some logs coming from 3rd party libraries and whatnot, which Camel cannot 
control. This option is defa [...]
+    { "name": "camel.main.shutdownTimeout", "description": "Timeout in seconds 
to graceful shutdown Camel.", "sourceType": 
"org.apache.camel.main.DefaultConfigurationProperties", "type": "integer", 
"javaType": "int", "defaultValue": 45 },
+    { "name": "camel.main.startupRecorder", "description": "To use startup 
recorder for capturing execution time during starting Camel. The recorder can 
be one of: false (or off), logging, java-flight-recorder (or jfr).", 
"sourceType": "org.apache.camel.main.DefaultConfigurationProperties", "type": 
"string", "javaType": "java.lang.String", "enum": [ "false", "off", 
"java-flight-recorder", "jfr", "logging" ] },
+    { "name": "camel.main.startupRecorderDir", "description": "Directory to 
store the recording. By default the current directory will be used. Use false 
to turn off saving recording to disk.", "sourceType": 
"org.apache.camel.main.DefaultConfigurationProperties", "type": "string", 
"javaType": "java.lang.String" },
+    { "name": "camel.main.startupRecorderDuration", "description": "How long 
time to run the startup recorder. Use 0 (default) to keep the recorder running 
until the JVM is exited. Use -1 to stop the recorder right after Camel has been 
started (to only focus on potential Camel startup performance bottlenecks) Use 
a positive value to keep recording for N seconds. When the recorder is stopped 
then the recording is auto saved to disk (note: save to disk can be disabled by 
setting startupRec [...]
+    { "name": "camel.main.startupRecorderMaxDepth", "description": "To filter 
our sub steps at a maximum depth. Use -1 for no maximum. Use 0 for no sub 
steps. Use 1 for max 1 sub step, and so forth. The default is -1.", 
"sourceType": "org.apache.camel.main.DefaultConfigurationProperties", "type": 
"integer", "javaType": "int", "defaultValue": -1 },
+    { "name": "camel.main.startupRecorderProfile", "description": "To use a 
specific Java Flight Recorder profile configuration, such as default or 
profile. The default is default.", "sourceType": 
"org.apache.camel.main.DefaultConfigurationProperties", "type": "string", 
"javaType": "java.lang.String", "defaultValue": "default" },
+    { "name": "camel.main.startupRecorderRecording", "description": "To enable 
Java Flight Recorder to start a recording and automatic dump the recording to 
disk after startup is complete. This requires that camel-jfr is on the 
classpath, and to enable this option.", "sourceType": 
"org.apache.camel.main.DefaultConfigurationProperties", "type": "boolean", 
"javaType": "boolean" },
+    { "name": "camel.main.startupSummaryLevel", "description": "Controls the 
level of information logged during startup (and shutdown) of CamelContext.", 
"sourceType": "org.apache.camel.main.DefaultConfigurationProperties", "type": 
"object", "javaType": "org.apache.camel.StartupSummaryLevel", "defaultValue": 
"Default" },
+    { "name": "camel.main.streamCachingAnySpoolRules", "description": "Sets 
whether if just any of the org.apache.camel.spi.StreamCachingStrategy.SpoolRule 
rules returns true then shouldSpoolCache(long) returns true, to allow spooling 
to disk. If this option is false, then all the 
org.apache.camel.spi.StreamCachingStrategy.SpoolRule must return true. The 
default value is false which means that all the rules must return true.", 
"sourceType": "org.apache.camel.main.DefaultConfigurationProp [...]
+    { "name": "camel.main.streamCachingBufferSize", "description": "Sets the 
stream caching buffer size to use when allocating in-memory buffers used for 
in-memory stream caches. The default size is 4096.", "sourceType": 
"org.apache.camel.main.DefaultConfigurationProperties", "type": "integer", 
"javaType": "int" },
+    { "name": "camel.main.streamCachingEnabled", "description": "Sets whether 
stream caching is enabled or not. Default is false.", "sourceType": 
"org.apache.camel.main.DefaultConfigurationProperties", "type": "boolean", 
"javaType": "boolean" },
+    { "name": "camel.main.streamCachingRemoveSpoolDirectoryWhenStopping", 
"description": "Whether to remove stream caching temporary directory when 
stopping. This option is default true.", "sourceType": 
"org.apache.camel.main.DefaultConfigurationProperties", "type": "boolean", 
"javaType": "boolean", "defaultValue": true },
+    { "name": "camel.main.streamCachingSpoolCipher", "description": "Sets a 
stream caching cipher name to use when spooling to disk to write with 
encryption. By default the data is not encrypted.", "sourceType": 
"org.apache.camel.main.DefaultConfigurationProperties", "type": "string", 
"javaType": "java.lang.String" },
+    { "name": "camel.main.streamCachingSpoolDirectory", "description": "Sets 
the stream caching spool (temporary) directory to use for overflow and spooling 
to disk. If no spool directory has been explicit configured, then a temporary 
directory is created in the java.io.tmpdir directory.", "sourceType": 
"org.apache.camel.main.DefaultConfigurationProperties", "type": "string", 
"javaType": "java.lang.String" },
+    { "name": "camel.main.streamCachingSpoolThreshold", "description": "Stream 
caching threshold in bytes when overflow to disk is activated. The default 
threshold is 128kb. Use -1 to disable overflow to disk.", "sourceType": 
"org.apache.camel.main.DefaultConfigurationProperties", "type": "integer", 
"javaType": "long" },
+    { "name": "camel.main.streamCachingSpoolUsedHeapMemoryLimit", 
"description": "Sets what the upper bounds should be when 
streamCachingSpoolUsedHeapMemoryThreshold is in use.", "sourceType": 
"org.apache.camel.main.DefaultConfigurationProperties", "type": "string", 
"javaType": "java.lang.String" },
+    { "name": "camel.main.streamCachingSpoolUsedHeapMemoryThreshold", 
"description": "Sets a percentage (1-99) of used heap memory threshold to 
activate stream caching spooling to disk.", "sourceType": 
"org.apache.camel.main.DefaultConfigurationProperties", "type": "integer", 
"javaType": "int" },
+    { "name": "camel.main.streamCachingStatisticsEnabled", "description": 
"Sets whether stream caching statistics is enabled.", "sourceType": 
"org.apache.camel.main.DefaultConfigurationProperties", "type": "boolean", 
"javaType": "boolean" },
+    { "name": "camel.main.threadNamePattern", "description": "Sets the thread 
name pattern used for creating the full thread name. The default pattern is: 
Camel (#camelId#) thread ##counter# - #name# Where #camelId# is the name of the 
CamelContext. and #counter# is a unique incrementing counter. and #name# is the 
regular thread name. You can also use #longName# which is the long thread name 
which can includes endpoint parameters etc.", "sourceType": 
"org.apache.camel.main.DefaultConfigur [...]
+    { "name": "camel.main.tracing", "description": "Sets whether tracing is 
enabled or not. Default is false.", "sourceType": 
"org.apache.camel.main.DefaultConfigurationProperties", "type": "boolean", 
"javaType": "boolean" },
+    { "name": "camel.main.tracingPattern", "description": "Tracing pattern to 
match which node EIPs to trace. For example to match all To EIP nodes, use to. 
The pattern matches by node and route id's Multiple patterns can be separated 
by comma.", "sourceType": 
"org.apache.camel.main.DefaultConfigurationProperties", "type": "string", 
"javaType": "java.lang.String" },
+    { "name": "camel.main.useBreadcrumb", "description": "Set whether 
breadcrumb is enabled. The default value is false.", "sourceType": 
"org.apache.camel.main.DefaultConfigurationProperties", "type": "boolean", 
"javaType": "boolean" },
+    { "name": "camel.main.useDataType", "description": "Whether to enable 
using data type on Camel messages. Data type are automatic turned on if one ore 
more routes has been explicit configured with input and output types. Otherwise 
data type is default off.", "sourceType": 
"org.apache.camel.main.DefaultConfigurationProperties", "type": "boolean", 
"javaType": "boolean" },
+    { "name": "camel.main.useMdcLogging", "description": "To turn on MDC 
logging", "sourceType": "org.apache.camel.main.DefaultConfigurationProperties", 
"type": "boolean", "javaType": "boolean" },
+    { "name": "camel.main.uuidGenerator", "description": "UUID generator to 
use. default (32 bytes), short (16 bytes), classic (32 bytes or longer), simple 
(long incrementing counter)", "sourceType": 
"org.apache.camel.main.DefaultConfigurationProperties", "type": "string", 
"javaType": "java.lang.String", "defaultValue": "default", "enum": [ "classic", 
"default", "short", "simple" ] },
+    { "name": "camel.faulttolerance.bulkheadEnabled", "description": "Whether 
bulkhead is enabled or not on the circuit breaker. Default is false.", 
"sourceType": "org.apache.camel.main.FaultToleranceConfigurationProperties", 
"type": "boolean", "javaType": "java.lang.Boolean", "defaultValue": false },
+    { "name": "camel.faulttolerance.bulkheadExecutorServiceRef", 
"description": "References to a custom thread pool to use when bulkhead is 
enabled.", "sourceType": 
"org.apache.camel.main.FaultToleranceConfigurationProperties", "type": 
"string", "javaType": "java.lang.String" },
+    { "name": "camel.faulttolerance.bulkheadMaxConcurrentCalls", 
"description": "Configures the max amount of concurrent calls the bulkhead will 
support. Default value is 10.", "sourceType": 
"org.apache.camel.main.FaultToleranceConfigurationProperties", "type": 
"integer", "javaType": "java.lang.Integer", "defaultValue": 10 },
+    { "name": "camel.faulttolerance.bulkheadWaitingTaskQueue", "description": 
"Configures the task queue size for holding waiting tasks to be processed by 
the bulkhead. Default value is 10.", "sourceType": 
"org.apache.camel.main.FaultToleranceConfigurationProperties", "type": 
"integer", "javaType": "java.lang.Integer", "defaultValue": 10 },
+    { "name": "camel.faulttolerance.circuitBreakerRef", "description": "Refers 
to an existing io.smallrye.faulttolerance.core.circuit.breaker.CircuitBreaker 
instance to lookup and use from the registry. When using this, then any other 
circuit breaker options are not in use.", "sourceType": 
"org.apache.camel.main.FaultToleranceConfigurationProperties", "type": 
"string", "javaType": "java.lang.String" },
+    { "name": "camel.faulttolerance.delay", "description": "Control how long 
the circuit breaker stays open. The value are in seconds and the default is 5 
seconds.", "sourceType": 
"org.apache.camel.main.FaultToleranceConfigurationProperties", "type": 
"integer", "javaType": "java.lang.Long", "defaultValue": 5 },
+    { "name": "camel.faulttolerance.failureRatio", "description": "Configures 
the failure rate threshold in percentage. If the failure rate is equal or 
greater than the threshold the CircuitBreaker transitions to open and starts 
short-circuiting calls. The threshold must be greater than 0 and not greater 
than 100. Default value is 50 percentage.", "sourceType": 
"org.apache.camel.main.FaultToleranceConfigurationProperties", "type": 
"integer", "javaType": "java.lang.Integer", "defaultValue [...]
+    { "name": "camel.faulttolerance.requestVolumeThreshold", "description": 
"Controls the size of the rolling window used when the circuit breaker is 
closed Default value is 20.", "sourceType": 
"org.apache.camel.main.FaultToleranceConfigurationProperties", "type": 
"integer", "javaType": "java.lang.Integer", "defaultValue": 20 },
+    { "name": "camel.faulttolerance.successThreshold", "description": 
"Controls the number of trial calls which are allowed when the circuit breaker 
is half-open Default value is 1.", "sourceType": 
"org.apache.camel.main.FaultToleranceConfigurationProperties", "type": 
"integer", "javaType": "java.lang.Integer", "defaultValue": 1 },
+    { "name": "camel.faulttolerance.timeoutDuration", "description": 
"Configures the thread execution timeout. Default value is 1000 milliseconds.", 
"sourceType": "org.apache.camel.main.FaultToleranceConfigurationProperties", 
"type": "integer", "javaType": "java.lang.Long", "defaultValue": 1000 },
+    { "name": "camel.faulttolerance.timeoutEnabled", "description": "Whether 
timeout is enabled or not on the circuit breaker. Default is false.", 
"sourceType": "org.apache.camel.main.FaultToleranceConfigurationProperties", 
"type": "boolean", "javaType": "java.lang.Boolean", "defaultValue": false },
+    { "name": "camel.faulttolerance.timeoutPoolSize", "description": 
"Configures the pool size of the thread pool when timeout is enabled. Default 
value is 10.", "sourceType": 
"org.apache.camel.main.FaultToleranceConfigurationProperties", "type": 
"integer", "javaType": "java.lang.Integer", "defaultValue": 10 },
+    { "name": "camel.faulttolerance.timeoutScheduledExecutorServiceRef", 
"description": "References to a custom thread pool to use when timeout is 
enabled", "sourceType": 
"org.apache.camel.main.FaultToleranceConfigurationProperties", "type": 
"string", "javaType": "java.lang.String" },
+    { "name": "camel.health.config", "description": "Set additional 
HealthConfigurationProperties for fine grained configuration of health 
checks.", "sourceType": "org.apache.camel.main.HealthConfigurationProperties", 
"type": "object", "javaType": "java.util.Map" },
+    { "name": "camel.health.contextEnabled", "description": "Whether context 
health check is enabled", "sourceType": 
"org.apache.camel.main.HealthConfigurationProperties", "type": "boolean", 
"javaType": "java.lang.Boolean", "defaultValue": true },
+    { "name": "camel.health.enabled", "description": "Whether health check is 
enabled globally", "sourceType": 
"org.apache.camel.main.HealthConfigurationProperties", "type": "boolean", 
"javaType": "java.lang.Boolean", "defaultValue": true },
+    { "name": "camel.health.registryEnabled", "description": "Whether registry 
health check is enabled", "sourceType": 
"org.apache.camel.main.HealthConfigurationProperties", "type": "boolean", 
"javaType": "java.lang.Boolean", "defaultValue": true },
+    { "name": "camel.health.routesEnabled", "description": "Whether routes 
health check is enabled", "sourceType": 
"org.apache.camel.main.HealthConfigurationProperties", "type": "boolean", 
"javaType": "java.lang.Boolean", "defaultValue": true },
+    { "name": "camel.hystrix.allowMaximumSizeToDivergeFromCoreSize", 
"description": "Allows the configuration for maximumSize to take effect. That 
value can then be equal to, or higher, than coreSize", "sourceType": 
"org.apache.camel.main.HystrixConfigurationProperties", "type": "boolean", 
"javaType": "java.lang.Boolean", "deprecated": true },
+    { "name": "camel.hystrix.circuitBreakerEnabled", "description": "Whether 
to use a HystrixCircuitBreaker or not. If false no circuit-breaker logic will 
be used and all requests permitted. This is similar in effect to 
circuitBreakerForceClosed() except that continues tracking metrics and knowing 
whether it should be open\/closed, this property results in not even 
instantiating a circuit-breaker.", "sourceType": 
"org.apache.camel.main.HystrixConfigurationProperties", "type": "boolean",  
[...]
+    { "name": "camel.hystrix.circuitBreakerErrorThresholdPercentage", 
"description": "Error percentage threshold (as whole number such as 50) at 
which point the circuit breaker will trip open and reject requests. It will 
stay tripped for the duration defined in 
circuitBreakerSleepWindowInMilliseconds; The error percentage this is compared 
against comes from HystrixCommandMetrics.getHealthCounts().", "sourceType": 
"org.apache.camel.main.HystrixConfigurationProperties", "type": "integer",  
[...]
+    { "name": "camel.hystrix.circuitBreakerForceClosed", "description": "If 
true the HystrixCircuitBreaker#allowRequest() will always return true to allow 
requests regardless of the error percentage from 
HystrixCommandMetrics.getHealthCounts(). The circuitBreakerForceOpen() property 
takes precedence so if it set to true this property does nothing.", 
"sourceType": "org.apache.camel.main.HystrixConfigurationProperties", "type": 
"boolean", "javaType": "java.lang.Boolean", "deprecated": true },
+    { "name": "camel.hystrix.circuitBreakerForceOpen", "description": "If true 
the HystrixCircuitBreaker.allowRequest() will always return false, causing the 
circuit to be open (tripped) and reject all requests. This property takes 
precedence over circuitBreakerForceClosed();", "sourceType": 
"org.apache.camel.main.HystrixConfigurationProperties", "type": "boolean", 
"javaType": "java.lang.Boolean", "deprecated": true },
+    { "name": "camel.hystrix.circuitBreakerRequestVolumeThreshold", 
"description": "Minimum number of requests in the 
metricsRollingStatisticalWindowInMilliseconds() that must exist before the 
HystrixCircuitBreaker will trip. If below this number the circuit will not trip 
regardless of error percentage.", "sourceType": 
"org.apache.camel.main.HystrixConfigurationProperties", "type": "integer", 
"javaType": "java.lang.Integer", "deprecated": true },
+    { "name": "camel.hystrix.circuitBreakerSleepWindowInMilliseconds", 
"description": "The time in milliseconds after a HystrixCircuitBreaker trips 
open that it should wait before trying requests again.", "sourceType": 
"org.apache.camel.main.HystrixConfigurationProperties", "type": "integer", 
"javaType": "java.lang.Integer", "deprecated": true },
+    { "name": "camel.hystrix.corePoolSize", "description": "Core thread-pool 
size that gets passed to 
java.util.concurrent.ThreadPoolExecutor#setCorePoolSize(int)", "sourceType": 
"org.apache.camel.main.HystrixConfigurationProperties", "type": "integer", 
"javaType": "java.lang.Integer", "deprecated": true },
+    { "name": 
"camel.hystrix.executionIsolationSemaphoreMaxConcurrentRequests", 
"description": "Number of concurrent requests permitted to 
HystrixCommand.run(). Requests beyond the concurrent limit will be rejected. 
Applicable only when executionIsolationStrategy == SEMAPHORE.", "sourceType": 
"org.apache.camel.main.HystrixConfigurationProperties", "type": "integer", 
"javaType": "java.lang.Integer", "deprecated": true },
+    { "name": "camel.hystrix.executionIsolationStrategy", "description": "What 
isolation strategy HystrixCommand.run() will be executed with. If THREAD then 
it will be executed on a separate thread and concurrent requests limited by the 
number of threads in the thread-pool. If SEMAPHORE then it will be executed on 
the calling thread and concurrent requests limited by the semaphore count.", 
"sourceType": "org.apache.camel.main.HystrixConfigurationProperties", "type": 
"string", "javaType": [...]
+    { "name": "camel.hystrix.executionIsolationThreadInterruptOnTimeout", 
"description": "Whether the execution thread should attempt an interrupt (using 
Future#cancel ) when a thread times out. Applicable only when 
executionIsolationStrategy() == THREAD.", "sourceType": 
"org.apache.camel.main.HystrixConfigurationProperties", "type": "boolean", 
"javaType": "java.lang.Boolean", "deprecated": true },
+    { "name": "camel.hystrix.executionTimeoutEnabled", "description": "Whether 
the timeout mechanism is enabled for this command", "sourceType": 
"org.apache.camel.main.HystrixConfigurationProperties", "type": "boolean", 
"javaType": "java.lang.Boolean", "deprecated": true },
+    { "name": "camel.hystrix.executionTimeoutInMilliseconds", "description": 
"Time in milliseconds at which point the command will timeout and halt 
execution. If executionIsolationThreadInterruptOnTimeout == true and the 
command is thread-isolated, the executing thread will be interrupted. If the 
command is semaphore-isolated and a HystrixObservableCommand, that command will 
get unsubscribed.", "sourceType": 
"org.apache.camel.main.HystrixConfigurationProperties", "type": "integer", 
"java [...]
+    { "name": "camel.hystrix.fallbackEnabled", "description": "Whether 
HystrixCommand.getFallback() should be attempted when failure occurs.", 
"sourceType": "org.apache.camel.main.HystrixConfigurationProperties", "type": 
"boolean", "javaType": "java.lang.Boolean", "deprecated": true },
+    { "name": "camel.hystrix.fallbackIsolationSemaphoreMaxConcurrentRequests", 
"description": "Number of concurrent requests permitted to 
HystrixCommand.getFallback(). Requests beyond the concurrent limit will 
fail-fast and not attempt retrieving a fallback.", "sourceType": 
"org.apache.camel.main.HystrixConfigurationProperties", "type": "integer", 
"javaType": "java.lang.Integer", "deprecated": true },
+    { "name": "camel.hystrix.groupKey", "description": "Sets the group key to 
use. The default value is CamelHystrix.", "sourceType": 
"org.apache.camel.main.HystrixConfigurationProperties", "type": "string", 
"javaType": "java.lang.String", "deprecated": true },
+    { "name": "camel.hystrix.keepAliveTime", "description": "Keep-alive time 
in minutes that gets passed to 
ThreadPoolExecutor#setKeepAliveTime(long,TimeUnit)", "sourceType": 
"org.apache.camel.main.HystrixConfigurationProperties", "type": "integer", 
"javaType": "java.lang.Integer", "deprecated": true },
+    { "name": "camel.hystrix.maximumSize", "description": "Maximum thread-pool 
size that gets passed to ThreadPoolExecutor#setMaximumPoolSize(int) . This is 
the maximum amount of concurrency that can be supported without starting to 
reject HystrixCommands. Please note that this setting only takes effect if you 
also set allowMaximumSizeToDivergeFromCoreSize", "sourceType": 
"org.apache.camel.main.HystrixConfigurationProperties", "type": "integer", 
"javaType": "java.lang.Integer", "deprecat [...]
+    { "name": "camel.hystrix.maxQueueSize", "description": "Max queue size 
that gets passed to BlockingQueue in 
HystrixConcurrencyStrategy.getBlockingQueue(int) This should only affect the 
instantiation of a threadpool - it is not eliglible to change a queue size on 
the fly. For that, use queueSizeRejectionThreshold().", "sourceType": 
"org.apache.camel.main.HystrixConfigurationProperties", "type": "integer", 
"javaType": "java.lang.Integer", "deprecated": true },
+    { "name": "camel.hystrix.metricsHealthSnapshotIntervalInMilliseconds", 
"description": "Time in milliseconds to wait between allowing health snapshots 
to be taken that calculate success and error percentages and affect 
HystrixCircuitBreaker.isOpen() status. On high-volume circuits the continual 
calculation of error percentage can become CPU intensive thus this controls how 
often it is calculated.", "sourceType": 
"org.apache.camel.main.HystrixConfigurationProperties", "type": "integer" [...]
+    { "name": "camel.hystrix.metricsRollingPercentileBucketSize", 
"description": "Maximum number of values stored in each bucket of the rolling 
percentile. This is passed into HystrixRollingPercentile inside 
HystrixCommandMetrics.", "sourceType": 
"org.apache.camel.main.HystrixConfigurationProperties", "type": "integer", 
"javaType": "java.lang.Integer", "deprecated": true },
+    { "name": "camel.hystrix.metricsRollingPercentileEnabled", "description": 
"Whether percentile metrics should be captured using HystrixRollingPercentile 
inside HystrixCommandMetrics.", "sourceType": 
"org.apache.camel.main.HystrixConfigurationProperties", "type": "boolean", 
"javaType": "java.lang.Boolean", "deprecated": true },
+    { "name": "camel.hystrix.metricsRollingPercentileWindowBuckets", 
"description": "Number of buckets the rolling percentile window is broken into. 
This is passed into HystrixRollingPercentile inside HystrixCommandMetrics.", 
"sourceType": "org.apache.camel.main.HystrixConfigurationProperties", "type": 
"integer", "javaType": "java.lang.Integer", "deprecated": true },
+    { "name": "camel.hystrix.metricsRollingPercentileWindowInMilliseconds", 
"description": "Duration of percentile rolling window in milliseconds. This is 
passed into HystrixRollingPercentile inside HystrixCommandMetrics.", 
"sourceType": "org.apache.camel.main.HystrixConfigurationProperties", "type": 
"integer", "javaType": "java.lang.Integer", "deprecated": true },
+    { "name": "camel.hystrix.metricsRollingStatisticalWindowBuckets", 
"description": "Number of buckets the rolling statistical window is broken 
into. This is passed into HystrixRollingNumber inside HystrixCommandMetrics.", 
"sourceType": "org.apache.camel.main.HystrixConfigurationProperties", "type": 
"integer", "javaType": "java.lang.Integer", "deprecated": true },
+    { "name": "camel.hystrix.metricsRollingStatisticalWindowInMilliseconds", 
"description": "This property sets the duration of the statistical rolling 
window, in milliseconds. This is how long metrics are kept for the thread pool. 
The window is divided into buckets and rolls by those increments.", 
"sourceType": "org.apache.camel.main.HystrixConfigurationProperties", "type": 
"integer", "javaType": "java.lang.Integer", "deprecated": true },
+    { "name": "camel.hystrix.queueSizeRejectionThreshold", "description": 
"Queue size rejection threshold is an artificial max size at which rejections 
will occur even if maxQueueSize has not been reached. This is done because the 
maxQueueSize of a BlockingQueue can not be dynamically changed and we want to 
support dynamically changing the queue size that affects rejections. This is 
used by HystrixCommand when queuing a thread for execution.", "sourceType": 
"org.apache.camel.main.Hystrix [...]
+    { "name": "camel.hystrix.requestLogEnabled", "description": "Whether 
HystrixCommand execution and events should be logged to HystrixRequestLog.", 
"sourceType": "org.apache.camel.main.HystrixConfigurationProperties", "type": 
"boolean", "javaType": "java.lang.Boolean", "deprecated": true },
+    { "name": "camel.hystrix.threadPoolKey", "description": "Sets the thread 
pool key to use. Will by default use the same value as groupKey has been 
configured to use.", "sourceType": 
"org.apache.camel.main.HystrixConfigurationProperties", "type": "string", 
"javaType": "java.lang.String", "deprecated": true },
+    { "name": "camel.hystrix.threadPoolRollingNumberStatisticalWindowBuckets", 
"description": "Number of buckets the rolling statistical window is broken 
into. This is passed into HystrixRollingNumber inside each 
HystrixThreadPoolMetrics instance.", "sourceType": 
"org.apache.camel.main.HystrixConfigurationProperties", "type": "integer", 
"javaType": "java.lang.Integer", "deprecated": true },
+    { "name": 
"camel.hystrix.threadPoolRollingNumberStatisticalWindowInMilliseconds", 
"description": "Duration of statistical rolling window in milliseconds. This is 
passed into HystrixRollingNumber inside each HystrixThreadPoolMetrics 
instance.", "sourceType": 
"org.apache.camel.main.HystrixConfigurationProperties", "type": "integer", 
"javaType": "java.lang.Integer", "deprecated": true },
+    { "name": "camel.lra.coordinatorContextPath", "description": "The 
context-path for the LRA coordinator. Is default \/lra-coordinator", 
"sourceType": "org.apache.camel.main.LraConfigurationProperties", "type": 
"string", "javaType": "java.lang.String", "defaultValue": "\/lra-coordinator" },
+    { "name": "camel.lra.coordinatorUrl", "description": "The URL for the LRA 
coordinator service that orchestrates the transactions", "sourceType": 
"org.apache.camel.main.LraConfigurationProperties", "type": "string", 
"javaType": "java.lang.String" },
+    { "name": "camel.lra.localParticipantContextPath", "description": "The 
context-path for the local participant. Is default \/lra-participant", 
"sourceType": "org.apache.camel.main.LraConfigurationProperties", "type": 
"string", "javaType": "java.lang.String", "defaultValue": "\/lra-participant" },
+    { "name": "camel.lra.localParticipantUrl", "description": "The URL for the 
local participant", "sourceType": 
"org.apache.camel.main.LraConfigurationProperties", "type": "string", 
"javaType": "java.lang.String" },
+    { "name": 
"camel.resilience4j.automaticTransitionFromOpenToHalfOpenEnabled", 
"description": "Enables automatic transition from OPEN to HALF_OPEN state once 
the waitDurationInOpenState has passed.", "sourceType": 
"org.apache.camel.main.Resilience4jConfigurationProperties", "type": "boolean", 
"javaType": "java.lang.Boolean" },
+    { "name": "camel.resilience4j.bulkheadEnabled", "description": "Whether 
bulkhead is enabled or not on the circuit breaker.", "sourceType": 
"org.apache.camel.main.Resilience4jConfigurationProperties", "type": "boolean", 
"javaType": "java.lang.Boolean", "defaultValue": false },
+    { "name": "camel.resilience4j.bulkheadMaxConcurrentCalls", "description": 
"Configures the max amount of concurrent calls the bulkhead will support.", 
"sourceType": "org.apache.camel.main.Resilience4jConfigurationProperties", 
"type": "integer", "javaType": "java.lang.Integer" },
+    { "name": "camel.resilience4j.bulkheadMaxWaitDuration", "description": 
"Configures a maximum amount of time which the calling thread will wait to 
enter the bulkhead. If bulkhead has space available, entry is guaranteed and 
immediate. If bulkhead is full, calling threads will contest for space, if it 
becomes available. maxWaitDuration can be set to 0. Note: for threads running 
on an event-loop or equivalent (rx computation pool, etc), setting 
maxWaitDuration to 0 is highly recommended [...]
+    { "name": "camel.resilience4j.circuitBreakerRef", "description": "Refers 
to an existing io.github.resilience4j.circuitbreaker.CircuitBreaker instance to 
lookup and use from the registry. When using this, then any other circuit 
breaker options are not in use.", "sourceType": 
"org.apache.camel.main.Resilience4jConfigurationProperties", "type": "string", 
"javaType": "java.lang.String" },
+    { "name": "camel.resilience4j.configRef", "description": "Refers to an 
existing io.github.resilience4j.circuitbreaker.CircuitBreakerConfig instance to 
lookup and use from the registry.", "sourceType": 
"org.apache.camel.main.Resilience4jConfigurationProperties", "type": "string", 
"javaType": "java.lang.String" },
+    { "name": "camel.resilience4j.failureRateThreshold", "description": 
"Configures the failure rate threshold in percentage. If the failure rate is 
equal or greater than the threshold the CircuitBreaker transitions to open and 
starts short-circuiting calls. The threshold must be greater than 0 and not 
greater than 100. Default value is 50 percentage.", "sourceType": 
"org.apache.camel.main.Resilience4jConfigurationProperties", "type": "number", 
"javaType": "java.lang.Float", "defaultValu [...]
+    { "name": "camel.resilience4j.minimumNumberOfCalls", "description": 
"Configures configures the minimum number of calls which are required (per 
sliding window period) before the CircuitBreaker can calculate the error rate. 
For example, if minimumNumberOfCalls is 10, then at least 10 calls must be 
recorded, before the failure rate can be calculated. If only 9 calls have been 
recorded the CircuitBreaker will not transition to open even if all 9 calls 
have failed. Default minimumNumberOf [...]
+    { "name": "camel.resilience4j.permittedNumberOfCallsInHalfOpenState", 
"description": "Configures the number of permitted calls when the 
CircuitBreaker is half open. The size must be greater than 0. Default size is 
10.", "sourceType": 
"org.apache.camel.main.Resilience4jConfigurationProperties", "type": "integer", 
"javaType": "java.lang.Integer", "defaultValue": 10 },
+    { "name": "camel.resilience4j.slidingWindowSize", "description": 
"Configures the size of the sliding window which is used to record the outcome 
of calls when the CircuitBreaker is closed. slidingWindowSize configures the 
size of the sliding window. Sliding window can either be count-based or 
time-based. If slidingWindowType is COUNT_BASED, the last slidingWindowSize 
calls are recorded and aggregated. If slidingWindowType is TIME_BASED, the 
calls of the last slidingWindowSize seconds  [...]
+    { "name": "camel.resilience4j.slidingWindowType", "description": 
"Configures the type of the sliding window which is used to record the outcome 
of calls when the CircuitBreaker is closed. Sliding window can either be 
count-based or time-based. If slidingWindowType is COUNT_BASED, the last 
slidingWindowSize calls are recorded and aggregated. If slidingWindowType is 
TIME_BASED, the calls of the last slidingWindowSize seconds are recorded and 
aggregated. Default slidingWindowType is COU [...]
+    { "name": "camel.resilience4j.slowCallDurationThreshold", "description": 
"Configures the duration threshold (seconds) above which calls are considered 
as slow and increase the slow calls percentage. Default value is 60 seconds.", 
"sourceType": "org.apache.camel.main.Resilience4jConfigurationProperties", 
"type": "integer", "javaType": "java.lang.Integer", "defaultValue": 60 },
+    { "name": "camel.resilience4j.slowCallRateThreshold", "description": 
"Configures a threshold in percentage. The CircuitBreaker considers a call as 
slow when the call duration is greater than slowCallDurationThreshold(Duration. 
When the percentage of slow calls is equal or greater the threshold, the 
CircuitBreaker transitions to open and starts short-circuiting calls. The 
threshold must be greater than 0 and not greater than 100. Default value is 100 
percentage which means that all re [...]
+    { "name": "camel.resilience4j.timeoutCancelRunningFuture", "description": 
"Configures whether cancel is called on the running future. Defaults to true.", 
"sourceType": "org.apache.camel.main.Resilience4jConfigurationProperties", 
"type": "boolean", "javaType": "java.lang.Boolean", "defaultValue": true },
+    { "name": "camel.resilience4j.timeoutDuration", "description": "Configures 
the thread execution timeout (millis). Default value is 1000 millis (1 
second).", "sourceType": 
"org.apache.camel.main.Resilience4jConfigurationProperties", "type": "integer", 
"javaType": "java.lang.Integer", "defaultValue": 1000 },
+    { "name": "camel.resilience4j.timeoutEnabled", "description": "Whether 
timeout is enabled or not on the circuit breaker. Default is false.", 
"sourceType": "org.apache.camel.main.Resilience4jConfigurationProperties", 
"type": "boolean", "javaType": "java.lang.Boolean", "defaultValue": false },
+    { "name": "camel.resilience4j.timeoutExecutorServiceRef", "description": 
"References to a custom thread pool to use when timeout is enabled (uses 
ForkJoinPool#commonPool() by default)", "sourceType": 
"org.apache.camel.main.Resilience4jConfigurationProperties", "type": "string", 
"javaType": "java.lang.String" },
+    { "name": "camel.resilience4j.waitDurationInOpenState", "description": 
"Configures the wait duration (in seconds) which specifies how long the 
CircuitBreaker should stay open, before it switches to half open. Default value 
is 60 seconds.", "sourceType": 
"org.apache.camel.main.Resilience4jConfigurationProperties", "type": "integer", 
"javaType": "java.lang.Integer", "defaultValue": 60 },
+    { "name": "camel.resilience4j.writableStackTraceEnabled", "description": 
"Enables writable stack traces. When set to false, Exception.getStackTrace 
returns a zero length array. This may be used to reduce log spam when the 
circuit breaker is open as the cause of the exceptions is already known (the 
circuit breaker is short-circuiting calls).", "sourceType": 
"org.apache.camel.main.Resilience4jConfigurationProperties", "type": "boolean", 
"javaType": "java.lang.Boolean" },
+    { "name": "camel.rest.apiComponent", "description": "Sets the name of the 
Camel component to use as the REST API (such as swagger or openapi)", 
"sourceType": "org.apache.camel.spi.RestConfiguration", "type": "string", 
"javaType": "java.lang.String" },
+    { "name": "camel.rest.apiContextIdPattern", "description": "Optional 
CamelContext id pattern to only allow Rest APIs from rest services within 
CamelContext's which name matches the pattern. The pattern #name# refers to the 
CamelContext name, to match on the current CamelContext only. For any other 
value, the pattern uses the rules from 
org.apache.camel.support.EndpointHelper#matchPattern(String,String)", 
"sourceType": "org.apache.camel.spi.RestConfiguration", "type": "string", 
"javaT [...]
+    { "name": "camel.rest.apiContextListing", "description": "Sets whether 
listing of all available CamelContext's with REST services in the JVM is 
enabled. If enabled it allows to discover these contexts, if false then only 
the current CamelContext is in use.", "sourceType": 
"org.apache.camel.spi.RestConfiguration", "type": "boolean", "javaType": 
"boolean" },
+    { "name": "camel.rest.apiContextPath", "description": "Sets a leading API 
context-path the REST API services will be using. This can be used when using 
components such as camel-servlet where the deployed web application is deployed 
using a context-path.", "sourceType": "org.apache.camel.spi.RestConfiguration", 
"type": "string", "javaType": "java.lang.String" },
+    { "name": "camel.rest.apiContextRouteId", "description": "Sets the route 
id to use for the route that services the REST API. The route will by default 
use an auto assigned route id.", "sourceType": 
"org.apache.camel.spi.RestConfiguration", "type": "string", "javaType": 
"java.lang.String" },
+    { "name": "camel.rest.apiHost", "description": "To use an specific 
hostname for the API documentation (eg swagger) This can be used to override 
the generated host with this configured hostname", "sourceType": 
"org.apache.camel.spi.RestConfiguration", "type": "string", "javaType": 
"java.lang.String" },
+    { "name": "camel.rest.apiProperties", "description": "Sets additional 
options on api level", "sourceType": "org.apache.camel.spi.RestConfiguration", 
"type": "object", "javaType": "java.util.Map" },
+    { "name": "camel.rest.apiVendorExtension", "description": "Whether vendor 
extension is enabled in the Rest APIs. If enabled then Camel will include 
additional information as vendor extension (eg keys starting with x-) such as 
route ids, class names etc. Not all 3rd party API gateways and tools supports 
vendor-extensions when importing your API docs.", "sourceType": 
"org.apache.camel.spi.RestConfiguration", "type": "boolean", "javaType": 
"boolean" },
+    { "name": "camel.rest.bindingMode", "description": "Sets the binding mode 
to be used by the REST consumer", "sourceType": 
"org.apache.camel.spi.RestConfiguration", "type": "object", "javaType": 
"org.apache.camel.spi.RestBindingMode", "defaultValue": "RestBindingMode.off", 
"enum": [ "auto", "off", "json", "xml", "json_xml" ] },
+    { "name": "camel.rest.clientRequestValidation", "description": "Whether to 
enable validation of the client request to check whether the Content-Type and 
Accept headers from the client is supported by the Rest-DSL configuration of 
its consumes\/produces settings. This can be turned on, to enable this check. 
In case of validation error, then HTTP Status codes 415 or 406 is returned. The 
default value is false.", "sourceType": 
"org.apache.camel.spi.RestConfiguration", "type": "boolean", [...]
+    { "name": "camel.rest.component", "description": "Sets the name of the 
Camel component to use as the REST consumer", "sourceType": 
"org.apache.camel.spi.RestConfiguration", "type": "string", "javaType": 
"java.lang.String" },
+    { "name": "camel.rest.componentProperties", "description": "Sets 
additional options on component level", "sourceType": 
"org.apache.camel.spi.RestConfiguration", "type": "object", "javaType": 
"java.util.Map" },
+    { "name": "camel.rest.consumerProperties", "description": "Sets additional 
options on consumer level", "sourceType": 
"org.apache.camel.spi.RestConfiguration", "type": "object", "javaType": 
"java.util.Map" },
+    { "name": "camel.rest.contextPath", "description": "Sets a leading 
context-path the REST services will be using. This can be used when using 
components such as camel-servlet where the deployed web application is deployed 
using a context-path. Or for components such as camel-jetty or camel-netty-http 
that includes a HTTP server.", "sourceType": 
"org.apache.camel.spi.RestConfiguration", "type": "string", "javaType": 
"java.lang.String" },
+    { "name": "camel.rest.corsHeaders", "description": "Sets the CORS headers 
to use if CORS has been enabled.", "sourceType": 
"org.apache.camel.spi.RestConfiguration", "type": "object", "javaType": 
"java.util.Map" },
+    { "name": "camel.rest.dataFormatProperties", "description": "Sets 
additional options on data format level", "sourceType": 
"org.apache.camel.spi.RestConfiguration", "type": "object", "javaType": 
"java.util.Map" },
+    { "name": "camel.rest.enableCORS", "description": "To specify whether to 
enable CORS which means Camel will automatic include CORS in the HTTP headers 
in the response. This option is default false", "sourceType": 
"org.apache.camel.spi.RestConfiguration", "type": "boolean", "javaType": 
"boolean" },
+    { "name": "camel.rest.endpointProperties", "description": "Sets additional 
options on endpoint level", "sourceType": 
"org.apache.camel.spi.RestConfiguration", "type": "object", "javaType": 
"java.util.Map" },
+    { "name": "camel.rest.host", "description": "Sets the hostname to use by 
the REST consumer", "sourceType": "org.apache.camel.spi.RestConfiguration", 
"type": "string", "javaType": "java.lang.String" },
+    { "name": "camel.rest.hostNameResolver", "description": "Sets the resolver 
to use for resolving hostname", "sourceType": 
"org.apache.camel.spi.RestConfiguration", "type": "object", "javaType": 
"org.apache.camel.spi.RestHostNameResolver", "defaultValue": 
"RestHostNameResolver.allLocalIp", "enum": [ "allLocalIp", "localIp", 
"localHostName" ] },
+    { "name": "camel.rest.jsonDataFormat", "description": "Sets a custom json 
data format to be used Important: This option is only for setting a custom name 
of the data format, not to refer to an existing data format instance.", 
"sourceType": "org.apache.camel.spi.RestConfiguration", "type": "string", 
"javaType": "java.lang.String" },
+    { "name": "camel.rest.port", "description": "Sets the port to use by the 
REST consumer", "sourceType": "org.apache.camel.spi.RestConfiguration", "type": 
"integer", "javaType": "int" },
+    { "name": "camel.rest.producerApiDoc", "description": "Sets the location 
of the api document (swagger api) the REST producer will use to validate the 
REST uri and query parameters are valid accordingly to the api document. This 
requires adding camel-swagger-java to the classpath, and any miss configuration 
will let Camel fail on startup and report the error(s). The location of the api 
document is loaded from classpath by default, but you can use file: or http: to 
refer to resources t [...]
+    { "name": "camel.rest.producerComponent", "description": "Sets the name of 
the Camel component to use as the REST producer", "sourceType": 
"org.apache.camel.spi.RestConfiguration", "type": "string", "javaType": 
"java.lang.String" },
+    { "name": "camel.rest.scheme", "description": "Sets the scheme to use by 
the REST consumer", "sourceType": "org.apache.camel.spi.RestConfiguration", 
"type": "string", "javaType": "java.lang.String" },
+    { "name": "camel.rest.skipBindingOnErrorCode", "description": "Whether to 
skip binding output if there is a custom HTTP error code, and instead use the 
response body as-is. This option is default true.", "sourceType": 
"org.apache.camel.spi.RestConfiguration", "type": "boolean", "javaType": 
"boolean", "defaultValue": true },
+    { "name": "camel.rest.useXForwardHeaders", "description": "WWhether to use 
X-Forward headers to set host etc. for Swagger. This option is default true.", 
"sourceType": "org.apache.camel.spi.RestConfiguration", "type": "boolean", 
"javaType": "boolean", "defaultValue": true },
+    { "name": "camel.rest.xmlDataFormat", "description": "Sets a custom xml 
data format to be used. Important: This option is only for setting a custom 
name of the data format, not to refer to an existing data format instance.", 
"sourceType": "org.apache.camel.spi.RestConfiguration", "type": "string", 
"javaType": "java.lang.String" },
+    { "name": "camel.threadpool.allowCoreThreadTimeOut", "description": "Sets 
default whether to allow core threads to timeout", "sourceType": 
"org.apache.camel.main.ThreadPoolConfigurationProperties", "type": "boolean", 
"javaType": "java.lang.Boolean" },
+    { "name": "camel.threadpool.config", "description": "Adds a configuration 
for a specific thread pool profile (inherits default values)", "sourceType": 
"org.apache.camel.main.ThreadPoolConfigurationProperties", "type": "object", 
"javaType": "java.util.Map" },
+    { "name": "camel.threadpool.keepAliveTime", "description": "Sets the 
default keep alive time for inactive threads", "sourceType": 
"org.apache.camel.main.ThreadPoolConfigurationProperties", "type": "integer", 
"javaType": "java.lang.Long" },
+    { "name": "camel.threadpool.maxPoolSize", "description": "Sets the default 
maximum pool size", "sourceType": 
"org.apache.camel.main.ThreadPoolConfigurationProperties", "type": "integer", 
"javaType": "java.lang.Integer" },
+    { "name": "camel.threadpool.maxQueueSize", "description": "Sets the 
default maximum number of tasks in the work queue. Use -1 or an unbounded 
queue", "sourceType": 
"org.apache.camel.main.ThreadPoolConfigurationProperties", "type": "integer", 
"javaType": "java.lang.Integer" },
+    { "name": "camel.threadpool.poolSize", "description": "Sets the default 
core pool size (threads to keep minimum in pool)", "sourceType": 
"org.apache.camel.main.ThreadPoolConfigurationProperties", "type": "integer", 
"javaType": "java.lang.Integer" },
+    { "name": "camel.threadpool.rejectedPolicy", "description": "Sets the 
default handler for tasks which cannot be executed by the thread pool.", 
"sourceType": "org.apache.camel.main.ThreadPoolConfigurationProperties", 
"type": "object", "javaType": 
"org.apache.camel.util.concurrent.ThreadPoolRejectedPolicy", "enum": [ "Abort", 
"CallerRuns", "DiscardOldest", "Discard" ] },
+    { "name": "camel.threadpool.timeUnit", "description": "Sets the default 
time unit used for keep alive time", "sourceType": 
"org.apache.camel.main.ThreadPoolConfigurationProperties", "type": "object", 
"javaType": "java.util.concurrent.TimeUnit" }
+  ]
+}
diff --git 
a/components/camel-servlet/src/test/java/org/apache/camel/component/servlet/ServletStreamingGzipChunkedTest.java
 
b/components/camel-servlet/src/test/java/org/apache/camel/component/servlet/ServletStreamingGzipChunkedTest.java
new file mode 100644
index 0000000..3c3fab5
--- /dev/null
+++ 
b/components/camel-servlet/src/test/java/org/apache/camel/component/servlet/ServletStreamingGzipChunkedTest.java
@@ -0,0 +1,105 @@
+/*
+ * 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.servlet;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.PipedInputStream;
+import java.io.PipedOutputStream;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.util.IOHelper;
+import org.junit.jupiter.api.Disabled;
+import org.junit.jupiter.api.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Run this test, and then use curl to call the service such as:
+ *
+ * curl --output out.gzip http://localhost:50750/mycontext/services/hello
+ *
+ */
+@Disabled("Manual test")
+public class ServletStreamingGzipChunkedTest extends 
ServletCamelRouterTestSupport {
+
+    private static final Logger LOG = 
LoggerFactory.getLogger(ServletStreamingGzipChunkedTest.class);
+
+    private PipedOutputStream pos = new PipedOutputStream();
+    private PipedInputStream pis;
+
+    @Test
+    public void testManual() throws Exception {
+        LOG.info("Sleeping 10 sec");
+        Thread.sleep(10000);
+
+        // use background thread to write to stream that camel-servlet uses as 
response
+        context.getExecutorServiceManager().newSingleThreadExecutor(this, 
"writer").execute(() -> {
+            try {
+                File file = new File("src/test/data/big-payload.json");
+                FileInputStream fis = new FileInputStream(file);
+
+                LOG.info(">>>> sleeping <<<<");
+                Thread.sleep(1000);
+                LOG.info(">>>> writing <<<<");
+
+                int ch = 0;
+                int len = 0;
+                while (ch != -1) {
+                    ch = fis.read();
+                    pos.write(ch);
+                    len++;
+                    if (len % 1000 == 0) {
+                        LOG.info(">>>> sleeping <<<<");
+                        pos.flush();
+                        Thread.sleep(250);
+                        LOG.info(">>>> writing <<<<");
+                    }
+                }
+
+                LOG.info(">>>> Payload size: " + len);
+                LOG.info(">>>> writing EOL <<<<");
+                pos.flush();
+
+            } catch (Exception e) {
+                // ignore
+            } finally {
+                LOG.info(">>>> closing <<<<");
+                IOHelper.close(pos);
+            }
+        });
+
+        LOG.info("Sleeping 60 sec");
+        Thread.sleep(60000);
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                pis = new PipedInputStream(pos);
+
+                from("servlet:/hello")
+                        .setHeader(Exchange.CONTENT_ENCODING, constant("gzip"))
+                        .setBody().constant(pis);
+            }
+        };
+    }
+
+}

Reply via email to