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 97a3e6c  CAMEL-16326: camel-core - Optimize usage of exchanage 
properties for state in routing engine.
97a3e6c is described below

commit 97a3e6ce363a0709e1fb38d5b249120001064ac6
Author: Claus Ibsen <[email protected]>
AuthorDate: Thu Mar 11 22:06:39 2021 +0100

    CAMEL-16326: camel-core - Optimize usage of exchanage properties for state 
in routing engine.
---
 .../src/main/java/org/apache/camel/Exchange.java     |  8 --------
 .../java/org/apache/camel/ExchangePropertyKey.java   |  1 +
 .../camel/impl/engine/DefaultManagementStrategy.java |  1 -
 .../errorhandler/NoErrorHandlerConfiguration.java    |  1 -
 .../java/org/apache/camel/processor/Pipeline.java    |  2 +-
 .../processor/transformer/ProcessorTransformer.java  | 13 +++++--------
 .../processor/validator/ProcessorValidator.java      | 16 +++++-----------
 .../properties/OptionalPropertyPlaceholderTest.java  |  3 ---
 .../org/apache/camel/support/ExchangeHelper.java     | 20 ++++++++------------
 9 files changed, 20 insertions(+), 45 deletions(-)

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 6cf1fcd..1111043 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
@@ -65,14 +65,6 @@ import org.apache.camel.spi.annotations.ConstantProvider;
 @ConstantProvider("org.apache.camel.ExchangeConstantProvider")
 public interface Exchange {
 
-    // TODO: camel-core-processor using exchange properties for meta-data
-    // gather list of different keys they use, and then make an optimized
-    // exchange property map for this by getting key via some ordinal value 
(0, 1, 2, 3, etc)
-    // that is an index to an array that holds the value
-    // and then that array is reset in reset method
-    // and the getProperty is then aware of these special keys to lookup in 
array instead of map
-    // and then do profiling again JDK mission control, likely 1.4mb reduced 
down to very little
-
     String AUTHENTICATION = "CamelAuthentication";
     String AUTHENTICATION_FAILURE_POLICY_ID = 
"CamelAuthenticationFailurePolicyId";
     @Deprecated
diff --git 
a/core/camel-api/src/main/java/org/apache/camel/ExchangePropertyKey.java 
b/core/camel-api/src/main/java/org/apache/camel/ExchangePropertyKey.java
index 9e21bee..c4d2c68 100644
--- a/core/camel-api/src/main/java/org/apache/camel/ExchangePropertyKey.java
+++ b/core/camel-api/src/main/java/org/apache/camel/ExchangePropertyKey.java
@@ -25,6 +25,7 @@ public enum ExchangePropertyKey {
     // so we can say 0..10 are frequently used
     // and 11..end are possible used
     // then we can optimize and have dirty flags for possible used
+    // and if not dirty then no need to go so far in the array
 
     AGGREGATED_COMPLETED_BY(Exchange.AGGREGATED_COMPLETED_BY),
     AGGREGATED_CORRELATION_KEY(Exchange.AGGREGATED_CORRELATION_KEY),
diff --git 
a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultManagementStrategy.java
 
b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultManagementStrategy.java
index b5ab948..ddf5103 100644
--- 
a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultManagementStrategy.java
+++ 
b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultManagementStrategy.java
@@ -181,7 +181,6 @@ public class DefaultManagementStrategy extends 
ServiceSupport implements Managem
     protected void doInit() throws Exception {
         ObjectHelper.notNull(getCamelContext(), "CamelContext", this);
         if (!getEventNotifiers().isEmpty()) {
-            // TODO: only for exchange event notifiers
             
getCamelContext().adapt(ExtendedCamelContext.class).setEventNotificationApplicable(true);
         }
         for (EventNotifier notifier : eventNotifiers) {
diff --git 
a/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/NoErrorHandlerConfiguration.java
 
b/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/NoErrorHandlerConfiguration.java
index e37c39d..89b43c1 100644
--- 
a/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/NoErrorHandlerConfiguration.java
+++ 
b/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/NoErrorHandlerConfiguration.java
@@ -17,7 +17,6 @@
 package org.apache.camel.model.errorhandler;
 
 // TODO: Maybe not needed
-// TODO: Maybe not needed
 import javax.xml.bind.annotation.XmlTransient;
 
 @XmlTransient
diff --git 
a/core/camel-core-processor/src/main/java/org/apache/camel/processor/Pipeline.java
 
b/core/camel-core-processor/src/main/java/org/apache/camel/processor/Pipeline.java
index 4973fb9..c583f00 100644
--- 
a/core/camel-core-processor/src/main/java/org/apache/camel/processor/Pipeline.java
+++ 
b/core/camel-core-processor/src/main/java/org/apache/camel/processor/Pipeline.java
@@ -106,7 +106,7 @@ public class Pipeline extends AsyncProcessorSupport 
implements Navigate<Processo
 
                 processor.process(exchange, this);
             } else {
-                // TODO: optimize we can likely avoid copy results due to same 
exchange instance
+                // copyResults is needed in case MEP is OUT and the message is 
not an OUT message
                 ExchangeHelper.copyResults(exchange, exchange);
 
                 // logging nextExchange as it contains the exchange that might 
have altered the payload and since
diff --git 
a/core/camel-core-processor/src/main/java/org/apache/camel/processor/transformer/ProcessorTransformer.java
 
b/core/camel-core-processor/src/main/java/org/apache/camel/processor/transformer/ProcessorTransformer.java
index 113400f..8ca800d 100644
--- 
a/core/camel-core-processor/src/main/java/org/apache/camel/processor/transformer/ProcessorTransformer.java
+++ 
b/core/camel-core-processor/src/main/java/org/apache/camel/processor/transformer/ProcessorTransformer.java
@@ -18,12 +18,11 @@ package org.apache.camel.processor.transformer;
 
 import org.apache.camel.CamelContext;
 import org.apache.camel.Exchange;
-import org.apache.camel.ExtendedExchange;
 import org.apache.camel.Message;
 import org.apache.camel.Processor;
 import org.apache.camel.spi.DataType;
 import org.apache.camel.spi.Transformer;
-import org.apache.camel.support.DefaultExchange;
+import org.apache.camel.support.ExchangeHelper;
 import org.apache.camel.support.service.ServiceHelper;
 import org.apache.camel.util.ObjectHelper;
 import org.slf4j.Logger;
@@ -67,12 +66,10 @@ public class ProcessorTransformer extends Transformer {
         }
 
         LOG.debug("Sending to transform processor: {}", processor);
-        Exchange transformExchange = new DefaultExchange(exchange);
-        transformExchange.setIn(message);
-        // TODO: seems like its creating a copy
-        
transformExchange.adapt(ExtendedExchange.class).setProperties(exchange.getProperties());
-        processor.process(transformExchange);
-        Message answer = transformExchange.getMessage();
+        // create a new exchange to use during transform to avoid side-effects 
on original exchange
+        Exchange copy = ExchangeHelper.createCorrelatedCopy(exchange, false, 
true);
+        processor.process(copy);
+        Message answer = copy.getMessage();
 
         if (to.isJavaType()) {
             Object answerBody = answer.getBody();
diff --git 
a/core/camel-core-processor/src/main/java/org/apache/camel/processor/validator/ProcessorValidator.java
 
b/core/camel-core-processor/src/main/java/org/apache/camel/processor/validator/ProcessorValidator.java
index af36453..6524cc7 100644
--- 
a/core/camel-core-processor/src/main/java/org/apache/camel/processor/validator/ProcessorValidator.java
+++ 
b/core/camel-core-processor/src/main/java/org/apache/camel/processor/validator/ProcessorValidator.java
@@ -18,13 +18,11 @@ package org.apache.camel.processor.validator;
 
 import org.apache.camel.CamelContext;
 import org.apache.camel.Exchange;
-import org.apache.camel.ExtendedExchange;
 import org.apache.camel.Message;
 import org.apache.camel.Processor;
 import org.apache.camel.ValidationException;
 import org.apache.camel.spi.DataType;
 import org.apache.camel.spi.Validator;
-import org.apache.camel.support.DefaultExchange;
 import org.apache.camel.support.ExchangeHelper;
 import org.apache.camel.support.service.ServiceHelper;
 import org.apache.camel.util.ObjectHelper;
@@ -58,21 +56,17 @@ public class ProcessorValidator extends Validator {
 
         LOG.debug("Sending to validate processor '{}'", processor);
         // create a new exchange to use during validation to avoid 
side-effects on original exchange
-        Exchange validateExchange = new DefaultExchange(exchange);
-        validateExchange.setIn(message);
-        // TODO: seems like its creating a copy
-        
validateExchange.adapt(ExtendedExchange.class).setProperties(exchange.getProperties());
+        Exchange copy = ExchangeHelper.createCorrelatedCopy(exchange, false, 
true);
         try {
-            processor.process(validateExchange);
+            processor.process(copy);
 
             // if the validation failed then propagate the exception
-            if (validateExchange.getException() != null) {
-                exchange.setException(validateExchange.getException());
+            if (copy.getException() != null) {
+                exchange.setException(copy.getException());
             } else {
                 // success copy result
-                ExchangeHelper.copyResults(exchange, validateExchange);
+                ExchangeHelper.copyResults(exchange, copy);
             }
-
         } catch (Exception e) {
             if (e instanceof ValidationException) {
                 throw (ValidationException) e;
diff --git 
a/core/camel-core/src/test/java/org/apache/camel/component/properties/OptionalPropertyPlaceholderTest.java
 
b/core/camel-core/src/test/java/org/apache/camel/component/properties/OptionalPropertyPlaceholderTest.java
index 63edb17..a80ce29 100644
--- 
a/core/camel-core/src/test/java/org/apache/camel/component/properties/OptionalPropertyPlaceholderTest.java
+++ 
b/core/camel-core/src/test/java/org/apache/camel/component/properties/OptionalPropertyPlaceholderTest.java
@@ -27,9 +27,6 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
 
 public class OptionalPropertyPlaceholderTest extends ContextTestSupport {
 
-    // TODO: eip test
-    // TODO: reuse code in AbstractCamelContext and endpoint-dsl
-
     @Override
     public boolean isUseRouteBuilder() {
         return false;
diff --git 
a/core/camel-support/src/main/java/org/apache/camel/support/ExchangeHelper.java 
b/core/camel-support/src/main/java/org/apache/camel/support/ExchangeHelper.java
index a7fd4af..4a3d45d 100644
--- 
a/core/camel-support/src/main/java/org/apache/camel/support/ExchangeHelper.java
+++ 
b/core/camel-support/src/main/java/org/apache/camel/support/ExchangeHelper.java
@@ -851,6 +851,13 @@ public final class ExchangeHelper {
             answer.setProperties(safeCopyProperties(exchange.getProperties()));
         }
         exchange.adapt(ExtendedExchange.class).copyInternalProperties(answer);
+        // safe copy message history using a defensive copy
+        List<MessageHistory> history
+                = (List<MessageHistory>) 
exchange.getProperty(ExchangePropertyKey.MESSAGE_HISTORY);
+        if (history != null) {
+            // use thread-safe list as message history may be accessed 
concurrently
+            answer.setProperty(ExchangePropertyKey.MESSAGE_HISTORY, new 
CopyOnWriteArrayList<>(history));
+        }
 
         if (handover) {
             // Need to hand over the completion for async invocation
@@ -927,18 +934,7 @@ public final class ExchangeHelper {
         if (properties == null) {
             return null;
         }
-
-        Map<String, Object> answer = new ConcurrentHashMap<>(properties);
-
-        // safe copy message history using a defensive copy
-        // TODO: message history
-        List<MessageHistory> history = (List<MessageHistory>) 
answer.remove(Exchange.MESSAGE_HISTORY);
-        if (history != null) {
-            // use thread-safe list as message history may be accessed 
concurrently
-            answer.put(Exchange.MESSAGE_HISTORY, new 
CopyOnWriteArrayList<>(history));
-        }
-
-        return answer;
+        return new ConcurrentHashMap<>(properties);
     }
 
     /**

Reply via email to