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