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 <[email protected]>
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;
}