This is an automated email from the ASF dual-hosted git repository.
orpiske pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/main by this push:
new b573466c4b6 CAMEL-19058: wrap some internal properties in an EnumMap
b573466c4b6 is described below
commit b573466c4b6171bb12d23049e74bc400bc634b35
Author: Otavio Rodolfo Piske <[email protected]>
AuthorDate: Wed May 3 09:39:44 2023 +0200
CAMEL-19058: wrap some internal properties in an EnumMap
This should make it simpler to abstract their complexity while maintaining
reasonable performance (as they are used in many parts within the hot path)
---
.../org/apache/camel/support/AbstractExchange.java | 40 +++++++---------------
.../camel/support/DefaultPooledExchange.java | 3 +-
.../org/apache/camel/support/MessageSupport.java | 16 ++++-----
3 files changed, 20 insertions(+), 39 deletions(-)
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 2533c79bc6d..edc6b887344 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
@@ -16,6 +16,7 @@
*/
package org.apache.camel.support;
+import java.util.EnumMap;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
@@ -51,15 +52,10 @@ import static
org.apache.camel.support.MessageHelper.copyBody;
* @see DefaultExchange
*/
class AbstractExchange implements Exchange {
- // number of elements in array
- protected static final int INTERNAL_LENGTH =
ExchangePropertyKey.values().length;
- // empty array for reset
- protected static final Object[] EMPTY_INTERNAL_PROPERTIES = new
Object[INTERNAL_LENGTH];
+ protected final EnumMap<ExchangePropertyKey, Object> internalProperties =
new EnumMap<>(ExchangePropertyKey.class);
protected final CamelContext context;
protected Map<String, Object> properties; // create properties on-demand
as we use internal properties mostly
- // optimize for internal exchange properties (not intended for end users)
- protected final Object[] internalProperties = new Object[INTERNAL_LENGTH];
protected long created;
protected Message in;
protected Message out;
@@ -155,17 +151,11 @@ class AbstractExchange implements Exchange {
safeCopyProperties(this.safeCopyProperties,
exchange.getSafeCopyProperties());
}
// copy over internal properties
- System.arraycopy(internalProperties, 0, exchange.internalProperties,
0, internalProperties.length);
+ exchange.internalProperties.putAll(internalProperties);
if (getContext().isMessageHistory()) {
- // safe copy message history using a defensive copy
- List<MessageHistory> history
- = (List<MessageHistory>)
exchange.internalProperties[ExchangePropertyKey.MESSAGE_HISTORY.ordinal()];
- if (history != null) {
- // use thread-safe list as message history may be accessed
concurrently
-
exchange.internalProperties[ExchangePropertyKey.MESSAGE_HISTORY.ordinal()]
- = new CopyOnWriteArrayList<>(history);
- }
+
exchange.internalProperties.computeIfPresent(ExchangePropertyKey.MESSAGE_HISTORY,
+ (k, v) -> new
CopyOnWriteArrayList<>((List<MessageHistory>) v));
}
return exchange;
@@ -205,7 +195,7 @@ class AbstractExchange implements Exchange {
@Override
public Object getProperty(ExchangePropertyKey key) {
- return internalProperties[key.ordinal()];
+ return internalProperties.get(key);
}
@Override
@@ -253,14 +243,12 @@ class AbstractExchange implements Exchange {
@Override
public void setProperty(ExchangePropertyKey key, Object value) {
- internalProperties[key.ordinal()] = value;
+ internalProperties.put(key, value);
}
@Override
public Object removeProperty(ExchangePropertyKey key) {
- Object old = internalProperties[key.ordinal()];
- internalProperties[key.ordinal()] = null;
- return old;
+ return internalProperties.remove(key);
}
@Override
@@ -268,7 +256,7 @@ class AbstractExchange implements Exchange {
Object answer = null;
ExchangePropertyKey key =
ExchangePropertyKey.asExchangePropertyKey(name);
if (key != null) {
- answer = internalProperties[key.ordinal()];
+ answer = internalProperties.get(key);
// if the property is not an internal then fallback to lookup in
the properties map
}
if (answer == null && properties != null) {
@@ -372,8 +360,7 @@ class AbstractExchange implements Exchange {
if (properties != null) {
properties.clear();
}
- // reset array by copying over from empty which is a very fast JVM
optimized operation
- System.arraycopy(EMPTY_INTERNAL_PROPERTIES, 0,
this.internalProperties, 0, INTERNAL_LENGTH);
+ internalProperties.clear();
return true;
}
@@ -385,7 +372,7 @@ class AbstractExchange implements Exchange {
continue;
}
matches = true;
- internalProperties[epk.ordinal()] = null;
+ internalProperties.remove(epk);
}
}
@@ -683,14 +670,13 @@ class AbstractExchange implements Exchange {
}
void copyInternalProperties(Exchange target) {
- AbstractExchange ae = (AbstractExchange) target;
- System.arraycopy(internalProperties, 0, ae.internalProperties, 0,
INTERNAL_LENGTH);
+ ((AbstractExchange)
target).internalProperties.putAll(internalProperties);
}
Map<String, Object> getInternalProperties() {
Map<String, Object> map = new HashMap<>();
for (ExchangePropertyKey key : ExchangePropertyKey.values()) {
- Object value = internalProperties[key.ordinal()];
+ Object value = internalProperties.get(key);
if (value != null) {
map.put(key.getName(), value);
}
diff --git
a/core/camel-support/src/main/java/org/apache/camel/support/DefaultPooledExchange.java
b/core/camel-support/src/main/java/org/apache/camel/support/DefaultPooledExchange.java
index 33e65434f07..75bcfca549a 100644
---
a/core/camel-support/src/main/java/org/apache/camel/support/DefaultPooledExchange.java
+++
b/core/camel-support/src/main/java/org/apache/camel/support/DefaultPooledExchange.java
@@ -83,8 +83,7 @@ public final class DefaultPooledExchange extends
AbstractExchange implements Poo
if (created > 0) {
this.created = 0; // by setting to 0 we also flag that this
exchange is done and needs to be reset to use again
this.properties.clear();
- // reset array by copying over from empty which is a very fast JVM
optimized operation
- System.arraycopy(EMPTY_INTERNAL_PROPERTIES, 0,
this.internalProperties, 0, INTERNAL_LENGTH);
+ internalProperties.clear();
if (this.safeCopyProperties != null) {
this.safeCopyProperties.clear();
}
diff --git
a/core/camel-support/src/main/java/org/apache/camel/support/MessageSupport.java
b/core/camel-support/src/main/java/org/apache/camel/support/MessageSupport.java
index 78cf5a979c8..12896a5ee89 100644
---
a/core/camel-support/src/main/java/org/apache/camel/support/MessageSupport.java
+++
b/core/camel-support/src/main/java/org/apache/camel/support/MessageSupport.java
@@ -16,7 +16,7 @@
*/
package org.apache.camel.support;
-import java.util.Arrays;
+import java.util.EnumMap;
import org.apache.camel.CamelContext;
import org.apache.camel.CamelContextAware;
@@ -36,8 +36,6 @@ import org.apache.camel.trait.message.MessageTrait;
* from {@link DefaultMessage}
*/
public abstract class MessageSupport implements Message, CamelContextAware,
DataTypeAware {
- private static final int NUM_TRAITS = MessageTrait.values().length;
-
CamelContext camelContext;
TypeConverter typeConverter;
private Exchange exchange;
@@ -45,13 +43,13 @@ public abstract class MessageSupport implements Message,
CamelContextAware, Data
private String messageId;
private long messageTimestamp;
- private final Object[] traits = new Object[NUM_TRAITS];
+ private final EnumMap<MessageTrait, Object> traits = new
EnumMap<>(MessageTrait.class);
@Override
public void reset() {
body = null;
messageId = null;
- Arrays.fill(traits, null);
+ traits.clear();
}
@Override
@@ -312,18 +310,16 @@ public abstract class MessageSupport implements Message,
CamelContextAware, Data
@Override
public boolean hasTrait(MessageTrait trait) {
- Object payload = traits[trait.ordinal()];
-
- return payload != null;
+ return traits.containsKey(trait);
}
@Override
public Object getPayloadForTrait(MessageTrait trait) {
- return traits[trait.ordinal()];
+ return traits.get(trait);
}
@Override
public void setPayloadForTrait(MessageTrait trait, Object object) {
- traits[trait.ordinal()] = object;
+ traits.put(trait, object);
}
}