This is an automated email from the ASF dual-hosted git repository.
davsclaus 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 e9dcfa9bebe1 CAMEL-26189: camel-jgroups-raft - a body that does not
convert to bytes fails the exchange, and raftId, channelProperties, raftHandle
and stateMachine are endpoint options (#29017)
e9dcfa9bebe1 is described below
commit e9dcfa9bebe1153b0ac4939a990aee3ba40d8590
Author: Claus Ibsen <[email protected]>
AuthorDate: Tue Nov 3 08:12:35 2026 +0100
CAMEL-26189: camel-jgroups-raft - a body that does not convert to bytes
fails the exchange, and raftId, channelProperties, raftHandle and stateMachine
are endpoint options (#29017)
* CAMEL-26189: camel-jgroups-raft - a body that does not convert to byt…
…es fails the exchange, and raftId, channelProperties, raftHandle and
stateMachine are endpoint options
The producer read the body with a non-mandatory conversion to byte[], so a
Map, a
number or a POJO became null and the producer skipped it with a DEBUG log:
nothing
was set in the replicated log and the exchange succeeded. It now uses a
mandatory
conversion for a non-null body, so such a body (and a List) fails with an
InvalidPayloadException that names the type of the body. A null body is
still skipped.
raftId, channelProperties, raftHandle and stateMachine worked as endpoint
query
parameters but had no @UriParam, so the catalog, the doc and the endpoint
DSL did not
list them. The doc now says the body is converted to a byte[].
* Merge remote-tracking branch 'origin/main' into CAMEL-26189-jgroups-r…
…aft-body
# Conflicts:
# docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_24.adoc
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Signed-off-by: Claus Ibsen <[email protected]>
---
.../camel/catalog/components/jgroups-raft.json | 18 +-
.../camel/catalog/docs/jgroups-raft-component.adoc | 6 +-
.../raft/JGroupsRaftEndpointConfigurer.java | 24 ++
.../raft/JGroupsRaftEndpointUriFactory.java | 6 +-
.../camel/component/jgroups/raft/jgroups-raft.json | 18 +-
.../src/main/docs/jgroups-raft-component.adoc | 6 +-
.../jgroups/raft/JGroupsRaftEndpoint.java | 34 ++-
.../jgroups/raft/JGroupsRaftProducer.java | 3 +-
.../jgroups/raft/JGroupsRaftEndpointTest.java | 15 ++
.../jgroups/raft/JGroupsRaftProducerBodyTest.java | 91 +++++++
.../jgroups/raft/JGroupsRaftProducerTest.java | 8 +
.../ROOT/pages/camel-4x-upgrade-guide-4_24.adoc | 7 +
.../dsl/JGroupsRaftEndpointBuilderFactory.java | 279 +++++++++++++++++++++
13 files changed, 488 insertions(+), 27 deletions(-)
diff --git
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/jgroups-raft.json
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/jgroups-raft.json
index 9ae0d9b25edf..a23bdd0b8ec1 100644
---
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/jgroups-raft.json
+++
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/jgroups-raft.json
@@ -48,15 +48,19 @@
},
"bodyTypes": {
"consumerOut": { "carriers": [ "null" ], "description": "No body: an event
for each change of the role of this member (only with enableRoleChangeEvents),
with LEADER or FOLLOWER in the CamelJGroupsRaftEventType header and the state
of the raft in the other headers" },
- "producerIn": { "carriers": [ "bytes", "text", "stream", "file" ],
"description": "The bytes to set() in the replicated log: a byte array, or
text, a stream or a file converted to bytes. A null body, a Map, a number or a
POJO has no conversion to bytes and is skipped without an error: nothing is
set" },
- "producerOut": { "carriers": [ "bytes", "unchanged" ], "description": "The
byte array the state machine returns for the set (an empty array with the
default NopStateMachine), with the state of the raft in the headers. A body
that was skipped is left as it was" }
+ "producerIn": { "carriers": [ "bytes", "text", "stream", "file" ],
"description": "The bytes to set() in the replicated log: a byte array, or
text, a stream or a file converted to bytes. A null body is skipped: nothing is
set. A Map, a List, a number or a POJO has no conversion to bytes and fails
with an InvalidPayloadException" },
+ "producerOut": { "carriers": [ "bytes", "unchanged" ], "description": "The
byte array the state machine returns for the set (an empty array with the
default NopStateMachine), with the state of the raft in the headers. A null
body is left as it was" }
},
"properties": {
"clusterName": { "index": 0, "kind": "path", "displayName": "Cluster
Name", "group": "common", "label": "", "required": true, "type": "string",
"javaType": "java.lang.String", "deprecated": false, "deprecationNote": "",
"autowired": false, "secret": false, "description": "The name of the
JGroupsraft cluster the component should connect to." },
- "enableRoleChangeEvents": { "index": 1, "kind": "parameter",
"displayName": "Enable Role Change Events", "group": "consumer", "label":
"consumer", "required": false, "type": "boolean", "javaType": "boolean",
"deprecated": false, "autowired": false, "secret": false, "defaultValue":
false, "description": "If set to true, the consumer endpoint will receive
roleChange event as well (not just connecting and\/or using the state machine).
By default it is set to false." },
- "bridgeErrorHandler": { "index": 2, "kind": "parameter", "displayName":
"Bridge Error Handler", "group": "consumer (advanced)", "label":
"consumer,advanced", "required": false, "type": "boolean", "javaType":
"boolean", "deprecated": false, "autowired": false, "secret": false,
"defaultValue": false, "description": "Allows for bridging the consumer to the
Camel routing Error Handler, which mean any exceptions (if possible) occurred
while the Camel consumer is trying to pickup incoming [...]
- "exceptionHandler": { "index": 3, "kind": "parameter", "displayName":
"Exception Handler", "group": "consumer (advanced)", "label":
"consumer,advanced", "required": false, "type": "object", "javaType":
"org.apache.camel.spi.ExceptionHandler", "optionalPrefix": "consumer.",
"deprecated": false, "autowired": false, "secret": false, "description": "To
let the consumer use a custom ExceptionHandler. Notice if the option
bridgeErrorHandler is enabled then this option is not in use. By def [...]
- "exchangePattern": { "index": 4, "kind": "parameter", "displayName":
"Exchange Pattern", "group": "consumer (advanced)", "label":
"consumer,advanced", "required": false, "type": "enum", "javaType":
"org.apache.camel.ExchangePattern", "enum": [ "InOnly", "InOut" ],
"deprecated": false, "autowired": false, "secret": false, "description": "Sets
the exchange pattern when the consumer creates an exchange." },
- "lazyStartProducer": { "index": 5, "kind": "parameter", "displayName":
"Lazy Start Producer", "group": "producer (advanced)", "label":
"producer,advanced", "required": false, "type": "boolean", "javaType":
"boolean", "deprecated": false, "autowired": false, "secret": false,
"defaultValue": false, "description": "Whether the producer should be started
lazy (on the first message). By starting lazy you can use this to allow
CamelContext and routes to startup in situations where a produc [...]
+ "channelProperties": { "index": 1, "kind": "parameter", "displayName":
"Channel Properties", "group": "common", "label": "", "required": false,
"type": "string", "javaType": "java.lang.String", "deprecated": false,
"deprecationNote": "", "autowired": false, "secret": false, "defaultValue":
"raft.xml", "description": "Specifies configuration properties of the
RaftHandle JChannel used by the endpoint (ignored if raftHandle ref is
provided). Overrides the option of the component." },
+ "raftHandle": { "index": 2, "kind": "parameter", "displayName": "Raft
Handle", "group": "common", "label": "", "required": false, "type": "object",
"javaType": "org.jgroups.raft.RaftHandle", "deprecated": false, "autowired":
false, "secret": false, "description": "RaftHandle to use. Overrides the option
of the component." },
+ "raftId": { "index": 3, "kind": "parameter", "displayName": "Raft Id",
"group": "common", "label": "", "required": false, "type": "string",
"javaType": "java.lang.String", "deprecated": false, "autowired": false,
"secret": false, "description": "Unique raftId to use. Overrides the option of
the component." },
+ "stateMachine": { "index": 4, "kind": "parameter", "displayName": "State
Machine", "group": "common", "label": "", "required": false, "type": "object",
"javaType": "org.jgroups.raft.StateMachine", "deprecated": false,
"deprecationNote": "", "autowired": false, "secret": false, "defaultValue":
"NopStateMachine", "description": "StateMachine to use (ignored if raftHandle
ref is provided). Overrides the option of the component." },
+ "enableRoleChangeEvents": { "index": 5, "kind": "parameter",
"displayName": "Enable Role Change Events", "group": "consumer", "label":
"consumer", "required": false, "type": "boolean", "javaType": "boolean",
"deprecated": false, "autowired": false, "secret": false, "defaultValue":
false, "description": "If set to true, the consumer endpoint will receive
roleChange event as well (not just connecting and\/or using the state machine).
By default it is set to false." },
+ "bridgeErrorHandler": { "index": 6, "kind": "parameter", "displayName":
"Bridge Error Handler", "group": "consumer (advanced)", "label":
"consumer,advanced", "required": false, "type": "boolean", "javaType":
"boolean", "deprecated": false, "autowired": false, "secret": false,
"defaultValue": false, "description": "Allows for bridging the consumer to the
Camel routing Error Handler, which mean any exceptions (if possible) occurred
while the Camel consumer is trying to pickup incoming [...]
+ "exceptionHandler": { "index": 7, "kind": "parameter", "displayName":
"Exception Handler", "group": "consumer (advanced)", "label":
"consumer,advanced", "required": false, "type": "object", "javaType":
"org.apache.camel.spi.ExceptionHandler", "optionalPrefix": "consumer.",
"deprecated": false, "autowired": false, "secret": false, "description": "To
let the consumer use a custom ExceptionHandler. Notice if the option
bridgeErrorHandler is enabled then this option is not in use. By def [...]
+ "exchangePattern": { "index": 8, "kind": "parameter", "displayName":
"Exchange Pattern", "group": "consumer (advanced)", "label":
"consumer,advanced", "required": false, "type": "enum", "javaType":
"org.apache.camel.ExchangePattern", "enum": [ "InOnly", "InOut" ],
"deprecated": false, "autowired": false, "secret": false, "description": "Sets
the exchange pattern when the consumer creates an exchange." },
+ "lazyStartProducer": { "index": 9, "kind": "parameter", "displayName":
"Lazy Start Producer", "group": "producer (advanced)", "label":
"producer,advanced", "required": false, "type": "boolean", "javaType":
"boolean", "deprecated": false, "autowired": false, "secret": false,
"defaultValue": false, "description": "Whether the producer should be started
lazy (on the first message). By starting lazy you can use this to allow
CamelContext and routes to startup in situations where a produc [...]
}
}
diff --git
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/jgroups-raft-component.adoc
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/jgroups-raft-component.adoc
index 3a9893ca4ce7..7039ae12a0aa 100644
---
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/jgroups-raft-component.adoc
+++
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/jgroups-raft-component.adoc
@@ -86,8 +86,10 @@ YAML::
----
====
-Using `jgroups-raft` component on the producer side of the route will use the
body of the camel exchange (which must be a `byte[]`)
-to perform a setX() operation on the raftHandle associated with the endpoint.
+Using `jgroups-raft` component on the producer side of the route will use the
body of the camel exchange
+to perform a setX() operation on the raftHandle associated with the endpoint.
The body is converted to a `byte[]`
+(such as from text, a stream or a file). A body that cannot be converted, such
as a `Map`, a `List`, a number or a POJO,
+fails the exchange with an `InvalidPayloadException`. A null body is skipped:
nothing is set.
[tabs]
====
diff --git
a/components/camel-jgroups-raft/src/generated/java/org/apache/camel/component/jgroups/raft/JGroupsRaftEndpointConfigurer.java
b/components/camel-jgroups-raft/src/generated/java/org/apache/camel/component/jgroups/raft/JGroupsRaftEndpointConfigurer.java
index 25cca40aebd9..a2b7b122816c 100644
---
a/components/camel-jgroups-raft/src/generated/java/org/apache/camel/component/jgroups/raft/JGroupsRaftEndpointConfigurer.java
+++
b/components/camel-jgroups-raft/src/generated/java/org/apache/camel/component/jgroups/raft/JGroupsRaftEndpointConfigurer.java
@@ -26,6 +26,8 @@ public class JGroupsRaftEndpointConfigurer extends
PropertyConfigurerSupport imp
switch (ignoreCase ? name.toLowerCase(Locale.ROOT) : name) {
case "bridgeerrorhandler":
case "bridgeErrorHandler":
target.setBridgeErrorHandler(property(camelContext, boolean.class, value));
return true;
+ case "channelproperties":
+ case "channelProperties":
target.setChannelProperties(property(camelContext, java.lang.String.class,
value)); return true;
case "enablerolechangeevents":
case "enableRoleChangeEvents":
target.setEnableRoleChangeEvents(property(camelContext, boolean.class, value));
return true;
case "exceptionhandler":
@@ -34,6 +36,12 @@ public class JGroupsRaftEndpointConfigurer extends
PropertyConfigurerSupport imp
case "exchangePattern":
target.setExchangePattern(property(camelContext,
org.apache.camel.ExchangePattern.class, value)); return true;
case "lazystartproducer":
case "lazyStartProducer":
target.setLazyStartProducer(property(camelContext, boolean.class, value));
return true;
+ case "rafthandle":
+ case "raftHandle": target.setRaftHandle(property(camelContext,
org.jgroups.raft.RaftHandle.class, value)); return true;
+ case "raftid":
+ case "raftId": target.setRaftId(property(camelContext,
java.lang.String.class, value)); return true;
+ case "statemachine":
+ case "stateMachine": target.setStateMachine(property(camelContext,
org.jgroups.raft.StateMachine.class, value)); return true;
default: return false;
}
}
@@ -43,6 +51,8 @@ public class JGroupsRaftEndpointConfigurer extends
PropertyConfigurerSupport imp
switch (ignoreCase ? name.toLowerCase(Locale.ROOT) : name) {
case "bridgeerrorhandler":
case "bridgeErrorHandler": return boolean.class;
+ case "channelproperties":
+ case "channelProperties": return java.lang.String.class;
case "enablerolechangeevents":
case "enableRoleChangeEvents": return boolean.class;
case "exceptionhandler":
@@ -51,6 +61,12 @@ public class JGroupsRaftEndpointConfigurer extends
PropertyConfigurerSupport imp
case "exchangePattern": return org.apache.camel.ExchangePattern.class;
case "lazystartproducer":
case "lazyStartProducer": return boolean.class;
+ case "rafthandle":
+ case "raftHandle": return org.jgroups.raft.RaftHandle.class;
+ case "raftid":
+ case "raftId": return java.lang.String.class;
+ case "statemachine":
+ case "stateMachine": return org.jgroups.raft.StateMachine.class;
default: return null;
}
}
@@ -61,6 +77,8 @@ public class JGroupsRaftEndpointConfigurer extends
PropertyConfigurerSupport imp
switch (ignoreCase ? name.toLowerCase(Locale.ROOT) : name) {
case "bridgeerrorhandler":
case "bridgeErrorHandler": return target.isBridgeErrorHandler();
+ case "channelproperties":
+ case "channelProperties": return target.getChannelProperties();
case "enablerolechangeevents":
case "enableRoleChangeEvents": return
target.isEnableRoleChangeEvents();
case "exceptionhandler":
@@ -69,6 +87,12 @@ public class JGroupsRaftEndpointConfigurer extends
PropertyConfigurerSupport imp
case "exchangePattern": return target.getExchangePattern();
case "lazystartproducer":
case "lazyStartProducer": return target.isLazyStartProducer();
+ case "rafthandle":
+ case "raftHandle": return target.getRaftHandle();
+ case "raftid":
+ case "raftId": return target.getRaftId();
+ case "statemachine":
+ case "stateMachine": return target.getStateMachine();
default: return null;
}
}
diff --git
a/components/camel-jgroups-raft/src/generated/java/org/apache/camel/component/jgroups/raft/JGroupsRaftEndpointUriFactory.java
b/components/camel-jgroups-raft/src/generated/java/org/apache/camel/component/jgroups/raft/JGroupsRaftEndpointUriFactory.java
index 92dfdead6bc1..cdc260ceb4f5 100644
---
a/components/camel-jgroups-raft/src/generated/java/org/apache/camel/component/jgroups/raft/JGroupsRaftEndpointUriFactory.java
+++
b/components/camel-jgroups-raft/src/generated/java/org/apache/camel/component/jgroups/raft/JGroupsRaftEndpointUriFactory.java
@@ -24,13 +24,17 @@ public class JGroupsRaftEndpointUriFactory extends
org.apache.camel.support.comp
private static final Set<String> ENDPOINT_IDENTITY_PROPERTY_NAMES;
private static final Map<String, String> MULTI_VALUE_PREFIXES;
static {
- Set<String> props = new HashSet<>(6);
+ Set<String> props = new HashSet<>(10);
props.add("bridgeErrorHandler");
+ props.add("channelProperties");
props.add("clusterName");
props.add("enableRoleChangeEvents");
props.add("exceptionHandler");
props.add("exchangePattern");
props.add("lazyStartProducer");
+ props.add("raftHandle");
+ props.add("raftId");
+ props.add("stateMachine");
PROPERTY_NAMES = Collections.unmodifiableSet(props);
SECRET_PROPERTY_NAMES = Collections.emptySet();
ENDPOINT_IDENTITY_PROPERTY_NAMES = Collections.emptySet();
diff --git
a/components/camel-jgroups-raft/src/generated/resources/META-INF/org/apache/camel/component/jgroups/raft/jgroups-raft.json
b/components/camel-jgroups-raft/src/generated/resources/META-INF/org/apache/camel/component/jgroups/raft/jgroups-raft.json
index 9ae0d9b25edf..a23bdd0b8ec1 100644
---
a/components/camel-jgroups-raft/src/generated/resources/META-INF/org/apache/camel/component/jgroups/raft/jgroups-raft.json
+++
b/components/camel-jgroups-raft/src/generated/resources/META-INF/org/apache/camel/component/jgroups/raft/jgroups-raft.json
@@ -48,15 +48,19 @@
},
"bodyTypes": {
"consumerOut": { "carriers": [ "null" ], "description": "No body: an event
for each change of the role of this member (only with enableRoleChangeEvents),
with LEADER or FOLLOWER in the CamelJGroupsRaftEventType header and the state
of the raft in the other headers" },
- "producerIn": { "carriers": [ "bytes", "text", "stream", "file" ],
"description": "The bytes to set() in the replicated log: a byte array, or
text, a stream or a file converted to bytes. A null body, a Map, a number or a
POJO has no conversion to bytes and is skipped without an error: nothing is
set" },
- "producerOut": { "carriers": [ "bytes", "unchanged" ], "description": "The
byte array the state machine returns for the set (an empty array with the
default NopStateMachine), with the state of the raft in the headers. A body
that was skipped is left as it was" }
+ "producerIn": { "carriers": [ "bytes", "text", "stream", "file" ],
"description": "The bytes to set() in the replicated log: a byte array, or
text, a stream or a file converted to bytes. A null body is skipped: nothing is
set. A Map, a List, a number or a POJO has no conversion to bytes and fails
with an InvalidPayloadException" },
+ "producerOut": { "carriers": [ "bytes", "unchanged" ], "description": "The
byte array the state machine returns for the set (an empty array with the
default NopStateMachine), with the state of the raft in the headers. A null
body is left as it was" }
},
"properties": {
"clusterName": { "index": 0, "kind": "path", "displayName": "Cluster
Name", "group": "common", "label": "", "required": true, "type": "string",
"javaType": "java.lang.String", "deprecated": false, "deprecationNote": "",
"autowired": false, "secret": false, "description": "The name of the
JGroupsraft cluster the component should connect to." },
- "enableRoleChangeEvents": { "index": 1, "kind": "parameter",
"displayName": "Enable Role Change Events", "group": "consumer", "label":
"consumer", "required": false, "type": "boolean", "javaType": "boolean",
"deprecated": false, "autowired": false, "secret": false, "defaultValue":
false, "description": "If set to true, the consumer endpoint will receive
roleChange event as well (not just connecting and\/or using the state machine).
By default it is set to false." },
- "bridgeErrorHandler": { "index": 2, "kind": "parameter", "displayName":
"Bridge Error Handler", "group": "consumer (advanced)", "label":
"consumer,advanced", "required": false, "type": "boolean", "javaType":
"boolean", "deprecated": false, "autowired": false, "secret": false,
"defaultValue": false, "description": "Allows for bridging the consumer to the
Camel routing Error Handler, which mean any exceptions (if possible) occurred
while the Camel consumer is trying to pickup incoming [...]
- "exceptionHandler": { "index": 3, "kind": "parameter", "displayName":
"Exception Handler", "group": "consumer (advanced)", "label":
"consumer,advanced", "required": false, "type": "object", "javaType":
"org.apache.camel.spi.ExceptionHandler", "optionalPrefix": "consumer.",
"deprecated": false, "autowired": false, "secret": false, "description": "To
let the consumer use a custom ExceptionHandler. Notice if the option
bridgeErrorHandler is enabled then this option is not in use. By def [...]
- "exchangePattern": { "index": 4, "kind": "parameter", "displayName":
"Exchange Pattern", "group": "consumer (advanced)", "label":
"consumer,advanced", "required": false, "type": "enum", "javaType":
"org.apache.camel.ExchangePattern", "enum": [ "InOnly", "InOut" ],
"deprecated": false, "autowired": false, "secret": false, "description": "Sets
the exchange pattern when the consumer creates an exchange." },
- "lazyStartProducer": { "index": 5, "kind": "parameter", "displayName":
"Lazy Start Producer", "group": "producer (advanced)", "label":
"producer,advanced", "required": false, "type": "boolean", "javaType":
"boolean", "deprecated": false, "autowired": false, "secret": false,
"defaultValue": false, "description": "Whether the producer should be started
lazy (on the first message). By starting lazy you can use this to allow
CamelContext and routes to startup in situations where a produc [...]
+ "channelProperties": { "index": 1, "kind": "parameter", "displayName":
"Channel Properties", "group": "common", "label": "", "required": false,
"type": "string", "javaType": "java.lang.String", "deprecated": false,
"deprecationNote": "", "autowired": false, "secret": false, "defaultValue":
"raft.xml", "description": "Specifies configuration properties of the
RaftHandle JChannel used by the endpoint (ignored if raftHandle ref is
provided). Overrides the option of the component." },
+ "raftHandle": { "index": 2, "kind": "parameter", "displayName": "Raft
Handle", "group": "common", "label": "", "required": false, "type": "object",
"javaType": "org.jgroups.raft.RaftHandle", "deprecated": false, "autowired":
false, "secret": false, "description": "RaftHandle to use. Overrides the option
of the component." },
+ "raftId": { "index": 3, "kind": "parameter", "displayName": "Raft Id",
"group": "common", "label": "", "required": false, "type": "string",
"javaType": "java.lang.String", "deprecated": false, "autowired": false,
"secret": false, "description": "Unique raftId to use. Overrides the option of
the component." },
+ "stateMachine": { "index": 4, "kind": "parameter", "displayName": "State
Machine", "group": "common", "label": "", "required": false, "type": "object",
"javaType": "org.jgroups.raft.StateMachine", "deprecated": false,
"deprecationNote": "", "autowired": false, "secret": false, "defaultValue":
"NopStateMachine", "description": "StateMachine to use (ignored if raftHandle
ref is provided). Overrides the option of the component." },
+ "enableRoleChangeEvents": { "index": 5, "kind": "parameter",
"displayName": "Enable Role Change Events", "group": "consumer", "label":
"consumer", "required": false, "type": "boolean", "javaType": "boolean",
"deprecated": false, "autowired": false, "secret": false, "defaultValue":
false, "description": "If set to true, the consumer endpoint will receive
roleChange event as well (not just connecting and\/or using the state machine).
By default it is set to false." },
+ "bridgeErrorHandler": { "index": 6, "kind": "parameter", "displayName":
"Bridge Error Handler", "group": "consumer (advanced)", "label":
"consumer,advanced", "required": false, "type": "boolean", "javaType":
"boolean", "deprecated": false, "autowired": false, "secret": false,
"defaultValue": false, "description": "Allows for bridging the consumer to the
Camel routing Error Handler, which mean any exceptions (if possible) occurred
while the Camel consumer is trying to pickup incoming [...]
+ "exceptionHandler": { "index": 7, "kind": "parameter", "displayName":
"Exception Handler", "group": "consumer (advanced)", "label":
"consumer,advanced", "required": false, "type": "object", "javaType":
"org.apache.camel.spi.ExceptionHandler", "optionalPrefix": "consumer.",
"deprecated": false, "autowired": false, "secret": false, "description": "To
let the consumer use a custom ExceptionHandler. Notice if the option
bridgeErrorHandler is enabled then this option is not in use. By def [...]
+ "exchangePattern": { "index": 8, "kind": "parameter", "displayName":
"Exchange Pattern", "group": "consumer (advanced)", "label":
"consumer,advanced", "required": false, "type": "enum", "javaType":
"org.apache.camel.ExchangePattern", "enum": [ "InOnly", "InOut" ],
"deprecated": false, "autowired": false, "secret": false, "description": "Sets
the exchange pattern when the consumer creates an exchange." },
+ "lazyStartProducer": { "index": 9, "kind": "parameter", "displayName":
"Lazy Start Producer", "group": "producer (advanced)", "label":
"producer,advanced", "required": false, "type": "boolean", "javaType":
"boolean", "deprecated": false, "autowired": false, "secret": false,
"defaultValue": false, "description": "Whether the producer should be started
lazy (on the first message). By starting lazy you can use this to allow
CamelContext and routes to startup in situations where a produc [...]
}
}
diff --git
a/components/camel-jgroups-raft/src/main/docs/jgroups-raft-component.adoc
b/components/camel-jgroups-raft/src/main/docs/jgroups-raft-component.adoc
index 3a9893ca4ce7..7039ae12a0aa 100644
--- a/components/camel-jgroups-raft/src/main/docs/jgroups-raft-component.adoc
+++ b/components/camel-jgroups-raft/src/main/docs/jgroups-raft-component.adoc
@@ -86,8 +86,10 @@ YAML::
----
====
-Using `jgroups-raft` component on the producer side of the route will use the
body of the camel exchange (which must be a `byte[]`)
-to perform a setX() operation on the raftHandle associated with the endpoint.
+Using `jgroups-raft` component on the producer side of the route will use the
body of the camel exchange
+to perform a setX() operation on the raftHandle associated with the endpoint.
The body is converted to a `byte[]`
+(such as from text, a stream or a file). A body that cannot be converted, such
as a `Map`, a `List`, a number or a POJO,
+fails the exchange with an `InvalidPayloadException`. A null body is skipped:
nothing is set.
[tabs]
====
diff --git
a/components/camel-jgroups-raft/src/main/java/org/apache/camel/component/jgroups/raft/JGroupsRaftEndpoint.java
b/components/camel-jgroups-raft/src/main/java/org/apache/camel/component/jgroups/raft/JGroupsRaftEndpoint.java
index b08d5e6457fe..cedad3f42b7c 100644
---
a/components/camel-jgroups-raft/src/main/java/org/apache/camel/component/jgroups/raft/JGroupsRaftEndpoint.java
+++
b/components/camel-jgroups-raft/src/main/java/org/apache/camel/component/jgroups/raft/JGroupsRaftEndpoint.java
@@ -51,12 +51,13 @@ import org.slf4j.LoggerFactory;
+ " headers"),
producerIn = @BodyType(value = { Carrier.BYTES, Carrier.TEXT,
Carrier.STREAM, Carrier.FILE },
description = "The bytes to set() in the
replicated log: a byte array, or text, a stream or"
- + " a file converted to bytes.
A null body, a Map, a number or a POJO has no"
- + " conversion to bytes and is
skipped without an error: nothing is set"),
+ + " a file converted to bytes.
A null body is skipped: nothing is set. A Map,"
+ + " a List, a number or a POJO
has no conversion to bytes and fails with an"
+ + " InvalidPayloadException"),
producerOut = @BodyType(value = { Carrier.BYTES, Carrier.UNCHANGED
},
description = "The byte array the state
machine returns for the set (an empty array with"
+ " the default
NopStateMachine), with the state of the raft in the headers. A"
- + " body that was skipped is
left as it was"))
+ + " null body is left as it
was"))
public class JGroupsRaftEndpoint extends DefaultEndpoint {
private static final Logger LOG =
LoggerFactory.getLogger(JGroupsRaftEndpoint.class);
@@ -64,15 +65,21 @@ public class JGroupsRaftEndpoint extends DefaultEndpoint {
private int connectCount;
private final Lock connectLock = new ReentrantLock();
- private RaftHandle raftHandle;
private RaftHandle resolvedRaftHandle;
- private StateMachine stateMachine;
- private String raftId;
- private String channelProperties;
@UriPath
@Metadata(required = true)
private String clusterName;
+ @UriParam
+ private String raftId;
+ @UriParam
+ @Metadata(defaultValue = "raft.xml")
+ private String channelProperties;
+ @UriParam
+ private RaftHandle raftHandle;
+ @UriParam
+ @Metadata(defaultValue = "NopStateMachine")
+ private StateMachine stateMachine;
@UriParam(label = "consumer", defaultValue = "false")
private boolean enableRoleChangeEvents;
@@ -274,6 +281,10 @@ public class JGroupsRaftEndpoint extends DefaultEndpoint {
return channelProperties;
}
+ /**
+ * Specifies configuration properties of the RaftHandle JChannel used by
the endpoint (ignored if raftHandle ref is
+ * provided). Overrides the option of the component.
+ */
public void setChannelProperties(String channelProperties) {
this.channelProperties = channelProperties;
}
@@ -282,6 +293,9 @@ public class JGroupsRaftEndpoint extends DefaultEndpoint {
return raftId;
}
+ /**
+ * Unique raftId to use. Overrides the option of the component.
+ */
public void setRaftId(String raftId) {
this.raftId = raftId;
}
@@ -290,6 +304,9 @@ public class JGroupsRaftEndpoint extends DefaultEndpoint {
return raftHandle;
}
+ /**
+ * RaftHandle to use. Overrides the option of the component.
+ */
public void setRaftHandle(RaftHandle raftHandle) {
this.raftHandle = raftHandle;
}
@@ -298,6 +315,9 @@ public class JGroupsRaftEndpoint extends DefaultEndpoint {
return stateMachine;
}
+ /**
+ * StateMachine to use (ignored if raftHandle ref is provided). Overrides
the option of the component.
+ */
public void setStateMachine(StateMachine stateMachine) {
this.stateMachine = stateMachine;
}
diff --git
a/components/camel-jgroups-raft/src/main/java/org/apache/camel/component/jgroups/raft/JGroupsRaftProducer.java
b/components/camel-jgroups-raft/src/main/java/org/apache/camel/component/jgroups/raft/JGroupsRaftProducer.java
index 5ee0e999d49b..6da6b405af5f 100644
---
a/components/camel-jgroups-raft/src/main/java/org/apache/camel/component/jgroups/raft/JGroupsRaftProducer.java
+++
b/components/camel-jgroups-raft/src/main/java/org/apache/camel/component/jgroups/raft/JGroupsRaftProducer.java
@@ -63,7 +63,8 @@ public class JGroupsRaftProducer extends DefaultProducer {
@Override
public void process(Exchange exchange) throws Exception {
//TODO: implement possibility to call CompletableFuture<byte[]>
setAsync(byte[] buf, int offset, int length);
- byte[] body = exchange.getIn().getBody(byte[].class);
+ // a body that does not convert to bytes (such as a Map or a POJO)
fails, instead of setting nothing
+ byte[] body = exchange.getIn().getBody() != null ?
exchange.getIn().getMandatoryBody(byte[].class) : null;
Integer setOffset =
exchange.getIn().getHeader(JGroupsRaftConstants.HEADER_JGROUPSRAFT_SET_OFFSET,
Integer.class);
Integer setLength =
exchange.getIn().getHeader(JGroupsRaftConstants.HEADER_JGROUPSRAFT_SET_LENGTH,
Integer.class);
diff --git
a/components/camel-jgroups-raft/src/test/java/org/apache/camel/component/jgroups/raft/JGroupsRaftEndpointTest.java
b/components/camel-jgroups-raft/src/test/java/org/apache/camel/component/jgroups/raft/JGroupsRaftEndpointTest.java
index af6901317e12..1c527efca231 100644
---
a/components/camel-jgroups-raft/src/test/java/org/apache/camel/component/jgroups/raft/JGroupsRaftEndpointTest.java
+++
b/components/camel-jgroups-raft/src/test/java/org/apache/camel/component/jgroups/raft/JGroupsRaftEndpointTest.java
@@ -18,9 +18,11 @@ package org.apache.camel.component.jgroups.raft;
import java.io.DataInput;
import java.io.DataOutput;
+import java.util.Set;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.component.jgroups.raft.utils.NopStateMachine;
+import org.apache.camel.spi.EndpointUriFactory;
import org.apache.camel.spi.Registry;
import org.apache.camel.test.junit6.CamelTestSupport;
import org.jgroups.JChannel;
@@ -30,6 +32,7 @@ import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
public class JGroupsRaftEndpointTest extends CamelTestSupport {
@@ -94,4 +97,16 @@ public class JGroupsRaftEndpointTest extends
CamelTestSupport {
assertEquals(sm, endpoint2.getStateMachine());
}
+
+ @Test
+ public void shouldHaveRaftOptionsAsEndpointOptions() {
+ EndpointUriFactory factory =
context.getCamelContextExtension().getEndpointUriFactory("jgroups-raft");
+ Set<String> names = factory.propertyNames();
+
+ assertTrue(names.containsAll(Set.of("raftId", "channelProperties",
"raftHandle", "stateMachine")), names.toString());
+
+ JGroupsRaftEndpoint endpoint2 =
getMandatoryEndpoint(CONFIGURED_ENDPOINT_URI2, JGroupsRaftEndpoint.class);
+ assertEquals("C", endpoint2.getRaftId());
+ assertEquals("raftC.xml", endpoint2.getChannelProperties());
+ }
}
diff --git
a/components/camel-jgroups-raft/src/test/java/org/apache/camel/component/jgroups/raft/JGroupsRaftProducerBodyTest.java
b/components/camel-jgroups-raft/src/test/java/org/apache/camel/component/jgroups/raft/JGroupsRaftProducerBodyTest.java
new file mode 100644
index 000000000000..d27c18df6fdc
--- /dev/null
+++
b/components/camel-jgroups-raft/src/test/java/org/apache/camel/component/jgroups/raft/JGroupsRaftProducerBodyTest.java
@@ -0,0 +1,91 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.jgroups.raft;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.InvalidPayloadException;
+import org.apache.camel.builder.RouteBuilder;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertInstanceOf;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+/**
+ * A body that does not convert to bytes fails the exchange (no leader is
needed, as nothing is set in the log).
+ */
+public class JGroupsRaftProducerBodyTest extends JGroupsRaftAbstractTest {
+ private static final String ENDPOINT_URI
+ =
"jgroups-raft:JGroupsRaftProducerBodyTest?raftId=A&channelProperties=raftABC.xml";
+
+ @Override
+ protected RouteBuilder createRouteBuilder() {
+ return new RouteBuilder() {
+ @Override
+ public void configure() {
+ from("direct:start").to(ENDPOINT_URI);
+ }
+ };
+ }
+
+ @Test
+ public void shouldFailMapBody() {
+ Exchange res = template.send("direct:start", e ->
e.getIn().setBody(Map.of("key", "value")));
+
+ assertInvalidPayload(res);
+ }
+
+ @Test
+ public void shouldFailIntegerBody() {
+ Exchange res = template.send("direct:start", e ->
e.getIn().setBody(123));
+
+ assertInvalidPayload(res);
+ }
+
+ @Test
+ public void shouldFailPojoBody() {
+ Exchange res = template.send("direct:start", e ->
e.getIn().setBody(new Object()));
+
+ assertInvalidPayload(res);
+ }
+
+ @Test
+ public void shouldFailListBody() {
+ Exchange res = template.send("direct:start", e ->
e.getIn().setBody(new ArrayList<>(List.of("a", "b"))));
+
+ assertInvalidPayload(res);
+
assertTrue(res.getException().getMessage().contains("java.util.ArrayList"),
res.getException().getMessage());
+ }
+
+ @Test
+ public void shouldSkipNullBody() {
+ Exchange res = template.send("direct:start", e ->
e.getIn().setBody(null));
+
+ assertNull(res.getException());
+ assertNull(res.getIn().getBody());
+ }
+
+ private static void assertInvalidPayload(Exchange res) {
+ assertNotNull(res.getException(), "the exchange should fail");
+ assertInstanceOf(InvalidPayloadException.class, res.getException(),
res.getException().toString());
+ }
+}
diff --git
a/components/camel-jgroups-raft/src/test/java/org/apache/camel/component/jgroups/raft/JGroupsRaftProducerTest.java
b/components/camel-jgroups-raft/src/test/java/org/apache/camel/component/jgroups/raft/JGroupsRaftProducerTest.java
index 183f6111cecd..1cbf0e279e3a 100644
---
a/components/camel-jgroups-raft/src/test/java/org/apache/camel/component/jgroups/raft/JGroupsRaftProducerTest.java
+++
b/components/camel-jgroups-raft/src/test/java/org/apache/camel/component/jgroups/raft/JGroupsRaftProducerTest.java
@@ -21,7 +21,9 @@ import org.apache.camel.Processor;
import org.apache.camel.builder.RouteBuilder;
import org.junit.jupiter.api.Test;
+import static org.junit.jupiter.api.Assertions.assertInstanceOf;
import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
public class JGroupsRaftProducerTest extends JGroupsRaftAbstractTest {
private static final String CLUSTER_NAME = "JGroupsRaftProducerTest";
@@ -66,5 +68,11 @@ public class JGroupsRaftProducerTest extends
JGroupsRaftAbstractTest {
checkHeaders(res2);
assertNotNull(res3.getIn().getBody());
checkHeaders(res3);
+
+ // a text body is converted to bytes
+ Exchange resText = template.request("direct:start", exchange ->
exchange.getIn().setBody(MESSAGE));
+ assertNull(resText.getException());
+ assertInstanceOf(byte[].class, resText.getIn().getBody());
+ checkHeaders(resText);
}
}
diff --git
a/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_24.adoc
b/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_24.adoc
index cebd7ff9196c..0acfbbcd3f27 100644
--- a/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_24.adoc
+++ b/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_24.adoc
@@ -816,6 +816,13 @@ CamelContext of that provider. It now closes each of them
only when no other `JC
it returned the closed cache, whose operations throw `IllegalStateException`.
This matters for code that calls a
`JCacheManager` (for example one created by a custom `JCacheManagerFactory`)
after it was closed.
+=== camel-jgroups-raft - a body that does not convert to a byte array fails
the exchange
+
+The `jgroups-raft` producer skipped a message body that has no conversion to
`byte[]`, such as a `Map`, a POJO or a
+number, without an error, so nothing was set in the replicated log and the
exchange succeeded. It now fails the
+exchange with an `InvalidPayloadException`. Marshal such a body first (for
example to JSON) or convert it to a
+`String`. A message without a body is still skipped.
+
=== camel-splunk-hec - bytes, stream and file bodies are sent as text
The producer now sends a byte array, an `InputStream`, a `Reader` or a file
body (`File`, `Path` or the file of the
diff --git
a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/JGroupsRaftEndpointBuilderFactory.java
b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/JGroupsRaftEndpointBuilderFactory.java
index e67301f88edb..7cbbed33ad7d 100644
---
a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/JGroupsRaftEndpointBuilderFactory.java
+++
b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/JGroupsRaftEndpointBuilderFactory.java
@@ -43,6 +43,99 @@ public interface JGroupsRaftEndpointBuilderFactory {
default AdvancedJGroupsRaftEndpointConsumerBuilder advanced() {
return (AdvancedJGroupsRaftEndpointConsumerBuilder) this;
}
+ /**
+ * Specifies configuration properties of the RaftHandle JChannel used
by
+ * the endpoint (ignored if raftHandle ref is provided). Overrides the
+ * option of the component.
+ *
+ * The option is a: <code>java.lang.String</code> type.
+ *
+ * Default: raft.xml
+ * Group: common
+ *
+ * @param channelProperties the value to set
+ * @return the dsl builder
+ */
+ default JGroupsRaftEndpointConsumerBuilder channelProperties(String
channelProperties) {
+ doSetProperty("channelProperties", channelProperties);
+ return this;
+ }
+ /**
+ * RaftHandle to use. Overrides the option of the component.
+ *
+ * The option is a: <code>org.jgroups.raft.RaftHandle</code> type.
+ *
+ * Group: common
+ *
+ * @param raftHandle the value to set
+ * @return the dsl builder
+ */
+ default JGroupsRaftEndpointConsumerBuilder
raftHandle(org.jgroups.raft.RaftHandle raftHandle) {
+ doSetProperty("raftHandle", raftHandle);
+ return this;
+ }
+ /**
+ * RaftHandle to use. Overrides the option of the component.
+ *
+ * The option will be converted to a
+ * <code>org.jgroups.raft.RaftHandle</code> type.
+ *
+ * Group: common
+ *
+ * @param raftHandle the value to set
+ * @return the dsl builder
+ */
+ default JGroupsRaftEndpointConsumerBuilder raftHandle(String
raftHandle) {
+ doSetProperty("raftHandle", raftHandle);
+ return this;
+ }
+ /**
+ * Unique raftId to use. Overrides the option of the component.
+ *
+ * The option is a: <code>java.lang.String</code> type.
+ *
+ * Group: common
+ *
+ * @param raftId the value to set
+ * @return the dsl builder
+ */
+ default JGroupsRaftEndpointConsumerBuilder raftId(String raftId) {
+ doSetProperty("raftId", raftId);
+ return this;
+ }
+ /**
+ * StateMachine to use (ignored if raftHandle ref is provided).
+ * Overrides the option of the component.
+ *
+ * The option is a: <code>org.jgroups.raft.StateMachine</code> type.
+ *
+ * Default: NopStateMachine
+ * Group: common
+ *
+ * @param stateMachine the value to set
+ * @return the dsl builder
+ */
+ default JGroupsRaftEndpointConsumerBuilder
stateMachine(org.jgroups.raft.StateMachine stateMachine) {
+ doSetProperty("stateMachine", stateMachine);
+ return this;
+ }
+ /**
+ * StateMachine to use (ignored if raftHandle ref is provided).
+ * Overrides the option of the component.
+ *
+ * The option will be converted to a
+ * <code>org.jgroups.raft.StateMachine</code> type.
+ *
+ * Default: NopStateMachine
+ * Group: common
+ *
+ * @param stateMachine the value to set
+ * @return the dsl builder
+ */
+ default JGroupsRaftEndpointConsumerBuilder stateMachine(String
stateMachine) {
+ doSetProperty("stateMachine", stateMachine);
+ return this;
+ }
/**
* If set to true, the consumer endpoint will receive roleChange event
* as well (not just connecting and/or using the state machine). By
@@ -217,6 +310,99 @@ public interface JGroupsRaftEndpointBuilderFactory {
return (AdvancedJGroupsRaftEndpointProducerBuilder) this;
}
+ /**
+ * Specifies configuration properties of the RaftHandle JChannel used
by
+ * the endpoint (ignored if raftHandle ref is provided). Overrides the
+ * option of the component.
+ *
+ * The option is a: <code>java.lang.String</code> type.
+ *
+ * Default: raft.xml
+ * Group: common
+ *
+ * @param channelProperties the value to set
+ * @return the dsl builder
+ */
+ default JGroupsRaftEndpointProducerBuilder channelProperties(String
channelProperties) {
+ doSetProperty("channelProperties", channelProperties);
+ return this;
+ }
+ /**
+ * RaftHandle to use. Overrides the option of the component.
+ *
+ * The option is a: <code>org.jgroups.raft.RaftHandle</code> type.
+ *
+ * Group: common
+ *
+ * @param raftHandle the value to set
+ * @return the dsl builder
+ */
+ default JGroupsRaftEndpointProducerBuilder
raftHandle(org.jgroups.raft.RaftHandle raftHandle) {
+ doSetProperty("raftHandle", raftHandle);
+ return this;
+ }
+ /**
+ * RaftHandle to use. Overrides the option of the component.
+ *
+ * The option will be converted to a
+ * <code>org.jgroups.raft.RaftHandle</code> type.
+ *
+ * Group: common
+ *
+ * @param raftHandle the value to set
+ * @return the dsl builder
+ */
+ default JGroupsRaftEndpointProducerBuilder raftHandle(String
raftHandle) {
+ doSetProperty("raftHandle", raftHandle);
+ return this;
+ }
+ /**
+ * Unique raftId to use. Overrides the option of the component.
+ *
+ * The option is a: <code>java.lang.String</code> type.
+ *
+ * Group: common
+ *
+ * @param raftId the value to set
+ * @return the dsl builder
+ */
+ default JGroupsRaftEndpointProducerBuilder raftId(String raftId) {
+ doSetProperty("raftId", raftId);
+ return this;
+ }
+ /**
+ * StateMachine to use (ignored if raftHandle ref is provided).
+ * Overrides the option of the component.
+ *
+ * The option is a: <code>org.jgroups.raft.StateMachine</code> type.
+ *
+ * Default: NopStateMachine
+ * Group: common
+ *
+ * @param stateMachine the value to set
+ * @return the dsl builder
+ */
+ default JGroupsRaftEndpointProducerBuilder
stateMachine(org.jgroups.raft.StateMachine stateMachine) {
+ doSetProperty("stateMachine", stateMachine);
+ return this;
+ }
+ /**
+ * StateMachine to use (ignored if raftHandle ref is provided).
+ * Overrides the option of the component.
+ *
+ * The option will be converted to a
+ * <code>org.jgroups.raft.StateMachine</code> type.
+ *
+ * Default: NopStateMachine
+ * Group: common
+ *
+ * @param stateMachine the value to set
+ * @return the dsl builder
+ */
+ default JGroupsRaftEndpointProducerBuilder stateMachine(String
stateMachine) {
+ doSetProperty("stateMachine", stateMachine);
+ return this;
+ }
}
/**
@@ -286,6 +472,99 @@ public interface JGroupsRaftEndpointBuilderFactory {
return (AdvancedJGroupsRaftEndpointBuilder) this;
}
+ /**
+ * Specifies configuration properties of the RaftHandle JChannel used
by
+ * the endpoint (ignored if raftHandle ref is provided). Overrides the
+ * option of the component.
+ *
+ * The option is a: <code>java.lang.String</code> type.
+ *
+ * Default: raft.xml
+ * Group: common
+ *
+ * @param channelProperties the value to set
+ * @return the dsl builder
+ */
+ default JGroupsRaftEndpointBuilder channelProperties(String
channelProperties) {
+ doSetProperty("channelProperties", channelProperties);
+ return this;
+ }
+ /**
+ * RaftHandle to use. Overrides the option of the component.
+ *
+ * The option is a: <code>org.jgroups.raft.RaftHandle</code> type.
+ *
+ * Group: common
+ *
+ * @param raftHandle the value to set
+ * @return the dsl builder
+ */
+ default JGroupsRaftEndpointBuilder
raftHandle(org.jgroups.raft.RaftHandle raftHandle) {
+ doSetProperty("raftHandle", raftHandle);
+ return this;
+ }
+ /**
+ * RaftHandle to use. Overrides the option of the component.
+ *
+ * The option will be converted to a
+ * <code>org.jgroups.raft.RaftHandle</code> type.
+ *
+ * Group: common
+ *
+ * @param raftHandle the value to set
+ * @return the dsl builder
+ */
+ default JGroupsRaftEndpointBuilder raftHandle(String raftHandle) {
+ doSetProperty("raftHandle", raftHandle);
+ return this;
+ }
+ /**
+ * Unique raftId to use. Overrides the option of the component.
+ *
+ * The option is a: <code>java.lang.String</code> type.
+ *
+ * Group: common
+ *
+ * @param raftId the value to set
+ * @return the dsl builder
+ */
+ default JGroupsRaftEndpointBuilder raftId(String raftId) {
+ doSetProperty("raftId", raftId);
+ return this;
+ }
+ /**
+ * StateMachine to use (ignored if raftHandle ref is provided).
+ * Overrides the option of the component.
+ *
+ * The option is a: <code>org.jgroups.raft.StateMachine</code> type.
+ *
+ * Default: NopStateMachine
+ * Group: common
+ *
+ * @param stateMachine the value to set
+ * @return the dsl builder
+ */
+ default JGroupsRaftEndpointBuilder
stateMachine(org.jgroups.raft.StateMachine stateMachine) {
+ doSetProperty("stateMachine", stateMachine);
+ return this;
+ }
+ /**
+ * StateMachine to use (ignored if raftHandle ref is provided).
+ * Overrides the option of the component.
+ *
+ * The option will be converted to a
+ * <code>org.jgroups.raft.StateMachine</code> type.
+ *
+ * Default: NopStateMachine
+ * Group: common
+ *
+ * @param stateMachine the value to set
+ * @return the dsl builder
+ */
+ default JGroupsRaftEndpointBuilder stateMachine(String stateMachine) {
+ doSetProperty("stateMachine", stateMachine);
+ return this;
+ }
}
/**