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);
}
/**