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 230dbe724d9dd45f6bfce5ee04264268d6fa80fb
Author: Claus Ibsen <[email protected]>
AuthorDate: Fri Feb 19 16:31:28 2021 +0100

    CAMEL-16222: PooledExchangeFactory experiment
---
 core/camel-api/src/main/java/org/apache/camel/Message.java  |  7 +++++++
 .../main/java/org/apache/camel/support/DefaultExchange.java | 13 +++++++++++--
 .../main/java/org/apache/camel/support/DefaultMessage.java  |  8 ++++++++
 .../main/java/org/apache/camel/support/MessageSupport.java  |  7 +++++++
 4 files changed, 33 insertions(+), 2 deletions(-)

diff --git a/core/camel-api/src/main/java/org/apache/camel/Message.java 
b/core/camel-api/src/main/java/org/apache/camel/Message.java
index 3f14c01..df8dcbc 100644
--- a/core/camel-api/src/main/java/org/apache/camel/Message.java
+++ b/core/camel-api/src/main/java/org/apache/camel/Message.java
@@ -33,6 +33,13 @@ import org.apache.camel.spi.HeadersMapFactory;
 public interface Message {
 
     /**
+     * Clears the message from user data so it may be reused.
+     * <p/>
+     * <b>Important:</b> This API is NOT intended for Camel end users, but 
used internally by Camel itself.
+     */
+    void reset();
+
+    /**
      * Returns the id of the message.
      * <p/>
      * By default the message uses the same id as {@link 
Exchange#getExchangeId()} as messages are associated with the
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 4ddeb65..371b991 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
@@ -50,6 +50,7 @@ public final class DefaultExchange implements 
ExtendedExchange {
     private long created;
     // optimize to create properties always and with a reasonable small size
     private final Map<String, Object> properties = new ConcurrentHashMap<>(8);
+    private Class originalInClassType;
     private Message in;
     private Message out;
     private Exception exception;
@@ -142,8 +143,12 @@ public final class DefaultExchange implements 
ExtendedExchange {
             this.created = 0; // by setting to 0 we also flag that this 
exchange is done and needs to be reset to use again
             this.properties.clear();
             this.exchangeId = null;
-            // TODO: optimize in/out to keep as default message (if original 
message is this kind)
-            this.in = null;
+            if (in != null && in.getClass() == originalInClassType) {
+                // okay we can reuse in
+                in.reset();
+            } else {
+                this.in = null;
+            }
             this.out = null;
             this.exception = null;
             // reset uow
@@ -396,6 +401,7 @@ public final class DefaultExchange implements 
ExtendedExchange {
     public Message getIn() {
         if (in == null) {
             in = new DefaultMessage(getContext());
+            originalInClassType = in.getClass();
             configureMessage(in);
         }
         return in;
@@ -419,6 +425,9 @@ public final class DefaultExchange implements 
ExtendedExchange {
     public void setIn(Message in) {
         this.in = in;
         configureMessage(in);
+        if (in != null) {
+            this.originalInClassType = in.getClass();
+        }
     }
 
     @Override
diff --git 
a/core/camel-support/src/main/java/org/apache/camel/support/DefaultMessage.java 
b/core/camel-support/src/main/java/org/apache/camel/support/DefaultMessage.java
index 7e30d6f..f89ac01 100644
--- 
a/core/camel-support/src/main/java/org/apache/camel/support/DefaultMessage.java
+++ 
b/core/camel-support/src/main/java/org/apache/camel/support/DefaultMessage.java
@@ -52,6 +52,14 @@ public class DefaultMessage extends MessageSupport {
     }
 
     @Override
+    public void reset() {
+        super.reset();
+        if (headers != null) {
+            headers.clear();
+        }
+    }
+
+    @Override
     public Object getHeader(String name) {
         if (headers == null) {
             // force creating headers
diff --git 
a/core/camel-support/src/main/java/org/apache/camel/support/MessageSupport.java 
b/core/camel-support/src/main/java/org/apache/camel/support/MessageSupport.java
index 6c1a2b1..48fcd71 100644
--- 
a/core/camel-support/src/main/java/org/apache/camel/support/MessageSupport.java
+++ 
b/core/camel-support/src/main/java/org/apache/camel/support/MessageSupport.java
@@ -42,6 +42,13 @@ public abstract class MessageSupport implements Message, 
CamelContextAware, Data
     private DataType dataType;
 
     @Override
+    public void reset() {
+        body = null;
+        messageId = null;
+        dataType = null;
+    }
+
+    @Override
     public String toString() {
         // do not output information about the message as it may contain 
sensitive information
         if (messageId != null) {

Reply via email to