This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git


The following commit(s) were added to refs/heads/main by this push:
     new d15cc12604c CAMEL-18098: camel-core - Stream caching should not spool 
to disk by default
d15cc12604c is described below

commit d15cc12604c02e0f01f565f5bebe31942828100a
Author: Claus Ibsen <[email protected]>
AuthorDate: Wed May 11 16:01:56 2022 +0200

    CAMEL-18098: camel-core - Stream caching should not spool to disk by default
---
 .../processor/SpringStreamCachingStrategyTest.xml  |  2 +-
 .../apache/camel/spi/StreamCachingStrategy.java    | 14 +++++++
 .../camel/impl/engine/AbstractCamelContext.java    |  8 ++--
 .../impl/engine/DefaultStreamCachingStrategy.java  | 28 +++++++++-----
 .../org/apache/camel/core/xml/streamCaching.json   |  5 ++-
 .../core/xml/AbstractCamelContextFactoryBean.java  |  8 ++++
 .../xml/CamelStreamCachingStrategyDefinition.java  | 37 ++++++++++++++++--
 .../converter/stream/CachedOutputStreamTest.java   |  1 +
 .../MulticastParallelTimeoutStreamCachingTest.java |  1 +
 .../RedeliveryErrorHandlerNonBlockedDelayTest.java |  4 +-
 .../StreamCachingSpoolDirectoryQuarkusTest.java    |  1 +
 .../MainConfigurationPropertiesConfigurer.java     |  6 +++
 .../camel-main-configuration-metadata.json         |  3 +-
 core/camel-main/src/main/docs/main.adoc            |  5 ++-
 .../camel/main/DefaultConfigurationConfigurer.java |  1 +
 .../camel/main/DefaultConfigurationProperties.java | 44 +++++++++++++++++++++-
 .../ROOT/pages/camel-3x-upgrade-guide-3_17.adoc    | 41 ++++++++++++++++++++
 17 files changed, 182 insertions(+), 27 deletions(-)

diff --git 
a/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/processor/SpringStreamCachingStrategyTest.xml
 
b/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/processor/SpringStreamCachingStrategyTest.xml
index 2d76c4f4d7e..b1383a12cc2 100644
--- 
a/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/processor/SpringStreamCachingStrategyTest.xml
+++ 
b/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/processor/SpringStreamCachingStrategyTest.xml
@@ -26,7 +26,7 @@
 
   <camelContext streamCache="true" 
xmlns="http://camel.apache.org/schema/spring";>
 
-    <streamCaching id="myCacheConfig" bufferSize="2048" 
spoolDirectory="target/cachedir" spoolThreshold="8192"/>
+    <streamCaching id="myCacheConfig" spoolEnabled="true" bufferSize="2048" 
spoolDirectory="target/cachedir" spoolThreshold="8192"/>
 
     <route>
       <from uri="direct:c"/>
