From c93dcfcc0ec907ec23f521be25a89e48ddceb0c8 Mon Sep 17 00:00:00 2001 From: Andrea Cosentino Date: Fri, 4 Sep 2026 10:38:47 +0200 Subject: [PATCH] CAMEL-24624: camel-infinispan - catalog, lifecycle and efficiency cleanups Five small items found while auditing the component. The CamelInfinispanOperationResult header is deprecated. It has had no reader or writer since the remote and embedded components were split, yet it was published in both catalogs and rendered in the docs with the description of CamelInfinispanOperationResultHeader, which is the option that actually names the result header. CamelInfinispanIgnoreReturnValues is documented as a producer header. It is read on the producer path, in InfinispanEmbeddedManager#getCache(Message, String), and its description is producer semantics, so it was in the wrong group. Both consumers now stop the handler that owns the cache listener before calling super.doStop(), the reverse of doStart(). An event arriving between the two calls used to be processed against a consumer that was already stopped. The idempotent repository uses putIfAbsent instead of containsKey followed by put. The outcome is the same, it is atomic, it leaves the lifespan of an existing entry untouched, and it halves the round trips of every check. The remote cache forces return values since CAMEL-9840, so the previous value is always reported. Two typos: "Cannot remote the listener" and "InifinispanConfiguration". Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01JpshGTyfSmdq7hC8tuEwrZ --- .../camel/catalog/components/infinispan-embedded.json | 6 +++--- .../apache/camel/catalog/components/infinispan.json | 4 ++-- .../component/infinispan/InfinispanConstants.java | 9 ++++++--- .../infinispan/InfinispanIdempotentRepository.java | 11 +++-------- .../infinispan/embedded/infinispan-embedded.json | 6 +++--- .../embedded/InfinispanEmbeddedConsumer.java | 4 +++- .../camel/component/infinispan/remote/infinispan.json | 4 ++-- .../infinispan/remote/InfinispanRemoteConsumer.java | 6 ++++-- .../ROOT/pages/camel-4x-upgrade-guide-4_23.adoc | 11 +++++++++++ .../dsl/InfinispanEmbeddedEndpointBuilderFactory.java | 10 +++++++--- .../dsl/InfinispanRemoteEndpointBuilderFactory.java | 8 ++++++-- 11 files changed, 50 insertions(+), 29 deletions(-) diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/infinispan-embedded.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/infinispan-embedded.json index 4ecb3799a659d..2962b433fb031 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/infinispan-embedded.json +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/infinispan-embedded.json @@ -55,15 +55,15 @@ "CamelInfinispanOldValue": { "index": 6, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "Object", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The old value to use for a replace.", "constantName": "org.apache.camel.component.infinispan.InfinispanConstants#OLD_VALUE" }, "CamelInfinispanMap": { "index": 7, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "Map", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "A Map to use in case of CamelInfinispanOperationPutAll operation", "constantName": "org.apache.camel.component.infinispan.InfinispanConstants#MAP" }, "CamelInfinispanOperation": { "index": 8, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "org.apache.camel.component.infinispan.InfinispanOperation", "enum": [ "PUT", "PUTASYNC", "PUTALL", "PUTALLASYNC", "PUTIFABSENT", "PUTIFABSENTASYNC", "GET", "GETORDEFAULT", "CONTAINSKEY", "CONTAINSVALUE", "REMOVE", "REMOVEASYNC", "REPLACE", "REPLACEASYNC", "SIZE", "CLEAR", "CLEARASYNC", "QUERY", "STATS", "COMPUTE", "COMPUTEASYNC" ], "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The operation to perform.", "constantName": "org.apache.camel.component.infinispan.InfinispanConstants#OPERATION" }, - "CamelInfinispanOperationResult": { "index": 9, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The name of the header whose value is the result", "constantName": "org.apache.camel.component.infinispan.InfinispanConstants#RESULT" }, + "CamelInfinispanOperationResult": { "index": 9, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": true, "deprecationNote": "Never set nor read by the component. Use CamelInfinispanOperationResultHeader to choose the header that carries the result of an operation.", "autowired": false, "secret": false, "description": "The name of the header whose value is the result. Deprecation note: Never set nor read by the component. Use CamelInfinispanOperationResultHeader to choose the header that carries the result of an operation.", "constantName": "org.apache.camel.component.infinispan.InfinispanConstants#RESULT" }, "CamelInfinispanOperationResultHeader": { "index": 10, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Store the operation result in a header instead of the message body", "constantName": "org.apache.camel.component.infinispan.InfinispanConstants#RESULT_HEADER" }, "CamelInfinispanLifespanTime": { "index": 11, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "long", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The Lifespan time of a value inside the cache. Negative values are interpreted as infinity.", "constantName": "org.apache.camel.component.infinispan.InfinispanConstants#LIFESPAN_TIME" }, "CamelInfinispanTimeUnit": { "index": 12, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "java.util.concurrent.TimeUnit", "enum": [ "NANOSECONDS", "MICROSECONDS", "MILLISECONDS", "SECONDS", "MINUTES", "HOURS", "DAYS" ], "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The Time Unit of an entry Lifespan Time.", "constantName": "org.apache.camel.component.infinispan.InfinispanConstants#LIFESPAN_TIME_UNIT" }, "CamelInfinispanMaxIdleTime": { "index": 13, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "long", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The maximum amount of time an entry is allowed to be idle for before it is considered as expired.", "constantName": "org.apache.camel.component.infinispan.InfinispanConstants#MAX_IDLE_TIME" }, "CamelInfinispanMaxIdleTimeUnit": { "index": 14, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "java.util.concurrent.TimeUnit", "enum": [ "NANOSECONDS", "MICROSECONDS", "MILLISECONDS", "SECONDS", "MINUTES", "HOURS", "DAYS" ], "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The Time Unit of an entry Max Idle Time.", "constantName": "org.apache.camel.component.infinispan.InfinispanConstants#MAX_IDLE_TIME_UNIT" }, - "CamelInfinispanIgnoreReturnValues": { "index": 15, "kind": "header", "displayName": "", "group": "consumer", "label": "consumer", "required": false, "javaType": "boolean", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "defaultValue": "false", "description": "Signals that a write operation's return value will be ignored, so reading the existing value from a store or from a remote node is not necessary.", "constantName": "org.apache.camel.component.infinispan.InfinispanConstants#IGNORE_RETURN_VALUES" }, + "CamelInfinispanIgnoreReturnValues": { "index": 15, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "boolean", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "defaultValue": "false", "description": "Signals that a write operation's return value will be ignored, so reading the existing value from a store or from a remote node is not necessary.", "constantName": "org.apache.camel.component.infinispan.InfinispanConstants#IGNORE_RETURN_VALUES" }, "CamelInfinispanEventData": { "index": 16, "kind": "header", "displayName": "", "group": "consumer", "label": "consumer", "required": false, "javaType": "Object", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The event data.", "constantName": "org.apache.camel.component.infinispan.InfinispanConstants#EVENT_DATA" }, - "CamelInfinispanQueryBuilder": { "index": 17, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "org.apache.camel.component.infinispan.InfinispanQueryBuilder", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The QueryBuilder to use for QUERY command, if not present the command defaults to InifinispanConfiguration's one", "constantName": "org.apache.camel.component.infinispan.InfinispanConstants#QUERY_BUILDER" }, + "CamelInfinispanQueryBuilder": { "index": 17, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "org.apache.camel.component.infinispan.InfinispanQueryBuilder", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The QueryBuilder to use for QUERY command, if not present the command defaults to the InfinispanConfiguration one", "constantName": "org.apache.camel.component.infinispan.InfinispanConstants#QUERY_BUILDER" }, "CamelInfinispanCommandRetried": { "index": 18, "kind": "header", "displayName": "", "group": "consumer", "label": "consumer", "required": false, "javaType": "boolean", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "This will be true if the write command that caused this had to be retried again due to a topology change.", "constantName": "org.apache.camel.component.infinispan.InfinispanConstants#COMMAND_RETRIED" }, "CamelInfinispanEntryCreated": { "index": 19, "kind": "header", "displayName": "", "group": "consumer", "label": "consumer", "required": false, "javaType": "boolean", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Indicates whether the cache entry modification event is the result of the cache entry being created.", "constantName": "org.apache.camel.component.infinispan.InfinispanConstants#ENTRY_CREATED" }, "CamelInfinispanOriginLocal": { "index": 20, "kind": "header", "displayName": "", "group": "consumer", "label": "consumer", "required": false, "javaType": "boolean", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "true if the call originated on the local cache instance; false if originated from a remote one.", "constantName": "org.apache.camel.component.infinispan.InfinispanConstants#ORIGIN_LOCAL" }, diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/infinispan.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/infinispan.json index f1fbf00503ac0..40181cff79c9d 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/infinispan.json +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/infinispan.json @@ -67,14 +67,14 @@ "CamelInfinispanOldValue": { "index": 5, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "Object", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The old value to use for a replace.", "constantName": "org.apache.camel.component.infinispan.InfinispanConstants#OLD_VALUE" }, "CamelInfinispanMap": { "index": 6, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "Map", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "A Map to use in case of CamelInfinispanOperationPutAll operation", "constantName": "org.apache.camel.component.infinispan.InfinispanConstants#MAP" }, "CamelInfinispanOperation": { "index": 7, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "org.apache.camel.component.infinispan.InfinispanOperation", "enum": [ "PUT", "PUTASYNC", "PUTALL", "PUTALLASYNC", "PUTIFABSENT", "PUTIFABSENTASYNC", "GET", "GETORDEFAULT", "CONTAINSKEY", "CONTAINSVALUE", "REMOVE", "REMOVEASYNC", "REPLACE", "REPLACEASYNC", "SIZE", "CLEAR", "CLEARASYNC", "QUERY", "STATS", "COMPUTE", "COMPUTEASYNC" ], "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The operation to perform.", "constantName": "org.apache.camel.component.infinispan.InfinispanConstants#OPERATION" }, - "CamelInfinispanOperationResult": { "index": 8, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The name of the header whose value is the result", "constantName": "org.apache.camel.component.infinispan.InfinispanConstants#RESULT" }, + "CamelInfinispanOperationResult": { "index": 8, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": true, "deprecationNote": "Never set nor read by the component. Use CamelInfinispanOperationResultHeader to choose the header that carries the result of an operation.", "autowired": false, "secret": false, "description": "The name of the header whose value is the result. Deprecation note: Never set nor read by the component. Use CamelInfinispanOperationResultHeader to choose the header that carries the result of an operation.", "constantName": "org.apache.camel.component.infinispan.InfinispanConstants#RESULT" }, "CamelInfinispanOperationResultHeader": { "index": 9, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Store the operation result in a header instead of the message body", "constantName": "org.apache.camel.component.infinispan.InfinispanConstants#RESULT_HEADER" }, "CamelInfinispanLifespanTime": { "index": 10, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "long", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The Lifespan time of a value inside the cache. Negative values are interpreted as infinity.", "constantName": "org.apache.camel.component.infinispan.InfinispanConstants#LIFESPAN_TIME" }, "CamelInfinispanTimeUnit": { "index": 11, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "java.util.concurrent.TimeUnit", "enum": [ "NANOSECONDS", "MICROSECONDS", "MILLISECONDS", "SECONDS", "MINUTES", "HOURS", "DAYS" ], "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The Time Unit of an entry Lifespan Time.", "constantName": "org.apache.camel.component.infinispan.InfinispanConstants#LIFESPAN_TIME_UNIT" }, "CamelInfinispanMaxIdleTime": { "index": 12, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "long", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The maximum amount of time an entry is allowed to be idle for before it is considered as expired.", "constantName": "org.apache.camel.component.infinispan.InfinispanConstants#MAX_IDLE_TIME" }, "CamelInfinispanMaxIdleTimeUnit": { "index": 13, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "java.util.concurrent.TimeUnit", "enum": [ "NANOSECONDS", "MICROSECONDS", "MILLISECONDS", "SECONDS", "MINUTES", "HOURS", "DAYS" ], "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The Time Unit of an entry Max Idle Time.", "constantName": "org.apache.camel.component.infinispan.InfinispanConstants#MAX_IDLE_TIME_UNIT" }, "CamelInfinispanEventData": { "index": 14, "kind": "header", "displayName": "", "group": "consumer", "label": "consumer", "required": false, "javaType": "Object", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The event data.", "constantName": "org.apache.camel.component.infinispan.InfinispanConstants#EVENT_DATA" }, - "CamelInfinispanQueryBuilder": { "index": 15, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "org.apache.camel.component.infinispan.InfinispanQueryBuilder", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The QueryBuilder to use for QUERY command, if not present the command defaults to InifinispanConfiguration's one", "constantName": "org.apache.camel.component.infinispan.InfinispanConstants#QUERY_BUILDER" }, + "CamelInfinispanQueryBuilder": { "index": 15, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "org.apache.camel.component.infinispan.InfinispanQueryBuilder", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The QueryBuilder to use for QUERY command, if not present the command defaults to the InfinispanConfiguration one", "constantName": "org.apache.camel.component.infinispan.InfinispanConstants#QUERY_BUILDER" }, "CamelInfinispanEntryVersion": { "index": 16, "kind": "header", "displayName": "", "group": "consumer", "label": "consumer", "required": false, "javaType": "long", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Provides access to the version of the created cache entry.", "constantName": "org.apache.camel.component.infinispan.InfinispanConstants#ENTRY_VERSION" }, "CamelInfinispanCommandRetried": { "index": 17, "kind": "header", "displayName": "", "group": "consumer", "label": "consumer", "required": false, "javaType": "boolean", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "This will be true if the write command that caused this had to be retried again due to a topology change.", "constantName": "org.apache.camel.component.infinispan.InfinispanConstants#COMMAND_RETRIED" } }, diff --git a/components/camel-infinispan/camel-infinispan-common/src/main/java/org/apache/camel/component/infinispan/InfinispanConstants.java b/components/camel-infinispan/camel-infinispan-common/src/main/java/org/apache/camel/component/infinispan/InfinispanConstants.java index 0b514c541828f..ff18619ebdade 100644 --- a/components/camel-infinispan/camel-infinispan-common/src/main/java/org/apache/camel/component/infinispan/InfinispanConstants.java +++ b/components/camel-infinispan/camel-infinispan-common/src/main/java/org/apache/camel/component/infinispan/InfinispanConstants.java @@ -47,7 +47,10 @@ public interface InfinispanConstants { @Metadata(label = "producer", description = "The operation to perform.", javaType = "org.apache.camel.component.infinispan.InfinispanOperation") String OPERATION = "CamelInfinispanOperation"; - @Metadata(label = "producer", description = "The name of the header whose value is the result", javaType = "String") + @Metadata(label = "producer", description = "The name of the header whose value is the result", javaType = "String", + deprecationNote = "Never set nor read by the component. Use CamelInfinispanOperationResultHeader to choose" + + " the header that carries the result of an operation.") + @Deprecated String RESULT = "CamelInfinispanOperationResult"; @Metadata(label = "producer", description = "Store the operation result in a header instead of the message body", javaType = "String") @@ -66,14 +69,14 @@ public interface InfinispanConstants { @Metadata(label = "producer", description = "The Time Unit of an entry Max Idle Time.", javaType = "java.util.concurrent.TimeUnit") String MAX_IDLE_TIME_UNIT = "CamelInfinispanMaxIdleTimeUnit"; - @Metadata(label = "consumer", + @Metadata(label = "producer", description = "Signals that a write operation's return value will be ignored, so reading the existing value from a store or from a remote node is not necessary.", javaType = "boolean", defaultValue = "false", applicableFor = SCHEME_EMBEDDED) String IGNORE_RETURN_VALUES = "CamelInfinispanIgnoreReturnValues"; @Metadata(label = "consumer", description = "The event data.", javaType = "Object") String EVENT_DATA = "CamelInfinispanEventData"; @Metadata(label = "producer", - description = "The QueryBuilder to use for QUERY command, if not present the command defaults to InifinispanConfiguration's one", + description = "The QueryBuilder to use for QUERY command, if not present the command defaults to the InfinispanConfiguration one", javaType = "org.apache.camel.component.infinispan.InfinispanQueryBuilder") String QUERY_BUILDER = "CamelInfinispanQueryBuilder"; @Metadata(label = "consumer", description = "Provides access to the version of the created cache entry.", javaType = "long", diff --git a/components/camel-infinispan/camel-infinispan-common/src/main/java/org/apache/camel/component/infinispan/InfinispanIdempotentRepository.java b/components/camel-infinispan/camel-infinispan-common/src/main/java/org/apache/camel/component/infinispan/InfinispanIdempotentRepository.java index b815fc6519f00..7054cb4ef3ca8 100644 --- a/components/camel-infinispan/camel-infinispan-common/src/main/java/org/apache/camel/component/infinispan/InfinispanIdempotentRepository.java +++ b/components/camel-infinispan/camel-infinispan-common/src/main/java/org/apache/camel/component/infinispan/InfinispanIdempotentRepository.java @@ -43,14 +43,9 @@ public void setCamelContext(CamelContext camelContext) { @Override @ManagedOperation(description = "Adds the key to the store") public boolean add(String key) { - // need to check first as put will update the entry lifetime so it can not expire its cache lifespan - if (getCache().containsKey(key)) { - // there is already an entry so return false - return false; - } - - Boolean put = getCache().put(key, true); - return put == null; + // putIfAbsent leaves an existing entry untouched, so its lifespan is not extended, and it takes a single + // round trip: the remote repository forces return values, so the previous value is always reported + return getCache().putIfAbsent(key, true) == null; } @Override diff --git a/components/camel-infinispan/camel-infinispan-embedded/src/generated/resources/META-INF/org/apache/camel/component/infinispan/embedded/infinispan-embedded.json b/components/camel-infinispan/camel-infinispan-embedded/src/generated/resources/META-INF/org/apache/camel/component/infinispan/embedded/infinispan-embedded.json index 4ecb3799a659d..2962b433fb031 100644 --- a/components/camel-infinispan/camel-infinispan-embedded/src/generated/resources/META-INF/org/apache/camel/component/infinispan/embedded/infinispan-embedded.json +++ b/components/camel-infinispan/camel-infinispan-embedded/src/generated/resources/META-INF/org/apache/camel/component/infinispan/embedded/infinispan-embedded.json @@ -55,15 +55,15 @@ "CamelInfinispanOldValue": { "index": 6, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "Object", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The old value to use for a replace.", "constantName": "org.apache.camel.component.infinispan.InfinispanConstants#OLD_VALUE" }, "CamelInfinispanMap": { "index": 7, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "Map", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "A Map to use in case of CamelInfinispanOperationPutAll operation", "constantName": "org.apache.camel.component.infinispan.InfinispanConstants#MAP" }, "CamelInfinispanOperation": { "index": 8, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "org.apache.camel.component.infinispan.InfinispanOperation", "enum": [ "PUT", "PUTASYNC", "PUTALL", "PUTALLASYNC", "PUTIFABSENT", "PUTIFABSENTASYNC", "GET", "GETORDEFAULT", "CONTAINSKEY", "CONTAINSVALUE", "REMOVE", "REMOVEASYNC", "REPLACE", "REPLACEASYNC", "SIZE", "CLEAR", "CLEARASYNC", "QUERY", "STATS", "COMPUTE", "COMPUTEASYNC" ], "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The operation to perform.", "constantName": "org.apache.camel.component.infinispan.InfinispanConstants#OPERATION" }, - "CamelInfinispanOperationResult": { "index": 9, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The name of the header whose value is the result", "constantName": "org.apache.camel.component.infinispan.InfinispanConstants#RESULT" }, + "CamelInfinispanOperationResult": { "index": 9, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": true, "deprecationNote": "Never set nor read by the component. Use CamelInfinispanOperationResultHeader to choose the header that carries the result of an operation.", "autowired": false, "secret": false, "description": "The name of the header whose value is the result. Deprecation note: Never set nor read by the component. Use CamelInfinispanOperationResultHeader to choose the header that carries the result of an operation.", "constantName": "org.apache.camel.component.infinispan.InfinispanConstants#RESULT" }, "CamelInfinispanOperationResultHeader": { "index": 10, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Store the operation result in a header instead of the message body", "constantName": "org.apache.camel.component.infinispan.InfinispanConstants#RESULT_HEADER" }, "CamelInfinispanLifespanTime": { "index": 11, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "long", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The Lifespan time of a value inside the cache. Negative values are interpreted as infinity.", "constantName": "org.apache.camel.component.infinispan.InfinispanConstants#LIFESPAN_TIME" }, "CamelInfinispanTimeUnit": { "index": 12, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "java.util.concurrent.TimeUnit", "enum": [ "NANOSECONDS", "MICROSECONDS", "MILLISECONDS", "SECONDS", "MINUTES", "HOURS", "DAYS" ], "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The Time Unit of an entry Lifespan Time.", "constantName": "org.apache.camel.component.infinispan.InfinispanConstants#LIFESPAN_TIME_UNIT" }, "CamelInfinispanMaxIdleTime": { "index": 13, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "long", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The maximum amount of time an entry is allowed to be idle for before it is considered as expired.", "constantName": "org.apache.camel.component.infinispan.InfinispanConstants#MAX_IDLE_TIME" }, "CamelInfinispanMaxIdleTimeUnit": { "index": 14, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "java.util.concurrent.TimeUnit", "enum": [ "NANOSECONDS", "MICROSECONDS", "MILLISECONDS", "SECONDS", "MINUTES", "HOURS", "DAYS" ], "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The Time Unit of an entry Max Idle Time.", "constantName": "org.apache.camel.component.infinispan.InfinispanConstants#MAX_IDLE_TIME_UNIT" }, - "CamelInfinispanIgnoreReturnValues": { "index": 15, "kind": "header", "displayName": "", "group": "consumer", "label": "consumer", "required": false, "javaType": "boolean", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "defaultValue": "false", "description": "Signals that a write operation's return value will be ignored, so reading the existing value from a store or from a remote node is not necessary.", "constantName": "org.apache.camel.component.infinispan.InfinispanConstants#IGNORE_RETURN_VALUES" }, + "CamelInfinispanIgnoreReturnValues": { "index": 15, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "boolean", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "defaultValue": "false", "description": "Signals that a write operation's return value will be ignored, so reading the existing value from a store or from a remote node is not necessary.", "constantName": "org.apache.camel.component.infinispan.InfinispanConstants#IGNORE_RETURN_VALUES" }, "CamelInfinispanEventData": { "index": 16, "kind": "header", "displayName": "", "group": "consumer", "label": "consumer", "required": false, "javaType": "Object", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The event data.", "constantName": "org.apache.camel.component.infinispan.InfinispanConstants#EVENT_DATA" }, - "CamelInfinispanQueryBuilder": { "index": 17, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "org.apache.camel.component.infinispan.InfinispanQueryBuilder", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The QueryBuilder to use for QUERY command, if not present the command defaults to InifinispanConfiguration's one", "constantName": "org.apache.camel.component.infinispan.InfinispanConstants#QUERY_BUILDER" }, + "CamelInfinispanQueryBuilder": { "index": 17, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "org.apache.camel.component.infinispan.InfinispanQueryBuilder", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The QueryBuilder to use for QUERY command, if not present the command defaults to the InfinispanConfiguration one", "constantName": "org.apache.camel.component.infinispan.InfinispanConstants#QUERY_BUILDER" }, "CamelInfinispanCommandRetried": { "index": 18, "kind": "header", "displayName": "", "group": "consumer", "label": "consumer", "required": false, "javaType": "boolean", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "This will be true if the write command that caused this had to be retried again due to a topology change.", "constantName": "org.apache.camel.component.infinispan.InfinispanConstants#COMMAND_RETRIED" }, "CamelInfinispanEntryCreated": { "index": 19, "kind": "header", "displayName": "", "group": "consumer", "label": "consumer", "required": false, "javaType": "boolean", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Indicates whether the cache entry modification event is the result of the cache entry being created.", "constantName": "org.apache.camel.component.infinispan.InfinispanConstants#ENTRY_CREATED" }, "CamelInfinispanOriginLocal": { "index": 20, "kind": "header", "displayName": "", "group": "consumer", "label": "consumer", "required": false, "javaType": "boolean", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "true if the call originated on the local cache instance; false if originated from a remote one.", "constantName": "org.apache.camel.component.infinispan.InfinispanConstants#ORIGIN_LOCAL" }, diff --git a/components/camel-infinispan/camel-infinispan-embedded/src/main/java/org/apache/camel/component/infinispan/embedded/InfinispanEmbeddedConsumer.java b/components/camel-infinispan/camel-infinispan-embedded/src/main/java/org/apache/camel/component/infinispan/embedded/InfinispanEmbeddedConsumer.java index 0bd7aeecaf526..c4550f65fe2b5 100644 --- a/components/camel-infinispan/camel-infinispan-embedded/src/main/java/org/apache/camel/component/infinispan/embedded/InfinispanEmbeddedConsumer.java +++ b/components/camel-infinispan/camel-infinispan-embedded/src/main/java/org/apache/camel/component/infinispan/embedded/InfinispanEmbeddedConsumer.java @@ -62,8 +62,10 @@ protected void doStart() throws Exception { @Override protected void doStop() throws Exception { - super.doStop(); + // the listener has to go before the consumer is stopped, or an event arriving in between is + // processed against a consumer that is already down ServiceHelper.stopService(handler); + super.doStop(); } // ********************************* diff --git a/components/camel-infinispan/camel-infinispan/src/generated/resources/META-INF/org/apache/camel/component/infinispan/remote/infinispan.json b/components/camel-infinispan/camel-infinispan/src/generated/resources/META-INF/org/apache/camel/component/infinispan/remote/infinispan.json index f1fbf00503ac0..40181cff79c9d 100644 --- a/components/camel-infinispan/camel-infinispan/src/generated/resources/META-INF/org/apache/camel/component/infinispan/remote/infinispan.json +++ b/components/camel-infinispan/camel-infinispan/src/generated/resources/META-INF/org/apache/camel/component/infinispan/remote/infinispan.json @@ -67,14 +67,14 @@ "CamelInfinispanOldValue": { "index": 5, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "Object", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The old value to use for a replace.", "constantName": "org.apache.camel.component.infinispan.InfinispanConstants#OLD_VALUE" }, "CamelInfinispanMap": { "index": 6, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "Map", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "A Map to use in case of CamelInfinispanOperationPutAll operation", "constantName": "org.apache.camel.component.infinispan.InfinispanConstants#MAP" }, "CamelInfinispanOperation": { "index": 7, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "org.apache.camel.component.infinispan.InfinispanOperation", "enum": [ "PUT", "PUTASYNC", "PUTALL", "PUTALLASYNC", "PUTIFABSENT", "PUTIFABSENTASYNC", "GET", "GETORDEFAULT", "CONTAINSKEY", "CONTAINSVALUE", "REMOVE", "REMOVEASYNC", "REPLACE", "REPLACEASYNC", "SIZE", "CLEAR", "CLEARASYNC", "QUERY", "STATS", "COMPUTE", "COMPUTEASYNC" ], "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The operation to perform.", "constantName": "org.apache.camel.component.infinispan.InfinispanConstants#OPERATION" }, - "CamelInfinispanOperationResult": { "index": 8, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The name of the header whose value is the result", "constantName": "org.apache.camel.component.infinispan.InfinispanConstants#RESULT" }, + "CamelInfinispanOperationResult": { "index": 8, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": true, "deprecationNote": "Never set nor read by the component. Use CamelInfinispanOperationResultHeader to choose the header that carries the result of an operation.", "autowired": false, "secret": false, "description": "The name of the header whose value is the result. Deprecation note: Never set nor read by the component. Use CamelInfinispanOperationResultHeader to choose the header that carries the result of an operation.", "constantName": "org.apache.camel.component.infinispan.InfinispanConstants#RESULT" }, "CamelInfinispanOperationResultHeader": { "index": 9, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Store the operation result in a header instead of the message body", "constantName": "org.apache.camel.component.infinispan.InfinispanConstants#RESULT_HEADER" }, "CamelInfinispanLifespanTime": { "index": 10, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "long", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The Lifespan time of a value inside the cache. Negative values are interpreted as infinity.", "constantName": "org.apache.camel.component.infinispan.InfinispanConstants#LIFESPAN_TIME" }, "CamelInfinispanTimeUnit": { "index": 11, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "java.util.concurrent.TimeUnit", "enum": [ "NANOSECONDS", "MICROSECONDS", "MILLISECONDS", "SECONDS", "MINUTES", "HOURS", "DAYS" ], "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The Time Unit of an entry Lifespan Time.", "constantName": "org.apache.camel.component.infinispan.InfinispanConstants#LIFESPAN_TIME_UNIT" }, "CamelInfinispanMaxIdleTime": { "index": 12, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "long", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The maximum amount of time an entry is allowed to be idle for before it is considered as expired.", "constantName": "org.apache.camel.component.infinispan.InfinispanConstants#MAX_IDLE_TIME" }, "CamelInfinispanMaxIdleTimeUnit": { "index": 13, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "java.util.concurrent.TimeUnit", "enum": [ "NANOSECONDS", "MICROSECONDS", "MILLISECONDS", "SECONDS", "MINUTES", "HOURS", "DAYS" ], "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The Time Unit of an entry Max Idle Time.", "constantName": "org.apache.camel.component.infinispan.InfinispanConstants#MAX_IDLE_TIME_UNIT" }, "CamelInfinispanEventData": { "index": 14, "kind": "header", "displayName": "", "group": "consumer", "label": "consumer", "required": false, "javaType": "Object", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The event data.", "constantName": "org.apache.camel.component.infinispan.InfinispanConstants#EVENT_DATA" }, - "CamelInfinispanQueryBuilder": { "index": 15, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "org.apache.camel.component.infinispan.InfinispanQueryBuilder", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The QueryBuilder to use for QUERY command, if not present the command defaults to InifinispanConfiguration's one", "constantName": "org.apache.camel.component.infinispan.InfinispanConstants#QUERY_BUILDER" }, + "CamelInfinispanQueryBuilder": { "index": 15, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "org.apache.camel.component.infinispan.InfinispanQueryBuilder", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The QueryBuilder to use for QUERY command, if not present the command defaults to the InfinispanConfiguration one", "constantName": "org.apache.camel.component.infinispan.InfinispanConstants#QUERY_BUILDER" }, "CamelInfinispanEntryVersion": { "index": 16, "kind": "header", "displayName": "", "group": "consumer", "label": "consumer", "required": false, "javaType": "long", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Provides access to the version of the created cache entry.", "constantName": "org.apache.camel.component.infinispan.InfinispanConstants#ENTRY_VERSION" }, "CamelInfinispanCommandRetried": { "index": 17, "kind": "header", "displayName": "", "group": "consumer", "label": "consumer", "required": false, "javaType": "boolean", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "This will be true if the write command that caused this had to be retried again due to a topology change.", "constantName": "org.apache.camel.component.infinispan.InfinispanConstants#COMMAND_RETRIED" } }, diff --git a/components/camel-infinispan/camel-infinispan/src/main/java/org/apache/camel/component/infinispan/remote/InfinispanRemoteConsumer.java b/components/camel-infinispan/camel-infinispan/src/main/java/org/apache/camel/component/infinispan/remote/InfinispanRemoteConsumer.java index 7a79246e38084..3d3ae9ca2a903 100644 --- a/components/camel-infinispan/camel-infinispan/src/main/java/org/apache/camel/component/infinispan/remote/InfinispanRemoteConsumer.java +++ b/components/camel-infinispan/camel-infinispan/src/main/java/org/apache/camel/component/infinispan/remote/InfinispanRemoteConsumer.java @@ -68,8 +68,10 @@ protected void doStart() throws Exception { @Override protected void doStop() throws Exception { - super.doStop(); + // the listener has to go before the consumer is stopped, or an event arriving in between is + // processed against a consumer that is already down ServiceHelper.stopService(handler); + super.doStop(); } // ********************************* @@ -150,7 +152,7 @@ public void doStop() { try { cache.removeClientListener(listener); } catch (RemoteCacheManagerNotStartedException e) { - LOG.debug("Cannot remote the listener because the cache manager is not started: {}", e.getMessage(), e); + LOG.debug("Cannot remove the listener because the cache manager is not started: {}", e.getMessage(), e); } } diff --git a/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_23.adoc b/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_23.adoc index 2a62a71a8cb66..6af48b0c5bd56 100644 --- a/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_23.adoc +++ b/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_23.adoc @@ -1627,3 +1627,14 @@ The `backOffMaxAttempts` option now bounds the attempts to start the delegated c The retry task previously also carried the default five second duration of its budget, which ended the task before the second attempt for any `backOffDelay` at or above the default of five seconds. A delegate that fails to start is therefore retried for longer than before, up to `backOffMaxAttempts` times. + +=== camel-infinispan + +The `CamelInfinispanOperationResult` header is deprecated. It has not been set or read by the component +since the remote and embedded components were split, so a route reading it received nothing. Use +`CamelInfinispanOperationResultHeader` to name the header that carries the result of an operation; without +it the result is placed in the message body, as before. + +The `CamelInfinispanIgnoreReturnValues` header is now documented as a producer header rather than a consumer +one. It has always been read on the producer path, so only its group in the catalog and in the documentation +changes. diff --git a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/InfinispanEmbeddedEndpointBuilderFactory.java b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/InfinispanEmbeddedEndpointBuilderFactory.java index b30ea35d2e155..c2380faa2ac95 100644 --- a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/InfinispanEmbeddedEndpointBuilderFactory.java +++ b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/InfinispanEmbeddedEndpointBuilderFactory.java @@ -1225,7 +1225,10 @@ public String infinispanOperation() { return "CamelInfinispanOperation"; } /** - * The name of the header whose value is the result. + * The name of the header whose value is the result. Deprecation note: + * Never set nor read by the component. Use + * CamelInfinispanOperationResultHeader to choose the header that + * carries the result of an operation. * * The option is a: {@code String} type. * @@ -1233,6 +1236,7 @@ public String infinispanOperation() { * * @return the name of the header {@code InfinispanOperationResult}. */ + @Deprecated public String infinispanOperationResult() { return "CamelInfinispanOperationResult"; } @@ -1307,7 +1311,7 @@ public String infinispanMaxIdleTimeUnit() { * The option is a: {@code boolean} type. * * Default: false - * Group: consumer + * Group: producer * * @return the name of the header {@code InfinispanIgnoreReturnValues}. */ @@ -1328,7 +1332,7 @@ public String infinispanEventData() { } /** * The QueryBuilder to use for QUERY command, if not present the command - * defaults to InifinispanConfiguration's one. + * defaults to the InfinispanConfiguration one. * * The option is a: {@code * org.apache.camel.component.infinispan.InfinispanQueryBuilder} type. diff --git a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/InfinispanRemoteEndpointBuilderFactory.java b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/InfinispanRemoteEndpointBuilderFactory.java index 6440902e50315..74729d024de2c 100644 --- a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/InfinispanRemoteEndpointBuilderFactory.java +++ b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/InfinispanRemoteEndpointBuilderFactory.java @@ -1811,7 +1811,10 @@ public String infinispanOperation() { return "CamelInfinispanOperation"; } /** - * The name of the header whose value is the result. + * The name of the header whose value is the result. Deprecation note: + * Never set nor read by the component. Use + * CamelInfinispanOperationResultHeader to choose the header that + * carries the result of an operation. * * The option is a: {@code String} type. * @@ -1819,6 +1822,7 @@ public String infinispanOperation() { * * @return the name of the header {@code InfinispanOperationResult}. */ + @Deprecated public String infinispanOperationResult() { return "CamelInfinispanOperationResult"; } @@ -1899,7 +1903,7 @@ public String infinispanEventData() { } /** * The QueryBuilder to use for QUERY command, if not present the command - * defaults to InifinispanConfiguration's one. + * defaults to the InfinispanConfiguration one. * * The option is a: {@code * org.apache.camel.component.infinispan.InfinispanQueryBuilder} type.