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;