diff --git 
a/core/camel-api/src/main/java/org/apache/camel/spi/StreamCachingStrategy.java 
b/core/camel-api/src/main/java/org/apache/camel/spi/StreamCachingStrategy.java
index 5c5eb1c47e0..4918f3974fa 100644
--- 
a/core/camel-api/src/main/java/org/apache/camel/spi/StreamCachingStrategy.java
+++ 
b/core/camel-api/src/main/java/org/apache/camel/spi/StreamCachingStrategy.java
@@ -114,6 +114,20 @@ public interface StreamCachingStrategy extends 
StaticService {
 
     boolean isEnabled();
 
+    /**
+     * Enables spooling to disk.
+     * <p/>
+     * <b>Notice:</b> This cannot be changed at runtime.
+     *
+     * Default is disabled.
+     */
+    void setSpoolEnabled(boolean spoolEnabled);
+
+    /**
+     * Is spooling to disk enabled.
+     */
+    boolean isSpoolEnabled();
+
     /**
      * Sets the spool (temporary) directory to use for overflow and spooling 
to disk.
      * <p/>
diff --git 
a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java
 
b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java
index 88b2c2e81e9..bdd9d7d0440 100644
--- 
a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java
+++ 
b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java
@@ -3209,13 +3209,13 @@ public abstract class AbstractCamelContext extends 
BaseService
                     getClassResolver(),
                     getPackageScanClassResolver(), 
getApplicationContextClassLoader(), getRouteController());
         }
-        if (!isStreamCaching()) {
+        if (isStreamCaching()) {
             // stream caching is default enabled so lets report if it has been 
disabled
-            LOG.info("StreamCaching is disabled on CamelContext: {}", 
getName());
+            LOG.debug("StreamCaching is disabled on CamelContext: {}", 
getName());
         }
         if (isBacklogTracing()) {
             // tracing is added in the DefaultChannel so we can enable it on 
the fly
-            LOG.info("Backlog Tracing is enabled on CamelContext: {}", 
getName());
+            LOG.debug("Backlog Tracing is enabled on CamelContext: {}", 
getName());
         }
         if (isTracing()) {
             // tracing is added in the DefaultChannel so we can enable it on 
the fly
@@ -3298,7 +3298,7 @@ public abstract class AbstractCamelContext extends 
BaseService
 
         if (isUseDataType()) {
             // log if DataType has been enabled
-            LOG.info("Message DataType is enabled on CamelContext: {}", 
getName());
+            LOG.debug("Message DataType is enabled on CamelContext: {}", 
getName());
         }
 
         // is there any stream caching enabled then log an info about this and
diff --git 
a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultStreamCachingStrategy.java
 
b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultStreamCachingStrategy.java
index 2d0bd1ca242..88eb40a706d 100644
--- 
a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultStreamCachingStrategy.java
+++ 
b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultStreamCachingStrategy.java
@@ -44,6 +44,7 @@ public class DefaultStreamCachingStrategy extends 
ServiceSupport implements Came
 
     private CamelContext camelContext;
     private boolean enabled;
+    private boolean spoolEnabled;
     private File spoolDirectory;
     private transient String spoolDirectoryName = 
"${java.io.tmpdir}/camel/camel-tmp-#uuid#";
     private long spoolThreshold = StreamCache.DEFAULT_SPOOL_THRESHOLD;
@@ -76,6 +77,16 @@ public class DefaultStreamCachingStrategy extends 
ServiceSupport implements Came
         this.enabled = enabled;
     }
 
+    @Override
+    public boolean isSpoolEnabled() {
+        return spoolEnabled;
+    }
+
+    @Override
+    public void setSpoolEnabled(boolean spoolEnabled) {
+        this.spoolEnabled = spoolEnabled;
+    }
+
     @Override
     public void setSpoolDirectory(String path) {
         this.spoolDirectoryName = path;
@@ -279,12 +290,10 @@ public class DefaultStreamCachingStrategy extends 
ServiceSupport implements Came
         }
 
         // if we can overflow to disk then make sure directory exists / is 
created
-        if (spoolThreshold > 0 || spoolUsedHeapMemoryThreshold > 0) {
-
+        if (spoolEnabled && (spoolThreshold > 0 || 
spoolUsedHeapMemoryThreshold > 0)) {
             if (spoolDirectory == null && spoolDirectoryName == null) {
                 throw new IllegalArgumentException("SpoolDirectory must be 
configured when using SpoolThreshold > 0");
             }
-
             if (spoolDirectory == null) {
                 String name = resolveSpoolDirectory(spoolDirectoryName);
                 if (name != null) {
@@ -294,7 +303,6 @@ public class DefaultStreamCachingStrategy extends 
ServiceSupport implements Came
                     throw new IllegalStateException("Cannot resolve spool 
directory from pattern: " + spoolDirectoryName);
                 }
             }
-
             if (spoolDirectory.exists()) {
                 if (spoolDirectory.isDirectory()) {
                     LOG.debug("Using spool directory: {}", spoolDirectory);
@@ -312,9 +320,7 @@ public class DefaultStreamCachingStrategy extends 
ServiceSupport implements Came
                 } else {
                     LOG.debug("Created spool directory: {}", spoolDirectory);
                 }
-
             }
-
             if (spoolThreshold > 0) {
                 spoolRules.add(new FixedThresholdSpoolRule());
             }
@@ -331,14 +337,17 @@ public class DefaultStreamCachingStrategy extends 
ServiceSupport implements Came
 
         if (spoolDirectory != null) {
             LOG.info("StreamCaching in use with spool directory: {} and rules: 
{}", spoolDirectory.getPath(), spoolRules);
-        } else {
+        } else if (!spoolRules.isEmpty()) {
             LOG.info("StreamCaching in use with rules: {}", spoolRules);
+        } else {
+            // reduce logging noise when its in-memory stream caching
+            LOG.debug("StreamCaching in use");
         }
     }
 
     @Override
     protected void doStop() throws Exception {
-        if (spoolThreshold > 0 & spoolDirectory != null && 
isRemoveSpoolDirectoryWhenStopping()) {
+        if (spoolEnabled && (spoolThreshold > 0 & spoolDirectory != null && 
isRemoveSpoolDirectoryWhenStopping())) {
             LOG.debug("Removing spool directory: {}", spoolDirectory);
             FileUtil.removeDir(spoolDirectory);
         }
@@ -353,7 +362,8 @@ public class DefaultStreamCachingStrategy extends 
ServiceSupport implements Came
     @Override
     public String toString() {
         return "DefaultStreamCachingStrategy["
-               + "spoolDirectory=" + spoolDirectory
+               + "spoolDirectoryEnabled=" + spoolEnabled
+               + ", spoolDirectory=" + spoolDirectory
                + ", spoolCipher=" + spoolCipher
                + ", spoolThreshold=" + spoolThreshold
                + ", spoolUsedHeapMemoryThreshold=" + 
spoolUsedHeapMemoryThreshold
diff --git 
a/core/camel-core-xml/src/generated/resources/org/apache/camel/core/xml/streamCaching.json
 
b/core/camel-core-xml/src/generated/resources/org/apache/camel/core/xml/streamCaching.json
index 5cd31cbfaff..c0e2a90ade1 100644
--- 
a/core/camel-core-xml/src/generated/resources/org/apache/camel/core/xml/streamCaching.json
+++ 
b/core/camel-core-xml/src/generated/resources/org/apache/camel/core/xml/streamCaching.json
@@ -12,7 +12,8 @@
     "output": false
   },
   "properties": {
-    "enabled": { "kind": "attribute", "displayName": "Enabled", "required": 
false, "type": "string", "javaType": "java.lang.String", "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": "false", "description": 
"Sets whether the stream caching is enabled. Notice: This cannot be changed at 
runtime." },
+    "enabled": { "kind": "attribute", "displayName": "Enabled", "required": 
false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": true, "description": "Sets 
whether stream caching is enabled or not. While stream types (like 
StreamSource, InputStream and Reader) are commonly used in messaging for 
performance reasons, they also have an important drawback: they can only be 
read once. In order to be able to work w [...]
+    "spoolEnabled": { "kind": "attribute", "displayName": "Spool Enabled", 
"required": false, "type": "boolean", "javaType": "java.lang.Boolean", 
"deprecated": false, "autowired": false, "secret": false, "defaultValue": 
false, "description": "To enable stream caching spooling to disk. This means, 
for large stream messages (over 128 KB by default) will be cached in a 
temporary file instead, and Camel will handle deleting the temporary file once 
the cached stream is no longer necessary. De [...]
     "spoolDirectory": { "kind": "attribute", "displayName": "Spool Directory", 
"required": false, "type": "string", "javaType": "java.lang.String", 
"deprecated": false, "autowired": false, "secret": false, "description": "Sets 
the 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." },
     "spoolCipher": { "kind": "attribute", "displayName": "Spool Cipher", 
"required": false, "type": "string", "javaType": "java.lang.String", 
"deprecated": false, "autowired": false, "secret": false, "description": "Sets 
a cipher name to use when spooling to disk to write with encryption. By default 
the data is not encrypted." },
     "spoolThreshold": { "kind": "attribute", "displayName": "Spool Threshold", 
"required": false, "type": "string", "javaType": "java.lang.String", 
"deprecated": false, "autowired": false, "secret": false, "description": 
"Threshold in bytes when overflow to disk is activated. The default threshold 
is org.apache.camel.StreamCache#DEFAULT_SPOOL_THRESHOLD bytes (eg 128kb). Use 
-1 to disable overflow to disk." },
@@ -21,7 +22,7 @@
     "spoolRules": { "kind": "attribute", "displayName": "Spool Rules", 
"required": false, "type": "string", "javaType": "java.lang.String", 
"deprecated": false, "autowired": false, "secret": false, "description": 
"Reference to one or more custom 
org.apache.camel.spi.StreamCachingStrategy.SpoolRule to use. Multiple rules can 
be separated by comma." },
     "bufferSize": { "kind": "attribute", "displayName": "Buffer Size", 
"required": false, "type": "string", "javaType": "java.lang.String", 
"deprecated": false, "autowired": false, "secret": false, "description": "Sets 
the buffer size to use when allocating in-memory buffers used for in-memory 
stream caches. The default size is 
org.apache.camel.util.IOHelper#DEFAULT_BUFFER_SIZE" },
     "removeSpoolDirectoryWhenStopping": { "kind": "attribute", "displayName": 
"Remove Spool Directory When Stopping", "required": false, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "autowired": false, 
"secret": false, "defaultValue": "true", "description": "Whether to remove the 
temporary directory when stopping. This option is default true" },
-    "statisticsEnabled": { "kind": "attribute", "displayName": "Statistics 
Enabled", "required": false, "type": "string", "javaType": "java.lang.String", 
"deprecated": false, "autowired": false, "secret": false, "description": "Sets 
whether statistics is enabled." },
+    "statisticsEnabled": { "kind": "attribute", "displayName": "Statistics 
Enabled", "required": false, "type": "boolean", "javaType": 
"java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": false, "description": "Sets whether statistics is enabled." },
     "anySpoolRules": { "kind": "attribute", "displayName": "Any Spool Rules", 
"required": false, "type": "string", "javaType": "java.lang.String", 
"deprecated": false, "autowired": false, "secret": false, "defaultValue": 
"false", "description": "Sets whether if just any of the 
org.apache.camel.spi.StreamCachingStrategy.SpoolRule rules returns true then 
shouldSpoolCache(long) returns true. If this option is false, then all the 
org.apache.camel.spi.StreamCachingStrategy.SpoolRule must retu [...]
     "id": { "kind": "attribute", "displayName": "Id", "required": false, 
"type": "string", "javaType": "java.lang.String", "deprecated": false, 
"autowired": false, "secret": false, "description": "The id of this node" }
   }
diff --git 
a/core/camel-core-xml/src/main/java/org/apache/camel/core/xml/AbstractCamelContextFactoryBean.java
 
b/core/camel-core-xml/src/main/java/org/apache/camel/core/xml/AbstractCamelContextFactoryBean.java
index b9238c769fa..43787c7b9ce 100644
--- 
a/core/camel-core-xml/src/main/java/org/apache/camel/core/xml/AbstractCamelContextFactoryBean.java
+++ 
b/core/camel-core-xml/src/main/java/org/apache/camel/core/xml/AbstractCamelContextFactoryBean.java
@@ -724,12 +724,20 @@ public abstract class AbstractCamelContextFactoryBean<T 
extends ModelCamelContex
     protected void initStreamCachingStrategy() throws Exception {
         CamelStreamCachingStrategyDefinition streamCaching = 
getCamelStreamCachingStrategy();
         if (streamCaching == null) {
+            getContext().getStreamCachingStrategy().setEnabled(true);
             return;
         }
 
         Boolean enabled = CamelContextHelper.parseBoolean(getContext(), 
streamCaching.getEnabled());
         if (enabled != null) {
             getContext().getStreamCachingStrategy().setEnabled(enabled);
+        } else {
+            // stream-caching is default enabled
+            getContext().getStreamCachingStrategy().setEnabled(true);
+        }
+        Boolean spoolEnabled = CamelContextHelper.parseBoolean(getContext(), 
streamCaching.getSpoolEnabled());
+        if (spoolEnabled != null) {
+            
getContext().getStreamCachingStrategy().setSpoolEnabled(spoolEnabled);
         }
         String spoolDirectory = CamelContextHelper.parseText(getContext(), 
streamCaching.getSpoolDirectory());
         if (spoolDirectory != null) {
diff --git 
a/core/camel-core-xml/src/main/java/org/apache/camel/core/xml/CamelStreamCachingStrategyDefinition.java
 
b/core/camel-core-xml/src/main/java/org/apache/camel/core/xml/CamelStreamCachingStrategyDefinition.java
index d221153d28c..c54a3e4536b 100644
--- 
a/core/camel-core-xml/src/main/java/org/apache/camel/core/xml/CamelStreamCachingStrategyDefinition.java
+++ 
b/core/camel-core-xml/src/main/java/org/apache/camel/core/xml/CamelStreamCachingStrategyDefinition.java
@@ -33,9 +33,12 @@ import org.apache.camel.spi.Metadata;
 public class CamelStreamCachingStrategyDefinition extends IdentifiedType {
 
     @XmlAttribute
-    @Metadata(defaultValue = "false")
+    @Metadata(defaultValue = "true", javaType = "java.lang.Boolean")
     private String enabled;
     @XmlAttribute
+    @Metadata(defaultValue = "false", javaType = "java.lang.Boolean")
+    private String spoolEnabled;
+    @XmlAttribute
     private String spoolDirectory;
     @XmlAttribute
     private String spoolCipher;
@@ -53,6 +56,7 @@ public class CamelStreamCachingStrategyDefinition extends 
IdentifiedType {
     @Metadata(defaultValue = "true")
     private String removeSpoolDirectoryWhenStopping;
     @XmlAttribute
+    @Metadata(defaultValue = "false", javaType = "java.lang.Boolean")
     private String statisticsEnabled;
     @XmlAttribute
     @Metadata(defaultValue = "false")
@@ -63,14 +67,39 @@ public class CamelStreamCachingStrategyDefinition extends 
IdentifiedType {
     }
 
     /**
-     * Sets whether the stream caching is enabled.
-     * <p/>
-     * <b>Notice:</b> This cannot be changed at runtime.
+     * Sets whether stream caching is enabled or not.
+     *
+     * While stream types (like StreamSource, InputStream and Reader) are 
commonly used in messaging for performance
+     * reasons, they also have an important drawback: they can only be read 
once. In order to be able to work with
+     * message content multiple times, the stream needs to be cached.
+     *
+     * Streams are cached in memory only (by default).
+     *
+     * If streamCachingSpoolEnabled=true, then, for large stream messages 
(over 128 KB by default) will be cached in a
+     * temporary file instead, and Camel will handle deleting the temporary 
file once the cached stream is no longer
+     * necessary.
+     *
+     * Default is true.
      */
     public void setEnabled(String enabled) {
         this.enabled = enabled;
     }
 
+    public String getSpoolEnabled() {
+        return spoolEnabled;
+    }
+
+    /**
+     * To enable stream caching spooling to disk. This means, for large stream 
messages (over 128 KB by default) will be cached in a
+     * temporary file instead, and Camel will handle deleting the temporary 
file once the cached stream is no longer
+     * necessary.
+     *
+     * Default is false.
+     */
+    public void setSpoolEnabled(String spoolEnabled) {
+        this.spoolEnabled = spoolEnabled;
+    }
+
     public String getSpoolDirectory() {
         return spoolDirectory;
     }
diff --git 
a/core/camel-core/src/test/java/org/apache/camel/converter/stream/CachedOutputStreamTest.java
 
b/core/camel-core/src/test/java/org/apache/camel/converter/stream/CachedOutputStreamTest.java
index daa8dc1c107..916d9c49e46 100644
--- 
a/core/camel-core/src/test/java/org/apache/camel/converter/stream/CachedOutputStreamTest.java
+++ 
b/core/camel-core/src/test/java/org/apache/camel/converter/stream/CachedOutputStreamTest.java
@@ -54,6 +54,7 @@ public class CachedOutputStreamTest extends 
ContextTestSupport {
         CamelContext context = super.createCamelContext();
         context.setStreamCaching(true);
         
context.getStreamCachingStrategy().setSpoolDirectory(testDirectory(true).toFile());
+        context.getStreamCachingStrategy().setSpoolEnabled(true);
         context.getStreamCachingStrategy().setSpoolThreshold(16);
         return context;
     }
diff --git 
a/core/camel-core/src/test/java/org/apache/camel/processor/MulticastParallelTimeoutStreamCachingTest.java
 
b/core/camel-core/src/test/java/org/apache/camel/processor/MulticastParallelTimeoutStreamCachingTest.java
index 24c547d4afd..772162fde04 100644
--- 
a/core/camel-core/src/test/java/org/apache/camel/processor/MulticastParallelTimeoutStreamCachingTest.java
+++ 
b/core/camel-core/src/test/java/org/apache/camel/processor/MulticastParallelTimeoutStreamCachingTest.java
@@ -103,6 +103,7 @@ public class MulticastParallelTimeoutStreamCachingTest 
extends ContextTestSuppor
             public void configure() {
                 // enable stream caching
                 
context.getStreamCachingStrategy().setSpoolDirectory(testDirectory().toFile());
+                context.getStreamCachingStrategy().setSpoolEnabled(true);
                 context.getStreamCachingStrategy().setEnabled(true);
                 
context.getStreamCachingStrategy().setRemoveSpoolDirectoryWhenStopping(false);
                 context.getStreamCachingStrategy().setSpoolThreshold(1L);
diff --git 
a/core/camel-core/src/test/java/org/apache/camel/processor/RedeliveryErrorHandlerNonBlockedDelayTest.java
 
b/core/camel-core/src/test/java/org/apache/camel/processor/RedeliveryErrorHandlerNonBlockedDelayTest.java
index aeddfea4f5f..be1e04c90dd 100644
--- 
a/core/camel-core/src/test/java/org/apache/camel/processor/RedeliveryErrorHandlerNonBlockedDelayTest.java
+++ 
b/core/camel-core/src/test/java/org/apache/camel/processor/RedeliveryErrorHandlerNonBlockedDelayTest.java
@@ -34,12 +34,12 @@ public class RedeliveryErrorHandlerNonBlockedDelayTest 
extends ContextTestSuppor
     @Test
     public void testRedelivery() throws Exception {
         MockEndpoint before = getMockEndpoint("mock:result");
-        before.expectedBodiesReceived("Hello World", "Hello Camel");
+        before.expectedBodiesReceivedInAnyOrder("Hello World", "Hello Camel");
 
         // we use NON blocked redelivery delay so the messages arrive which
         // completes first
         MockEndpoint result = getMockEndpoint("mock:result");
-        result.expectedBodiesReceived("Hello Camel", "Hello World");
+        result.expectedBodiesReceivedInAnyOrder("Hello Camel", "Hello World");
 
         template.sendBody("seda:start", "World");
         template.sendBody("seda:start", "Camel");
diff --git 
a/core/camel-core/src/test/java/org/apache/camel/processor/StreamCachingSpoolDirectoryQuarkusTest.java
 
b/core/camel-core/src/test/java/org/apache/camel/processor/StreamCachingSpoolDirectoryQuarkusTest.java
index 22a99705436..807056f5f55 100644
--- 
a/core/camel-core/src/test/java/org/apache/camel/processor/StreamCachingSpoolDirectoryQuarkusTest.java
+++ 
b/core/camel-core/src/test/java/org/apache/camel/processor/StreamCachingSpoolDirectoryQuarkusTest.java
@@ -90,6 +90,7 @@ public class StreamCachingSpoolDirectoryQuarkusTest extends 
ContextTestSupport {
             @Override
             public void configure() throws Exception {
                 
context.getStreamCachingStrategy().setSpoolDirectory(testDirectory().toFile());
+                context.getStreamCachingStrategy().setSpoolEnabled(true);
                 context.getStreamCachingStrategy().addSpoolRule(spoolRule);
                 context.getStreamCachingStrategy().setAnySpoolRules(true);
                 context.setStreamCaching(true);
diff --git 
a/core/camel-main/src/generated/java/org/apache/camel/main/MainConfigurationPropertiesConfigurer.java
 
b/core/camel-main/src/generated/java/org/apache/camel/main/MainConfigurationPropertiesConfigurer.java
index 5a2510cda73..fd03a1a7ac8 100644
--- 
a/core/camel-main/src/generated/java/org/apache/camel/main/MainConfigurationPropertiesConfigurer.java
+++ 
b/core/camel-main/src/generated/java/org/apache/camel/main/MainConfigurationPropertiesConfigurer.java
@@ -221,6 +221,8 @@ public class MainConfigurationPropertiesConfigurer extends 
org.apache.camel.supp
         case "StreamCachingSpoolCipher": 
target.setStreamCachingSpoolCipher(property(camelContext, 
java.lang.String.class, value)); return true;
         case "streamcachingspooldirectory":
         case "StreamCachingSpoolDirectory": 
target.setStreamCachingSpoolDirectory(property(camelContext, 
java.lang.String.class, value)); return true;
+        case "streamcachingspoolenabled":
+        case "StreamCachingSpoolEnabled": 
target.setStreamCachingSpoolEnabled(property(camelContext, boolean.class, 
value)); return true;
         case "streamcachingspoolthreshold":
         case "StreamCachingSpoolThreshold": 
target.setStreamCachingSpoolThreshold(property(camelContext, long.class, 
value)); return true;
         case "streamcachingspoolusedheapmemorylimit":
@@ -454,6 +456,8 @@ public class MainConfigurationPropertiesConfigurer extends 
org.apache.camel.supp
         case "StreamCachingSpoolCipher": return java.lang.String.class;
         case "streamcachingspooldirectory":
         case "StreamCachingSpoolDirectory": return java.lang.String.class;
+        case "streamcachingspoolenabled":
+        case "StreamCachingSpoolEnabled": return boolean.class;
         case "streamcachingspoolthreshold":
         case "StreamCachingSpoolThreshold": return long.class;
         case "streamcachingspoolusedheapmemorylimit":
@@ -688,6 +692,8 @@ public class MainConfigurationPropertiesConfigurer extends 
org.apache.camel.supp
         case "StreamCachingSpoolCipher": return 
target.getStreamCachingSpoolCipher();
         case "streamcachingspooldirectory":
         case "StreamCachingSpoolDirectory": return 
target.getStreamCachingSpoolDirectory();
+        case "streamcachingspoolenabled":
+        case "StreamCachingSpoolEnabled": return 
target.isStreamCachingSpoolEnabled();
         case "streamcachingspoolthreshold":
         case "StreamCachingSpoolThreshold": return 
target.getStreamCachingSpoolThreshold();
         case "streamcachingspoolusedheapmemorylimit":
diff --git 
a/core/camel-main/src/generated/resources/META-INF/camel-main-configuration-metadata.json
 
b/core/camel-main/src/generated/resources/META-INF/camel-main-configuration-metadata.json
index d6df43111f8..26c9225dcaf 100644
--- 
a/core/camel-main/src/generated/resources/META-INF/camel-main-configuration-metadata.json
+++ 
b/core/camel-main/src/generated/resources/META-INF/camel-main-configuration-metadata.json
@@ -109,10 +109,11 @@
     { "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. While stream types (like StreamSource, 
InputStream and Reader) are commonly used in messaging for performance reasons, 
they also have an important drawback: they can only be read once. In order to 
be able to work with message content multiple times, the stream needs to be 
cached. Streams are cached in memory. However, for large stream messages (over 
128 KB by default) will be c [...]
+    { "name": "camel.main.streamCachingEnabled", "description": "Sets whether 
stream caching is enabled or not. While stream types (like StreamSource, 
InputStream and Reader) are commonly used in messaging for performance reasons, 
they also have an important drawback: they can only be read once. In order to 
be able to work with message content multiple times, the stream needs to be 
cached. Streams are cached in memory only (by default). If 
streamCachingSpoolEnabled=true, then, for large  [...]
     { "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.streamCachingSpoolEnabled", "description": "To 
enable stream caching spooling to disk. This means, for large stream messages 
(over 128 KB by default) will be cached in a temporary file instead, and Camel 
will handle deleting the temporary file once the cached stream is no longer 
necessary. Default is false.", "sourceType": 
"org.apache.camel.main.DefaultConfigurationProperties", "type": "boolean", 
"javaType": "boolean", "defaultValue": "false" },
     { "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" },
diff --git a/core/camel-main/src/main/docs/main.adoc 
b/core/camel-main/src/main/docs/main.adoc
index a387bd9e338..c9bd04497a3 100644
--- a/core/camel-main/src/main/docs/main.adoc
+++ b/core/camel-main/src/main/docs/main.adoc
@@ -18,7 +18,7 @@ The following tables lists all the options:
 
 // main options: START
 === Camel Main configurations
-The camel.main supports 113 options, which are listed below.
+The camel.main supports 114 options, which are listed below.
 
 [width="100%",cols="2,5,^1,2",options="header"]
 |===
@@ -119,10 +119,11 @@ The camel.main supports 113 options, which are listed 
below.
 | *camel.main.startupSummaryLevel* | Controls the level of information logged 
during startup (and shutdown) of CamelContext. | Default | StartupSummaryLevel
 | *camel.main.streamCachingAny{zwsp}SpoolRules* | 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. | false 
| boolean
 | *camel.main.streamCachingBuffer{zwsp}Size* | Sets the stream caching buffer 
size to use when allocating in-memory buffers used for in-memory stream caches. 
The default size is 4096. |  | int
-| *camel.main.streamCaching{zwsp}Enabled* | Sets whether stream caching is 
enabled or not. While stream types (like StreamSource, InputStream and Reader) 
are commonly used in messaging for performance reasons, they also have an 
important drawback: they can only be read once. In order to be able to work 
with message content multiple times, the stream needs to be cached. Streams are 
cached in memory. However, for large stream messages (over 128 KB by default) 
will be cached in a temporary  [...]
+| *camel.main.streamCaching{zwsp}Enabled* | Sets whether stream caching is 
enabled or not. While stream types (like StreamSource, InputStream and Reader) 
are commonly used in messaging for performance reasons, they also have an 
important drawback: they can only be read once. In order to be able to work 
with message content multiple times, the stream needs to be cached. Streams are 
cached in memory only (by default). If streamCachingSpoolEnabled=true, then, 
for large stream messages (over [...]
 | *camel.main.streamCachingRemove{zwsp}SpoolDirectoryWhenStopping* | Whether 
to remove stream caching temporary directory when stopping. This option is 
default true. | true | boolean
 | *camel.main.streamCachingSpool{zwsp}Cipher* | Sets a stream caching cipher 
name to use when spooling to disk to write with encryption. By default the data 
is not encrypted. |  | String
 | *camel.main.streamCachingSpool{zwsp}Directory* | 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. |  | String
+| *camel.main.streamCachingSpool{zwsp}Enabled* | To enable stream caching 
spooling to disk. This means, for large stream messages (over 128 KB by 
default) will be cached in a temporary file instead, and Camel will handle 
deleting the temporary file once the cached stream is no longer necessary. 
Default is false. | false | boolean
 | *camel.main.streamCachingSpool{zwsp}Threshold* | Stream caching threshold in 
bytes when overflow to disk is activated. The default threshold is 128kb. Use 
-1 to disable overflow to disk. |  | long
 | *camel.main.streamCachingSpool{zwsp}UsedHeapMemoryLimit* | Sets what the 
upper bounds should be when streamCachingSpoolUsedHeapMemoryThreshold is in 
use. |  | String
 | *camel.main.streamCachingSpool{zwsp}UsedHeapMemoryThreshold* | Sets a 
percentage (1-99) of used heap memory threshold to activate stream caching 
spooling to disk. |  | int
diff --git 
a/core/camel-main/src/main/java/org/apache/camel/main/DefaultConfigurationConfigurer.java
 
b/core/camel-main/src/main/java/org/apache/camel/main/DefaultConfigurationConfigurer.java
index 2c7a769ac87..24f82e2ee5c 100644
--- 
a/core/camel-main/src/main/java/org/apache/camel/main/DefaultConfigurationConfigurer.java
+++ 
b/core/camel-main/src/main/java/org/apache/camel/main/DefaultConfigurationConfigurer.java
@@ -177,6 +177,7 @@ public final class DefaultConfigurationConfigurer {
 
         // stream caching
         camelContext.setStreamCaching(config.isStreamCachingEnabled());
+        
camelContext.getStreamCachingStrategy().setSpoolEnabled(config.isStreamCachingSpoolEnabled());
         
camelContext.getStreamCachingStrategy().setAnySpoolRules(config.isStreamCachingAnySpoolRules());
         
camelContext.getStreamCachingStrategy().setBufferSize(config.getStreamCachingBufferSize());
         camelContext.getStreamCachingStrategy()
diff --git 
a/core/camel-main/src/main/java/org/apache/camel/main/DefaultConfigurationProperties.java
 
b/core/camel-main/src/main/java/org/apache/camel/main/DefaultConfigurationProperties.java
index 3da030fb362..7423cea21ed 100644
--- 
a/core/camel-main/src/main/java/org/apache/camel/main/DefaultConfigurationProperties.java
+++ 
b/core/camel-main/src/main/java/org/apache/camel/main/DefaultConfigurationProperties.java
@@ -58,6 +58,7 @@ public abstract class DefaultConfigurationProperties<T> {
     private boolean modeline;
     private int logDebugMaxChars;
     private boolean streamCachingEnabled = true;
+    private boolean streamCachingSpoolEnabled;
     private String streamCachingSpoolDirectory;
     private String streamCachingSpoolCipher;
     private long streamCachingSpoolThreshold;
@@ -433,7 +434,9 @@ public abstract class DefaultConfigurationProperties<T> {
      * reasons, they also have an important drawback: they can only be read 
once. In order to be able to work with
      * message content multiple times, the stream needs to be cached.
      *
-     * Streams are cached in memory. However, for large stream messages (over 
128 KB by default) will be cached in a
+     * Streams are cached in memory only (by default).
+     *
+     * If streamCachingSpoolEnabled=true, then, for large stream messages 
(over 128 KB by default) will be cached in a
      * temporary file instead, and Camel will handle deleting the temporary 
file once the cached stream is no longer
      * necessary.
      *
@@ -443,6 +446,21 @@ public abstract class DefaultConfigurationProperties<T> {
         this.streamCachingEnabled = streamCachingEnabled;
     }
 
+    public boolean isStreamCachingSpoolEnabled() {
+        return streamCachingSpoolEnabled;
+    }
+
+    /**
+     * To enable stream caching spooling to disk. This means, for large stream 
messages (over 128 KB by default) will be cached in a
+     * temporary file instead, and Camel will handle deleting the temporary 
file once the cached stream is no longer
+     * necessary.
+     *
+     * Default is false.
+     */
+    public void setStreamCachingSpoolEnabled(boolean 
streamCachingSpoolEnabled) {
+        this.streamCachingSpoolEnabled = streamCachingSpoolEnabled;
+    }
+
     public String getStreamCachingSpoolDirectory() {
         return streamCachingSpoolDirectory;
     }
@@ -1711,13 +1729,35 @@ public abstract class DefaultConfigurationProperties<T> 
{
     /**
      * Sets whether stream caching is enabled or not.
      *
-     * Default is false.
+     * While stream types (like StreamSource, InputStream and Reader) are 
commonly used in messaging for performance
+     * reasons, they also have an important drawback: they can only be read 
once. In order to be able to work with
+     * message content multiple times, the stream needs to be cached.
+     *
+     * Streams are cached in memory only (by default).
+     *
+     * If streamCachingSpoolEnabled=true, then, for large stream messages 
(over 128 KB by default) will be cached in a
+     * temporary file instead, and Camel will handle deleting the temporary 
file once the cached stream is no longer
+     * necessary.
+     *
+     * Default is true.
      */
     public T withStreamCachingEnabled(boolean streamCachingEnabled) {
         this.streamCachingEnabled = streamCachingEnabled;
         return (T) this;
     }
 
+    /**
+     * To enable stream caching spooling to disk. This means, for large stream 
messages (over 128 KB by default) will be cached in a
+     * temporary file instead, and Camel will handle deleting the temporary 
file once the cached stream is no longer
+     * necessary.
+     *
+     * Default is false.
+     */
+    public T withStreamCachingSpoolEnabled(boolean streamCachingSpoolEnabled) {
+        this.streamCachingSpoolEnabled = streamCachingSpoolEnabled;
+        return (T) this;
+    }
+
     /**
      * Sets the stream caching spool (temporary) directory to use for overflow 
and spooling to disk.
      *
diff --git 
a/docs/user-manual/modules/ROOT/pages/camel-3x-upgrade-guide-3_17.adoc 
b/docs/user-manual/modules/ROOT/pages/camel-3x-upgrade-guide-3_17.adoc
index 981c308a9ca..d166822e483 100644
--- a/docs/user-manual/modules/ROOT/pages/camel-3x-upgrade-guide-3_17.adoc
+++ b/docs/user-manual/modules/ROOT/pages/camel-3x-upgrade-guide-3_17.adoc
@@ -8,6 +8,8 @@ from both 3.0 to 3.1 and 3.1 to 3.2.
 
 === camel-core
 
+==== Stream Caching
+
 We have enabled xref:stream-caching.adoc[Stream Caching] by default on 
`CamelContext`. The reason is that Camel users
 may often hit this problem without knowing what is causing this, and blaming 
it on Apache Camel.
 
@@ -37,6 +39,45 @@ Or in Spring Boot
 camel.springboot.streamCachingEnabled=false
 ----
 
+And in legacy Spring XML or OSGi Blueprint:
+
+[source,xml]
+----
+<streamCaching enabled="true" .../>
+----
+
+We also changed the default settings for stream caching to not spool to disk, 
meaning that the cache
+is an in-memory on cache.
+
+To enable spool to disk, you can configure this as follows:
+
+[source,java]
+----
+CamelContext context = ...
+context.getStreamCachingStrategy().setSpoolEnabled(true);
+----
+
+Or via Camel Main / Camel K / Quarkus:
+
+[source,properties]
+----
+camel.main.streamCachingSpoolEnabled=true
+----
+
+Or in Spring Boot
+
+[source,properties]
+----
+camel.springboot.streamCachingSpoolEnabled=true
+----
+
+And in legacy Spring XML or OSGi Blueprint:
+
+[source,xml]
+----
+<streamCaching spoolEnabled="true" .../>
+----
+
 === camel-health
 
 Camel now reports DOWN when Camel is being stopped, during the graceful 
shutdown process.

Reply via email to