This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch opt-exchangekey
in repository https://gitbox.apache.org/repos/asf/camel.git


The following commit(s) were added to refs/heads/opt-exchangekey by this push:
     new d9a3450  CAMEL-16326: camel-core - Optimize usage of exchanage 
properties for state in routing engine.
d9a3450 is described below

commit d9a3450c9eee8f27fc984569d41f2023beeb7f0d
Author: Claus Ibsen <claus.ib...@gmail.com>
AuthorDate: Thu Mar 11 21:50:52 2021 +0100

    CAMEL-16326: camel-core - Optimize usage of exchanage properties for state 
in routing engine.
---
 .../src/main/java/org/apache/camel/Exchange.java   |  2 +-
 .../java/org/apache/camel/ExtendedExchange.java    |  9 ++++++++
 .../camel/impl/DefaultExchangeHolderTest.java      | 27 ++++++++++++++++++++++
 .../org/apache/camel/support/AbstractExchange.java | 12 ++++++++++
 .../camel/support/DefaultExchangeHolder.java       | 13 +++++++++++
 5 files changed, 62 insertions(+), 1 deletion(-)

diff --git a/core/camel-api/src/main/java/org/apache/camel/Exchange.java 
b/core/camel-api/src/main/java/org/apache/camel/Exchange.java
index bf6c2fa..6cf1fcd 100644
--- a/core/camel-api/src/main/java/org/apache/camel/Exchange.java
+++ b/core/camel-api/src/main/java/org/apache/camel/Exchange.java
@@ -414,7 +414,7 @@ public interface Exchange {
     /**
      * Returns all of the properties associated with the exchange
      *
-     * @return all the headers in a Map
+     * @return all the properties in a Map
      */
     Map<String, Object> getProperties();
 
diff --git 
a/core/camel-api/src/main/java/org/apache/camel/ExtendedExchange.java 
b/core/camel-api/src/main/java/org/apache/camel/ExtendedExchange.java
index b40bcca..bf1866e 100644
--- a/core/camel-api/src/main/java/org/apache/camel/ExtendedExchange.java
+++ b/core/camel-api/src/main/java/org/apache/camel/ExtendedExchange.java
@@ -180,4 +180,13 @@ public interface ExtendedExchange extends Exchange {
      */
     void copyInternalProperties(Exchange target);
 
+    /**
+     * Gets the internal properties from this exchange.
+     * <p/>
+     * This method is only intended for Camel internally.
+     *
+     * @return all the internal properties in a Map
+     */
+    Map<String, Object> getInternalProperties();
+
 }
diff --git 
a/core/camel-core/src/test/java/org/apache/camel/impl/DefaultExchangeHolderTest.java
 
b/core/camel-core/src/test/java/org/apache/camel/impl/DefaultExchangeHolderTest.java
index af1175f..fd6273b 100644
--- 
a/core/camel-core/src/test/java/org/apache/camel/impl/DefaultExchangeHolderTest.java
+++ 
b/core/camel-core/src/test/java/org/apache/camel/impl/DefaultExchangeHolderTest.java
@@ -150,6 +150,33 @@ public class DefaultExchangeHolderTest extends 
ContextTestSupport {
         }
     }
 
+    @Test
+    public void testCaughtException() throws Exception {
+        // use a mixed list, the MyFoo is not serializable so the entire list
+        // should be skipped
+        List<Object> list = new ArrayList<>();
+        list.add("I am okay");
+        list.add(new MyFoo("Tiger"));
+
+        Exchange exchange = new DefaultExchange(context);
+        exchange.getIn().setBody("Hello World");
+        exchange.getIn().setHeader("Foo", list);
+        exchange.getIn().setHeader("Bar", 123);
+        exchange.setProperty(Exchange.EXCEPTION_CAUGHT, new 
IllegalArgumentException("Forced"));
+
+        DefaultExchangeHolder holder = DefaultExchangeHolder.marshal(exchange);
+
+        exchange = new DefaultExchange(context);
+        DefaultExchangeHolder.unmarshal(exchange, holder);
+
+        // the caught exception should be included
+        assertEquals("Hello World", exchange.getIn().getBody());
+        assertEquals(123, exchange.getIn().getHeader("Bar"));
+        assertNull(exchange.getIn().getHeader("Foo"));
+        assertNotNull(exchange.getProperty(Exchange.EXCEPTION_CAUGHT));
+        assertEquals("Forced", exchange.getProperty(Exchange.EXCEPTION_CAUGHT, 
Exception.class).getMessage());
+    }
+
     private DefaultExchangeHolder createHolder(boolean includeProperties) {
         Exchange exchange = new DefaultExchange(context);
         id = exchange.getExchangeId();
diff --git 
a/core/camel-support/src/main/java/org/apache/camel/support/AbstractExchange.java
 
b/core/camel-support/src/main/java/org/apache/camel/support/AbstractExchange.java
index c9bdc78..bb24ecd 100644
--- 
a/core/camel-support/src/main/java/org/apache/camel/support/AbstractExchange.java
+++ 
b/core/camel-support/src/main/java/org/apache/camel/support/AbstractExchange.java
@@ -820,6 +820,18 @@ class AbstractExchange implements ExtendedExchange {
         }
     }
 
+    @Override
+    public Map<String, Object> getInternalProperties() {
+        Map<String, Object> map = new HashMap<>();
+        for (ExchangePropertyKey key : ExchangePropertyKey.values()) {
+            Object value = internalProperties[key.ordinal()];
+            if (value != null) {
+                map.put(key.getName(), value);
+            }
+        }
+        return map;
+    }
+
     protected String createExchangeId() {
         return context.getUuidGenerator().generateUuid();
     }
diff --git 
a/core/camel-support/src/main/java/org/apache/camel/support/DefaultExchangeHolder.java
 
b/core/camel-support/src/main/java/org/apache/camel/support/DefaultExchangeHolder.java
index 5d7d679..cca2643 100644
--- 
a/core/camel-support/src/main/java/org/apache/camel/support/DefaultExchangeHolder.java
+++ 
b/core/camel-support/src/main/java/org/apache/camel/support/DefaultExchangeHolder.java
@@ -25,6 +25,7 @@ import java.util.LinkedHashMap;
 import java.util.Map;
 
 import org.apache.camel.Exchange;
+import org.apache.camel.ExtendedExchange;
 import org.apache.camel.RuntimeExchangeException;
 import org.apache.camel.WrappedFile;
 import org.apache.camel.util.ObjectHelper;
@@ -237,6 +238,18 @@ public class DefaultExchangeHolder implements Serializable 
{
                 properties = new LinkedHashMap<>(map);
             }
         }
+        // also include the internal properties
+        Map<String, Object> map = 
checkValidExchangePropertyObjects("properties", exchange,
+                exchange.adapt(ExtendedExchange.class).getInternalProperties(),
+                allowSerializedHeaders);
+        if (map != null && !map.isEmpty()) {
+            if (properties == null) {
+                properties = new LinkedHashMap<>(map);
+            } else {
+                properties.putAll(map);
+            }
+        }
+
         return null;
     }
 

Reply via email to