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);
             }
         }
     }

Reply via email to