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

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

commit eb4e985fe782ff0051cc86e47e60204e0384c434
Author: Claus Ibsen <[email protected]>
AuthorDate: Fri Jun 21 17:57:04 2024 +0200

    camel-core - Using shared dummy exchange instance for special needs instead 
of creating a new instance to be thrown away afterwards.
---
 .../org/apache/camel/model/BeanModelHelper.java     | 21 ++++++---------------
 .../org/apache/camel/reifier/ChoiceReifier.java     |  4 ++--
 .../org/apache/camel/util/ExchangeHelperTest.java   |  9 +++++++++
 .../org/apache/camel/support/ExchangeHelper.java    | 13 +++++++++++++
 .../camel/support/component/RawParameterHelper.java |  4 ++--
 5 files changed, 32 insertions(+), 19 deletions(-)

diff --git 
a/core/camel-core-model/src/main/java/org/apache/camel/model/BeanModelHelper.java
 
b/core/camel-core-model/src/main/java/org/apache/camel/model/BeanModelHelper.java
index c69642c26bd..f5fc40967cf 100644
--- 
a/core/camel-core-model/src/main/java/org/apache/camel/model/BeanModelHelper.java
+++ 
b/core/camel-core-model/src/main/java/org/apache/camel/model/BeanModelHelper.java
@@ -27,9 +27,9 @@ import org.apache.camel.Expression;
 import org.apache.camel.NoSuchBeanException;
 import org.apache.camel.RouteTemplateContext;
 import org.apache.camel.RuntimeCamelException;
-import org.apache.camel.spi.ExchangeFactory;
 import org.apache.camel.spi.Language;
 import org.apache.camel.spi.ScriptingLanguage;
+import org.apache.camel.support.ExchangeHelper;
 import org.apache.camel.support.PropertyBindingSupport;
 import org.apache.camel.support.ScriptHelper;
 import org.apache.camel.util.StringHelper;
@@ -78,16 +78,10 @@ public final class BeanModelHelper {
                 bindings.put("context", context);
                 target = slan.evaluate(def.getScript(), bindings, clazz);
             } else {
-                // exchange based languages needs a dummy exchange to be 
evaluated
-                ExchangeFactory ef = 
context.getCamelContextExtension().getExchangeFactory();
-                Exchange dummy = ef.create(false);
-                try {
-                    String text = 
ScriptHelper.resolveOptionalExternalScript(context, dummy, def.getScript());
-                    Expression exp = lan.createExpression(text);
-                    target = exp.evaluate(dummy, clazz);
-                } finally {
-                    ef.release(dummy);
-                }
+                Exchange dummy = ExchangeHelper.getDummy(context);
+                String text = 
ScriptHelper.resolveOptionalExternalScript(context, dummy, def.getScript());
+                Expression exp = lan.createExpression(text);
+                target = exp.evaluate(dummy, clazz);
             }
 
             // a bean must be created
