This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch exchange-factory in repository https://gitbox.apache.org/repos/asf/camel.git
commit 9069f06cf210813d9500aeeadb51e70b38ce30be Author: Claus Ibsen <claus.ib...@gmail.com> AuthorDate: Wed Feb 24 07:25:06 2021 +0100 CAMEL-16222: PooledExchangeFactory experiment --- .../src/main/java/org/apache/camel/PooledExchange.java | 12 +++++++++--- .../apache/camel/impl/engine/PooledExchangeFactory.java | 15 +++++++++++---- .../org/apache/camel/support/DefaultPooledExchange.java | 8 +++----- 3 files changed, 23 insertions(+), 12 deletions(-) diff --git a/core/camel-api/src/main/java/org/apache/camel/PooledExchange.java b/core/camel-api/src/main/java/org/apache/camel/PooledExchange.java index de0ad66..764ed2b 100644 --- a/core/camel-api/src/main/java/org/apache/camel/PooledExchange.java +++ b/core/camel-api/src/main/java/org/apache/camel/PooledExchange.java @@ -16,8 +16,6 @@ */ package org.apache.camel; -import java.util.function.Function; - import org.apache.camel.spi.ExchangeFactory; /** @@ -28,11 +26,19 @@ import org.apache.camel.spi.ExchangeFactory; public interface PooledExchange extends ExtendedExchange { /** + * Task to execute when the exchange is done. + */ + @FunctionalInterface + interface OnDoneTask { + void onDone(Exchange exchange); + } + + /** * Registers a task to run when this exchange is done. * <p/> * <b>Important:</b> This API is NOT intended for Camel end users, but used internally by Camel itself. */ - void onDone(Function<Exchange, Boolean> task); + void onDone(OnDoneTask task); /** * When the exchange is done being used. diff --git a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/PooledExchangeFactory.java b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/PooledExchangeFactory.java index 4b228eb0..45237e9 100644 --- a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/PooledExchangeFactory.java +++ b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/PooledExchangeFactory.java @@ -42,10 +42,9 @@ import org.slf4j.LoggerFactory; public final class PooledExchangeFactory extends ServiceSupport implements ExchangeFactory, CamelContextAware, StaticService, NonManagedService { - // TODO: optimize onDone lambdas as they will be created per instance, and we can use static linked - private static final Logger LOG = LoggerFactory.getLogger(PooledExchangeFactory.class); + private final ReleaseOnDoneTask onDone = new ReleaseOnDoneTask(); private final Consumer consumer; private final ConcurrentLinkedQueue<Exchange> pool = new ConcurrentLinkedQueue<>(); private final AtomicLong acquired = new AtomicLong(); @@ -153,7 +152,7 @@ public final class PooledExchangeFactory extends ServiceSupport } protected PooledExchange createPooledExchange(Endpoint fromEndpoint, boolean autoRelease) { - PooledExchange answer = null; + PooledExchange answer; if (fromEndpoint != null) { answer = new DefaultPooledExchange(fromEndpoint); } else { @@ -162,7 +161,7 @@ public final class PooledExchangeFactory extends ServiceSupport answer.setAutoRelease(autoRelease); if (autoRelease) { // the consumer will either always be in auto release mode or not, so its safe to initialize the task only once when the exchange is created - answer.onDone(this::release); + answer.onDone(onDone); } return answer; } @@ -189,4 +188,12 @@ public final class PooledExchangeFactory extends ServiceSupport discarded.set(0); } + private final class ReleaseOnDoneTask implements PooledExchange.OnDoneTask { + + @Override + public void onDone(Exchange exchange) { + release(exchange); + } + } + } diff --git a/core/camel-support/src/main/java/org/apache/camel/support/DefaultPooledExchange.java b/core/camel-support/src/main/java/org/apache/camel/support/DefaultPooledExchange.java index fc4492f..b13e73b 100644 --- a/core/camel-support/src/main/java/org/apache/camel/support/DefaultPooledExchange.java +++ b/core/camel-support/src/main/java/org/apache/camel/support/DefaultPooledExchange.java @@ -16,8 +16,6 @@ */ package org.apache.camel.support; -import java.util.function.Function; - import org.apache.camel.CamelContext; import org.apache.camel.Endpoint; import org.apache.camel.Exchange; @@ -30,7 +28,7 @@ import org.apache.camel.PooledExchange; */ public final class DefaultPooledExchange extends AbstractExchange implements PooledExchange { - private Function<Exchange, Boolean> onDone; + private OnDoneTask onDone; private Class originalInClassType; private Message originalOut; private final ExchangePattern originalPattern; @@ -70,7 +68,7 @@ public final class DefaultPooledExchange extends AbstractExchange implements Poo } @Override - public void onDone(Function<Exchange, Boolean> task) { + public void onDone(OnDoneTask task) { this.onDone = task; } @@ -113,7 +111,7 @@ public final class DefaultPooledExchange extends AbstractExchange implements Poo this.errorHandlerHandled = null; if (onDone != null) { - onDone.apply(this); + onDone.onDone(this); } } }