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


The following commit(s) were added to refs/heads/exchange-factory by this push:
     new 862be97  CAMEL-16222: PooledExchangeFactory experiment
862be97 is described below

commit 862be975322d355dc3ee5be44329b9e7e25810b2
Author: Claus Ibsen <claus.ib...@gmail.com>
AuthorDate: Fri Feb 19 17:21:04 2021 +0100

    CAMEL-16222: PooledExchangeFactory experiment
---
 .../camel/component/timer/TimerConsumer.java       |  3 ++-
 .../src/main/java/org/apache/camel/Consumer.java   |  9 ++++----
 .../src/main/java/org/apache/camel/Endpoint.java   |  8 +++----
 .../org/apache/camel/support/DefaultExchange.java  | 25 ++++++++++++++++------
 4 files changed, 28 insertions(+), 17 deletions(-)

diff --git 
a/components/camel-timer/src/main/java/org/apache/camel/component/timer/TimerConsumer.java
 
b/components/camel-timer/src/main/java/org/apache/camel/component/timer/TimerConsumer.java
index 8fd997c..30a1d70 100644
--- 
a/components/camel-timer/src/main/java/org/apache/camel/component/timer/TimerConsumer.java
+++ 
b/components/camel-timer/src/main/java/org/apache/camel/component/timer/TimerConsumer.java
@@ -204,7 +204,8 @@ public class TimerConsumer extends DefaultConsumer 
implements StartupListener, S
                 public void done(boolean cbDoneSync) {
                     // handle any thrown exception
                     if (exchange.getException() != null) {
-                        
TimerConsumer.this.getExceptionHandler().handleException("Error processing 
exchange", exchange, exchange.getException());
+                        
TimerConsumer.this.getExceptionHandler().handleException("Error processing 
exchange", exchange,
+                                exchange.getException());
                     }
                     // sync wil release outside this callback
                     if (!cbDoneSync) {
diff --git a/core/camel-api/src/main/java/org/apache/camel/Consumer.java 
b/core/camel-api/src/main/java/org/apache/camel/Consumer.java
index 4d15bf0..25c24f6 100644
--- a/core/camel-api/src/main/java/org/apache/camel/Consumer.java
+++ b/core/camel-api/src/main/java/org/apache/camel/Consumer.java
@@ -35,11 +35,10 @@ public interface Consumer extends Service, EndpointAware {
     /**
      * Creates an {@link Exchange} that was consumed.
      * <p/>
-     * <b>Important:</b> If the auto release parameter is set to 
<tt>false</tt> then
-     * the consumer is responsible for calling the {@link 
#releaseExchange(Exchange, boolean)} when the {@link Exchange}
-     * is done being routed. This is for advanced consumers that need to have 
this control in their own hands.
-     * For normal use-cases then a consumer can use autoRelease <tt>true</tt> 
and then Camel will automatic
-     * release the exchange after routing.
+     * <b>Important:</b> If the auto release parameter is set to 
<tt>false</tt> then the consumer is responsible for
+     * calling the {@link #releaseExchange(Exchange, boolean)} when the {@link 
Exchange} is done being routed. This is
+     * for advanced consumers that need to have this control in their own 
hands. For normal use-cases then a consumer
+     * can use autoRelease <tt>true</tt> and then Camel will automatic release 
the exchange after routing.
      *
      * @param autoRelease whether to auto release the exchange when routing is 
complete via {@link UnitOfWork}
      */
diff --git a/core/camel-api/src/main/java/org/apache/camel/Endpoint.java 
b/core/camel-api/src/main/java/org/apache/camel/Endpoint.java
index ea85f3e..a8301dc 100644
--- a/core/camel-api/src/main/java/org/apache/camel/Endpoint.java
+++ b/core/camel-api/src/main/java/org/apache/camel/Endpoint.java
@@ -65,8 +65,8 @@ public interface Endpoint extends IsSingleton, Service {
     /**
      * Create a new exchange for communicating with this endpoint.
      * <p/>
-     * <b>Important:</b> Consumers should use {@link 
Consumer#createExchange(boolean)} to create
-     * an exchange for which the consumer received a message.
+     * <b>Important:</b> Consumers should use {@link 
Consumer#createExchange(boolean)} to create an exchange for which
+     * the consumer received a message.
      *
      * @return a new exchange
      */
@@ -76,8 +76,8 @@ public interface Endpoint extends IsSingleton, Service {
      * Create a new exchange for communicating with this endpoint with the 
specified {@link ExchangePattern} such as
      * whether its going to be an {@link ExchangePattern#InOnly} or {@link 
ExchangePattern#InOut} exchange
      * <p/>
-     * <b>Important:</b> Consumers should use {@link 
Consumer#createExchange(boolean)} to create
-     * an exchange for which the consumer received a message.
+     * <b>Important:</b> Consumers should use {@link 
Consumer#createExchange(boolean)} to create an exchange for which
+     * the consumer received a message.
      *
      * @param  pattern the message exchange pattern for the exchange
      * @return         a new exchange
diff --git 
a/core/camel-support/src/main/java/org/apache/camel/support/DefaultExchange.java
 
b/core/camel-support/src/main/java/org/apache/camel/support/DefaultExchange.java
index 371b991..a6955b1 100644
--- 
a/core/camel-support/src/main/java/org/apache/camel/support/DefaultExchange.java
+++ 
b/core/camel-support/src/main/java/org/apache/camel/support/DefaultExchange.java
@@ -52,6 +52,7 @@ public final class DefaultExchange implements 
ExtendedExchange {
     private final Map<String, Object> properties = new ConcurrentHashMap<>(8);
     private Class originalInClassType;
     private Message in;
+    private Message originalOut;
     private Message out;
     private Exception exception;
     private String exchangeId;
@@ -149,12 +150,14 @@ public final class DefaultExchange implements 
ExtendedExchange {
             } else {
                 this.in = null;
             }
-            this.out = null;
-            this.exception = null;
-            // reset uow
+            if (out != null) {
+                out.reset();
+                this.out = null;
+            }
             if (this.unitOfWork != null) {
                 this.unitOfWork.reset();
             }
+            this.exception = null;
             // reset pattern to original
             this.pattern = originalPattern;
             if (this.onCompletions != null) {
@@ -434,9 +437,14 @@ public final class DefaultExchange implements 
ExtendedExchange {
     public Message getOut() {
         // lazy create
         if (out == null) {
-            out = (in instanceof MessageSupport)
-                    ? ((MessageSupport) in).newInstance() : new 
DefaultMessage(getContext());
-            configureMessage(out);
+            if (originalOut != null) {
+                out = originalOut;
+            } else {
+                // we can only optimize OUT when its using a default message 
instance
+                out = new DefaultMessage(this);
+                configureMessage(out);
+                originalOut = out;
+            }
         }
         return out;
     }
@@ -467,7 +475,10 @@ public final class DefaultExchange implements 
ExtendedExchange {
     @Override
     public void setOut(Message out) {
         this.out = out;
-        configureMessage(out);
+        if (out != null) {
+            configureMessage(out);
+            this.originalOut = null; // we use custom out
+        }
     }
 
     @Override

Reply via email to