@@ -215,9 +209,8 @@ public final class BeanModelHelper {
                 // and memorize so the script is only evaluated once and the 
local bean is the same
                 // if a route template refers to the local bean multiple times
                 routeTemplateContext.bind(def.getName(), clazz, 
Suppliers.memorize(() -> {
-                    ExchangeFactory ef = 
camelContext.getCamelContextExtension().getExchangeFactory();
-                    Exchange dummy = ef.create(false);
                     try {
+                        Exchange dummy = ExchangeHelper.getDummy(camelContext);
                         String text = 
ScriptHelper.resolveOptionalExternalScript(camelContext, dummy, script);
                         if (text != null) {
                             Expression exp = lan.createExpression(text);
@@ -242,8 +235,6 @@ public final class BeanModelHelper {
                     } catch (Exception e) {
                         throw new IllegalStateException(
                                 "Cannot create bean: " + def.getType(), e);
-                    } finally {
-                        ef.release(dummy);
                     }
                 }));
             }
diff --git 
a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/ChoiceReifier.java
 
b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/ChoiceReifier.java
index 1be5abf3b91..31e39795957 100644
--- 
a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/ChoiceReifier.java
+++ 
b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/ChoiceReifier.java
@@ -31,7 +31,7 @@ import org.apache.camel.model.language.ExpressionDefinition;
 import org.apache.camel.processor.ChoiceProcessor;
 import org.apache.camel.processor.FilterProcessor;
 import org.apache.camel.spi.ExpressionFactoryAware;
-import org.apache.camel.support.DefaultExchange;
+import org.apache.camel.support.ExchangeHelper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -100,7 +100,7 @@ public class ChoiceReifier extends 
ProcessorReifier<ChoiceDefinition> {
      */
     private Processor getMatchingBranchProcessor() throws Exception {
         // evaluate when predicates to optimize
-        Exchange dummy = new DefaultExchange(camelContext);
+        Exchange dummy = ExchangeHelper.getDummy(camelContext);
         for (WhenDefinition whenClause : definition.getWhenClauses()) {
             ExpressionDefinition exp = whenClause.getExpression();
             exp.initPredicate(camelContext);
diff --git 
a/core/camel-core/src/test/java/org/apache/camel/util/ExchangeHelperTest.java 
b/core/camel-core/src/test/java/org/apache/camel/util/ExchangeHelperTest.java
index 0c69c952c0f..7eb1b713ae3 100644
--- 
a/core/camel-core/src/test/java/org/apache/camel/util/ExchangeHelperTest.java
+++ 
b/core/camel-core/src/test/java/org/apache/camel/util/ExchangeHelperTest.java
@@ -40,6 +40,15 @@ public class ExchangeHelperTest extends ContextTestSupport {
 
     protected Exchange exchange;
 
+    @Test
+    public void testGetDummy() {
+        Exchange one = ExchangeHelper.getDummy(context);
+        Exchange two = ExchangeHelper.getDummy(context);
+        assertSame(one, two);
+        assertNotSame(exchange, one);
+        assertNotSame(exchange, two);
+    }
+
     @Test
     public void testValidProperty() throws Exception {
         String value = ExchangeHelper.getMandatoryProperty(exchange, "foo", 
String.class);
diff --git 
a/core/camel-support/src/main/java/org/apache/camel/support/ExchangeHelper.java 
b/core/camel-support/src/main/java/org/apache/camel/support/ExchangeHelper.java
index f34bf2662a0..fa0287db087 100644
--- 
a/core/camel-support/src/main/java/org/apache/camel/support/ExchangeHelper.java
+++ 
b/core/camel-support/src/main/java/org/apache/camel/support/ExchangeHelper.java
@@ -68,12 +68,25 @@ public final class ExchangeHelper {
             = 
ObjectHelper.getSystemProperty(Exchange.DEFAULT_CHARSET_PROPERTY, "UTF-8");
     private static final Charset DEFAULT_CHARSET = 
Charset.forName(DEFAULT_CHARSET_NAME);
 
+    private static Exchange DUMMY;
+
     /**
      * Utility classes should not have a public constructor.
      */
     private ExchangeHelper() {
     }
 
+    /**
+     * Gets a singleton dummy exchange used for special purposes only.
+     */
+    public static Exchange getDummy(CamelContext context) {
+        // we dont worry about thread-safety
+        if (DUMMY == null) {
+            DUMMY = new DefaultExchange(context);
+        }
+        return DUMMY;
+    }
+
     /**
      * Extracts the Exchange.BINDING of the given type or null if not present
      *
diff --git 
a/core/camel-support/src/main/java/org/apache/camel/support/component/RawParameterHelper.java
 
b/core/camel-support/src/main/java/org/apache/camel/support/component/RawParameterHelper.java
index 1f5278c5ebb..524c81763a9 100644
--- 
a/core/camel-support/src/main/java/org/apache/camel/support/component/RawParameterHelper.java
+++ 
b/core/camel-support/src/main/java/org/apache/camel/support/component/RawParameterHelper.java
@@ -20,7 +20,7 @@ import java.util.Map;
 
 import org.apache.camel.CamelContext;
 import org.apache.camel.Exchange;
-import org.apache.camel.support.DefaultExchange;
+import org.apache.camel.support.ExchangeHelper;
 import org.apache.camel.util.URISupport;
 
 public final class RawParameterHelper {
@@ -42,7 +42,7 @@ public final class RawParameterHelper {
     public static void resolveRawParameterValues(CamelContext camelContext, 
Map<String, Object> parameters) {
         URISupport.resolveRawParameterValues(parameters, s -> {
             if (s != null && s.contains("$simple{")) {
-                Exchange dummy = new DefaultExchange(camelContext);
+                Exchange dummy = ExchangeHelper.getDummy(camelContext);
                 s = 
camelContext.resolveLanguage("simple").createExpression(s).evaluate(dummy, 
String.class);
             }
             return s;

Reply via email to