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 9dc1f25f08a7 CAMEL-22616: camel-main - Add support for
camel.cluster.xxx configurations
9dc1f25f08a7 is described below
commit 9dc1f25f08a7c5dbc5ca7fcb31f5b883e96135ed
Author: Claus Ibsen <[email protected]>
AuthorDate: Mon Jul 6 21:00:44 2026 +0200
CAMEL-22616: camel-main - Add support for camel.cluster.xxx configurations
Add declarative property-based configuration for cluster services in
camel-main/camel-jbang, matching the existing Spring Boot behavior.
Users can now configure cluster services via application.properties:
camel.cluster.file.root=/tmp/cluster
camel.cluster.kubernetes.namespace=default
Each cluster service class gets a @JdkService annotation for
FactoryFinder-based classpath discovery. BaseMainSupport routes
camel.cluster.* properties, groups by type sub-prefix, resolves the
matching service, binds properties, and adds it to the CamelContext.
Tooling metadata generation updated so IDE auto-complete and validation
work for all cluster configuration options. camel-jbang auto-downloads
the correct component JAR when cluster properties are detected.
Closes #24468
Co-Authored-By: Claude <[email protected]>
---
.../main/camel-main-configuration-metadata.json | 83 ++++++++++++-
.../org/apache/camel/cluster-service-consul | 2 +
.../consul/cluster/ConsulClusterService.java | 2 +
.../services/org/apache/camel/cluster-service-file | 2 +
.../file/cluster/FileLockClusterService.java | 2 +
.../org/apache/camel/cluster-service-infinispan | 2 +
.../cluster/InfinispanRemoteClusterService.java | 2 +
.../org/apache/camel/cluster-service-jgroups-raft | 2 +
.../raft/cluster/JGroupsRaftClusterService.java | 2 +
.../org/apache/camel/cluster-service-kubernetes | 2 +
.../cluster/KubernetesClusterService.java | 2 +
.../org/apache/camel/cluster-service-zookeeper | 2 +
.../zookeeper/cluster/ZooKeeperClusterService.java | 2 +
.../camel-main-configuration-metadata.json | 83 ++++++++++++-
core/camel-main/src/main/docs/main.adoc | 129 ++++++++++++++++++++
.../org/apache/camel/main/BaseMainSupport.java | 61 +++++++++-
...mel-factoryfinder-known-dependencies.properties | 15 +++
.../camel-main-known-dependencies.properties | 6 +
.../maven/packaging/PrepareCamelMainMojo.java | 133 +++++++++++++++++++++
.../maven/packaging/PrepareKameletMainMojo.java | 30 +++--
20 files changed, 554 insertions(+), 10 deletions(-)
diff --git
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/main/camel-main-configuration-metadata.json
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/main/camel-main-configuration-metadata.json
index ebf86b1e192c..034183e3dda7 100644
---
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/main/camel-main-configuration-metadata.json
+++
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/main/camel-main-configuration-metadata.json
@@ -28,7 +28,13 @@
{ "name": "camel.faulttolerance", "description": "Fault Tolerance EIP
Circuit Breaker configurations", "sourceType":
"org.apache.camel.main.FaultToleranceConfigurationProperties" },
{ "name": "camel.resilience4j", "description": "Resilience4j EIP Circuit
Breaker configurations", "sourceType":
"org.apache.camel.main.Resilience4jConfigurationProperties" },
{ "name": "camel.lra", "description": "Camel Saga EIP (Long Running
Actions) configurations", "sourceType":
"org.apache.camel.main.LraConfigurationProperties" },
- { "name": "camel.errorRegistry", "description": "Camel Error Registry
configurations", "sourceType":
"org.apache.camel.main.ErrorRegistryConfigurationProperties" }
+ { "name": "camel.errorRegistry", "description": "Camel Error Registry
configurations", "sourceType":
"org.apache.camel.main.ErrorRegistryConfigurationProperties" },
+ { "name": "camel.cluster.file", "description": "Camel File Cluster Service
configurations", "sourceType":
"org.apache.camel.component.file.cluster.FileLockClusterService" },
+ { "name": "camel.cluster.kubernetes", "description": "Camel Kubernetes
Cluster Service configurations", "sourceType":
"org.apache.camel.component.kubernetes.cluster.KubernetesClusterService" },
+ { "name": "camel.cluster.zookeeper", "description": "Camel ZooKeeper
Cluster Service configurations", "sourceType":
"org.apache.camel.component.zookeeper.cluster.ZooKeeperClusterService" },
+ { "name": "camel.cluster.consul", "description": "Camel Consul Cluster
Service configurations", "sourceType":
"org.apache.camel.component.consul.cluster.ConsulClusterService" },
+ { "name": "camel.cluster.jgroups-raft", "description": "Camel JGroups Raft
Cluster Service configurations", "sourceType":
"org.apache.camel.component.jgroups.raft.cluster.JGroupsRaftClusterService" },
+ { "name": "camel.cluster.infinispan", "description": "Camel Infinispan
Remote Cluster Service configurations", "sourceType":
"org.apache.camel.component.infinispan.remote.cluster.InfinispanRemoteClusterService"
}
],
"properties": [
{ "name": "camel.main.additionalSensitiveKeywords", "required": false,
"description": "Camel comes with a default set of sensitive keywords which are
automatically masked. This option allows to add additional custom keywords to
be masked as well. Multiple keywords can be separated by comma.", "sourceType":
"org.apache.camel.main.DefaultConfigurationProperties", "type": "string",
"javaType": "java.lang.String", "secret": false },
@@ -160,6 +166,81 @@
{ "name": "camel.main.uuidGenerator", "required": false, "description":
"UUID generator to use. default (32 bytes), short (16 bytes), classic (32 bytes
or longer), simple (long incrementing counter), off (turned off for exchanges -
only intended for performance profiling)", "sourceType":
"org.apache.camel.main.DefaultConfigurationProperties", "type": "enum",
"javaType": "java.lang.String", "defaultValue": "default", "secret": false,
"enum": [ "classic", "default", "short", "simple", [...]
{ "name": "camel.main.virtualThreadsEnabled", "required": false,
"description": "Whether to enable virtual threads when creating thread pools.
When enabled, Camel will use virtual threads instead of platform threads for
its thread pools. This can also be enabled via the JVM system property {code
camel.threads.virtual.enabled=true} . This option must be read early during
bootstrap, so it is set as a system property before thread pools are created.",
"sourceType": "org.apache.camel.mai [...]
{ "name": "camel.main.yamlDslCompactNotationWarn", "required": false,
"description": "Whether to log a WARN when YAML DSL routes use compact
(shorthand) notation instead of the canonical (explicit\/normalized) form. The
canonical style is recommended as it is more tooling and AI friendly. Use Camel
CLI to normalize existing routes: camel validate normalize <file>",
"sourceType": "org.apache.camel.main.DefaultConfigurationProperties", "type":
"boolean", "javaType": "boolean", "d [...]
+ { "name": "camel.cluster.consul.aclToken", "required": false,
"description": "Sets the ACL token to be used with Consul", "sourceType":
"org.apache.camel.component.consul.cluster.ConsulClusterService", "type":
"string", "javaType": "java.lang.String", "secret": true, "security": "secret"
},
+ { "name": "camel.cluster.consul.blockSeconds", "required": false,
"description": "The second to wait for a watch event, default 10 seconds",
"sourceType": "org.apache.camel.component.consul.cluster.ConsulClusterService",
"type": "integer", "javaType": "int", "defaultValue": 10, "secret": false },
+ { "name": "camel.cluster.consul.configuration", "required": false,
"description": "To use an existing configuration", "sourceType":
"org.apache.camel.component.consul.cluster.ConsulClusterService", "type":
"object", "javaType":
"org.apache.camel.component.consul.cluster.ConsulClusterConfiguration",
"secret": false },
+ { "name": "camel.cluster.consul.connectTimeout", "required": false,
"description": "Connect timeout in millis", "sourceType":
"org.apache.camel.component.consul.cluster.ConsulClusterService", "type":
"integer", "javaType": "int", "secret": false },
+ { "name": "camel.cluster.consul.datacenter", "required": false,
"description": "The data center", "sourceType":
"org.apache.camel.component.consul.cluster.ConsulClusterService", "type":
"string", "javaType": "java.lang.String", "secret": false },
+ { "name": "camel.cluster.consul.enabled", "required": false,
"description": "Whether to enable this cluster service.", "sourceType":
"org.apache.camel.component.consul.cluster.ConsulClusterService", "type":
"boolean", "javaType": "boolean", "defaultValue": true, "secret": false },
+ { "name": "camel.cluster.consul.id", "required": true, "description":
"Client id registered as _consul.service.registry.id", "sourceType":
"org.apache.camel.component.consul.cluster.ConsulClusterService", "type":
"string", "javaType": "java.lang.String", "secret": false },
+ { "name": "camel.cluster.consul.password", "required": false,
"description": "Sets the password to be used for basic authentication",
"sourceType": "org.apache.camel.component.consul.cluster.ConsulClusterService",
"type": "string", "javaType": "java.lang.String", "secret": true, "security":
"secret" },
+ { "name": "camel.cluster.consul.readTimeout", "required": false,
"description": "Read timeout in millis", "sourceType":
"org.apache.camel.component.consul.cluster.ConsulClusterService", "type":
"integer", "javaType": "int", "secret": false },
+ { "name": "camel.cluster.consul.rootPath", "required": false,
"description": "The Consul cluster root directory path", "sourceType":
"org.apache.camel.component.consul.cluster.ConsulClusterService", "type":
"string", "javaType": "java.lang.String", "defaultValue": "\/camel", "secret":
false },
+ { "name": "camel.cluster.consul.sessionLockDelay", "required": false,
"description": "Session lock delay in seconds", "sourceType":
"org.apache.camel.component.consul.cluster.ConsulClusterService", "type":
"integer", "javaType": "int", "defaultValue": 5, "secret": false },
+ { "name": "camel.cluster.consul.sessionRefreshInterval", "required":
false, "description": "Session refresh interval in seconds", "sourceType":
"org.apache.camel.component.consul.cluster.ConsulClusterService", "type":
"integer", "javaType": "int", "defaultValue": 5, "secret": false },
+ { "name": "camel.cluster.consul.sessionTtl", "required": false,
"description": "Session time to live in seconds", "sourceType":
"org.apache.camel.component.consul.cluster.ConsulClusterService", "type":
"integer", "javaType": "int", "defaultValue": 60, "secret": false },
+ { "name": "camel.cluster.consul.sslContextParameters", "required": false,
"description": "SSL configuration for advanced security configuration",
"sourceType": "org.apache.camel.component.consul.cluster.ConsulClusterService",
"type": "object", "javaType":
"org.apache.camel.support.jsse.SSLContextParameters", "secret": false },
+ { "name": "camel.cluster.consul.url", "required": false, "description":
"The Consul agent URL", "sourceType":
"org.apache.camel.component.consul.cluster.ConsulClusterService", "type":
"string", "javaType": "java.lang.String", "secret": false },
+ { "name": "camel.cluster.consul.userName", "required": false,
"description": "Sets the username to be used for basic authentication",
"sourceType": "org.apache.camel.component.consul.cluster.ConsulClusterService",
"type": "string", "javaType": "java.lang.String", "secret": true, "security":
"secret" },
+ { "name": "camel.cluster.consul.writeTimeout", "required": false,
"description": "Write timeout in mills", "sourceType":
"org.apache.camel.component.consul.cluster.ConsulClusterService", "type":
"integer", "javaType": "int", "secret": false },
+ { "name": "camel.cluster.file.acquireLockDelay", "required": false,
"description": "The time to wait before starting to try to acquire the cluster
lock. Note that if FileLockClusterService determines no cluster members are
running or cannot reliably determine the cluster state, the initial delay is
computed from the acquireLockInterval.", "sourceType":
"org.apache.camel.component.file.cluster.FileLockClusterService", "type":
"integer", "javaType": "long", "defaultValue": 1, "secret": [...]
+ { "name": "camel.cluster.file.acquireLockDelayUnit", "required": false,
"description": "The time unit for the acquireLockDelay", "sourceType":
"org.apache.camel.component.file.cluster.FileLockClusterService", "type":
"object", "javaType": "java.util.concurrent.TimeUnit", "defaultValue":
"SECONDS", "secret": false },
+ { "name": "camel.cluster.file.acquireLockInterval", "required": false,
"description": "The time to wait between attempts to try to acquire the cluster
lock evaluated using wall-clock time. All cluster members must use the same
value so leadership checks and leader liveness detection remain consistent.",
"sourceType": "org.apache.camel.component.file.cluster.FileLockClusterService",
"type": "integer", "javaType": "long", "defaultValue": 10, "secret": false },
+ { "name": "camel.cluster.file.acquireLockIntervalUnit", "required": false,
"description": "The time unit for the acquireLockInterval", "sourceType":
"org.apache.camel.component.file.cluster.FileLockClusterService", "type":
"object", "javaType": "java.util.concurrent.TimeUnit", "defaultValue":
"SECONDS", "secret": false },
+ { "name": "camel.cluster.file.clusterDataTaskMaxAttempts", "required":
false, "description": "Sets how many times a cluster data task will run,
counting both the first execution and subsequent retries in case of failure or
timeout. The default is 5 attempts. This can be useful when the cluster data
root is on network based file storage, where I\/O operations may occasionally
block for long or unpredictable periods.", "sourceType":
"org.apache.camel.component.file.cluster.FileLockClus [...]
+ { "name": "camel.cluster.file.clusterDataTaskTimeout", "required": false,
"description": "Sets the timeout for a cluster data task (reading or writing
cluster data). The default is 10 seconds. Timeouts are useful when the cluster
data root is on network storage, where I\/O operations may occasionally block
for long or unpredictable periods.", "sourceType":
"org.apache.camel.component.file.cluster.FileLockClusterService", "type":
"integer", "javaType": "long", "defaultValue": 10, "sec [...]
+ { "name": "camel.cluster.file.clusterDataTaskTimeoutUnit", "required":
false, "description": "The time unit for the clusterDataTaskTimeoutUnit",
"sourceType": "org.apache.camel.component.file.cluster.FileLockClusterService",
"type": "object", "javaType": "java.util.concurrent.TimeUnit", "defaultValue":
"SECONDS", "secret": false },
+ { "name": "camel.cluster.file.enabled", "required": false, "description":
"Whether to enable this cluster service.", "sourceType":
"org.apache.camel.component.file.cluster.FileLockClusterService", "type":
"boolean", "javaType": "boolean", "defaultValue": true, "secret": false },
+ { "name": "camel.cluster.file.heartbeatTimeoutMultiplier", "required":
false, "description": "Multiplier applied to the cluster leader
acquireLockInterval to determine how long followers should wait before
considering the leader stale. For example, if the leader updates its heartbeat
every 2 seconds and the heartbeatTimeoutMultiplier is 3, followers will
tolerate up to 2s * 3 = 6s of silence before declaring the leader
unavailable.", "sourceType": "org.apache.camel.component.file.clu [...]
+ { "name": "camel.cluster.file.root", "required": true, "description": "The
root file path", "sourceType":
"org.apache.camel.component.file.cluster.FileLockClusterService", "type":
"string", "javaType": "java.lang.String", "secret": false },
+ { "name": "camel.cluster.infinispan.cacheContainer", "required": false,
"description": "Specifies the cache Container to connect", "sourceType":
"org.apache.camel.component.infinispan.remote.cluster.InfinispanRemoteClusterService",
"type": "object", "javaType":
"org.infinispan.client.hotrod.RemoteCacheManager", "secret": false },
+ { "name": "camel.cluster.infinispan.cacheContainerConfiguration",
"required": false, "description": "The CacheContainer configuration. Used if
the cacheContainer is not defined.", "sourceType":
"org.apache.camel.component.infinispan.remote.cluster.InfinispanRemoteClusterService",
"type": "object", "javaType":
"org.infinispan.client.hotrod.configuration.Configuration", "secret": false },
+ { "name": "camel.cluster.infinispan.configuration", "required": false,
"description": "To use an existing configuration", "sourceType":
"org.apache.camel.component.infinispan.remote.cluster.InfinispanRemoteClusterService",
"type": "object", "javaType":
"org.apache.camel.component.infinispan.remote.cluster.InfinispanRemoteClusterConfiguration",
"secret": false },
+ { "name": "camel.cluster.infinispan.configurationProperties", "required":
false, "description": "Implementation specific properties for the
CacheManager", "sourceType":
"org.apache.camel.component.infinispan.remote.cluster.InfinispanRemoteClusterService",
"type": "object", "javaType": "java.util.Map", "secret": false },
+ { "name": "camel.cluster.infinispan.configurationUri", "required": false,
"description": "An implementation specific URI for the CacheManager",
"sourceType":
"org.apache.camel.component.infinispan.remote.cluster.InfinispanRemoteClusterService",
"type": "string", "javaType": "java.lang.String", "secret": false },
+ { "name": "camel.cluster.infinispan.enabled", "required": false,
"description": "Whether to enable this cluster service.", "sourceType":
"org.apache.camel.component.infinispan.remote.cluster.InfinispanRemoteClusterService",
"type": "boolean", "javaType": "boolean", "defaultValue": true, "secret":
false },
+ { "name": "camel.cluster.infinispan.hosts", "required": false,
"description": "Specifies the host of the cache on Infinispan instance.
Multiple hosts can be separated by semicolon.", "sourceType":
"org.apache.camel.component.infinispan.remote.cluster.InfinispanRemoteClusterService",
"type": "string", "javaType": "java.lang.String", "secret": false },
+ { "name": "camel.cluster.infinispan.id", "required": true, "description":
"Node id", "sourceType":
"org.apache.camel.component.infinispan.remote.cluster.InfinispanRemoteClusterService",
"type": "string", "javaType": "java.lang.String", "secret": false },
+ { "name": "camel.cluster.infinispan.lifespan", "required": false,
"description": "The lifespan of the cache entry for the local cluster member
registered to the inventory", "sourceType":
"org.apache.camel.component.infinispan.remote.cluster.InfinispanRemoteClusterService",
"type": "integer", "javaType": "long", "defaultValue": 30, "secret": false },
+ { "name": "camel.cluster.infinispan.lifespanTimeUnit", "required": false,
"description": "The TimeUnit of the lifespan", "sourceType":
"org.apache.camel.component.infinispan.remote.cluster.InfinispanRemoteClusterService",
"type": "object", "javaType": "java.util.concurrent.TimeUnit", "defaultValue":
"SECONDS", "secret": false },
+ { "name": "camel.cluster.infinispan.password", "required": false,
"description": "Define the password to access the infinispan instance",
"sourceType":
"org.apache.camel.component.infinispan.remote.cluster.InfinispanRemoteClusterService",
"type": "string", "javaType": "java.lang.String", "secret": true, "security":
"secret" },
+ { "name": "camel.cluster.infinispan.saslMechanism", "required": false,
"description": "Define the SASL Mechanism to access the infinispan instance",
"sourceType":
"org.apache.camel.component.infinispan.remote.cluster.InfinispanRemoteClusterService",
"type": "string", "javaType": "java.lang.String", "secret": false },
+ { "name": "camel.cluster.infinispan.secure", "required": false,
"description": "Define if we are connecting to a secured Infinispan instance",
"sourceType":
"org.apache.camel.component.infinispan.remote.cluster.InfinispanRemoteClusterService",
"type": "boolean", "javaType": "boolean", "defaultValue": false, "secret":
false },
+ { "name": "camel.cluster.infinispan.securityRealm", "required": false,
"description": "Define the security realm to access the infinispan instance",
"sourceType":
"org.apache.camel.component.infinispan.remote.cluster.InfinispanRemoteClusterService",
"type": "string", "javaType": "java.lang.String", "secret": false },
+ { "name": "camel.cluster.infinispan.securityServerName", "required":
false, "description": "Define the security server name to access the infinispan
instance", "sourceType":
"org.apache.camel.component.infinispan.remote.cluster.InfinispanRemoteClusterService",
"type": "string", "javaType": "java.lang.String", "secret": false },
+ { "name": "camel.cluster.infinispan.username", "required": false,
"description": "Define the username to access the infinispan instance",
"sourceType":
"org.apache.camel.component.infinispan.remote.cluster.InfinispanRemoteClusterService",
"type": "string", "javaType": "java.lang.String", "secret": false },
+ { "name": "camel.cluster.jgroups-raft.enabled", "required": false,
"description": "Whether to enable this cluster service.", "sourceType":
"org.apache.camel.component.jgroups.raft.cluster.JGroupsRaftClusterService",
"type": "boolean", "javaType": "boolean", "defaultValue": true, "secret": false
},
+ { "name": "camel.cluster.jgroups-raft.id", "required": true,
"description": "Unique Raft id", "sourceType":
"org.apache.camel.component.jgroups.raft.cluster.JGroupsRaftClusterService",
"type": "string", "javaType": "java.lang.String", "secret": false },
+ { "name": "camel.cluster.jgroups-raft.jgroupsClusterName", "required":
false, "description": "The name of the cluster", "sourceType":
"org.apache.camel.component.jgroups.raft.cluster.JGroupsRaftClusterService",
"type": "string", "javaType": "java.lang.String", "defaultValue":
"jgroupsraft-master", "secret": false },
+ { "name": "camel.cluster.jgroups-raft.jgroupsConfig", "required": false,
"description": "The path to the JGroups Raft configuration", "sourceType":
"org.apache.camel.component.jgroups.raft.cluster.JGroupsRaftClusterService",
"type": "string", "javaType": "java.lang.String", "defaultValue": "raft.xml",
"secret": false },
+ { "name": "camel.cluster.jgroups-raft.raftHandle", "required": false,
"description": "To use a custom RaftHandler", "sourceType":
"org.apache.camel.component.jgroups.raft.cluster.JGroupsRaftClusterService",
"type": "object", "javaType": "org.jgroups.raft.RaftHandle", "secret": false },
+ { "name": "camel.cluster.kubernetes.clusterLabels", "required": false,
"description": "Labels used to identify the members of the cluster.",
"sourceType":
"org.apache.camel.component.kubernetes.cluster.KubernetesClusterService",
"type": "object", "javaType": "java.util.Map", "secret": false, "deprecated":
true },
+ { "name": "camel.cluster.kubernetes.configuration", "required": false,
"description": "To use an existing configuration for Kubernetes", "sourceType":
"org.apache.camel.component.kubernetes.cluster.KubernetesClusterService",
"type": "object", "javaType":
"org.apache.camel.component.kubernetes.KubernetesConfiguration", "secret":
false, "deprecated": true },
+ { "name": "camel.cluster.kubernetes.connectionTimeout", "required": false,
"description": "Connection timeout in milliseconds to use when making requests
to the Kubernetes API server.", "sourceType":
"org.apache.camel.component.kubernetes.cluster.KubernetesClusterService",
"type": "integer", "javaType": "java.lang.Integer", "secret": false,
"deprecated": true },
+ { "name": "camel.cluster.kubernetes.enabled", "required": false,
"description": "Whether to enable this cluster service.", "sourceType":
"org.apache.camel.component.kubernetes.cluster.KubernetesClusterService",
"type": "boolean", "javaType": "boolean", "defaultValue": true, "secret": false
},
+ { "name": "camel.cluster.kubernetes.groupName", "required": false,
"description": "Name of the lock group (or namespace according to the Camel
cluster convention) within the chosen ConfigMap.", "sourceType":
"org.apache.camel.component.kubernetes.cluster.KubernetesClusterService",
"type": "string", "javaType": "java.lang.String", "secret": false,
"deprecated": true },
+ { "name": "camel.cluster.kubernetes.jitterFactor", "required": false,
"description": "A jitter factor to apply in order to prevent all pods to call
Kubernetes APIs in the same instant.", "sourceType":
"org.apache.camel.component.kubernetes.cluster.KubernetesClusterService",
"type": "number", "javaType": "double", "defaultValue": "1.2", "secret": false,
"deprecated": true },
+ { "name": "camel.cluster.kubernetes.kubernetesResourceName", "required":
false, "description": "Name of the resource used for locking (or prefix, in
case multiple ones are used).", "sourceType":
"org.apache.camel.component.kubernetes.cluster.KubernetesClusterService",
"type": "string", "javaType": "java.lang.String", "defaultValue": "leaders",
"secret": false, "deprecated": true },
+ { "name": "camel.cluster.kubernetes.kubernetesResourcesNamespace",
"required": false, "description": "Kubernetes namespace containing the pods and
the ConfigMap used for locking.", "sourceType":
"org.apache.camel.component.kubernetes.cluster.KubernetesClusterService",
"type": "string", "javaType": "java.lang.String", "secret": false,
"deprecated": true },
+ { "name": "camel.cluster.kubernetes.leaseDurationMillis", "required":
false, "description": "The default duration of the lease for the current
leader.", "sourceType":
"org.apache.camel.component.kubernetes.cluster.KubernetesClusterService",
"type": "integer", "javaType": "long", "defaultValue": 15000, "secret": false,
"deprecated": true },
+ { "name": "camel.cluster.kubernetes.leaseResourceType", "required": false,
"description": "Kubernetes resource type used to hold the leases.",
"sourceType":
"org.apache.camel.component.kubernetes.cluster.KubernetesClusterService",
"type": "object", "javaType":
"org.apache.camel.component.kubernetes.cluster.LeaseResourceType",
"defaultValue": "Lease", "secret": false, "deprecated": true },
+ { "name": "camel.cluster.kubernetes.masterUrl", "required": false,
"description": "URL to a remote Kubernetes API server. This should only be used
when your Camel application is connecting from outside Kubernetes. If you run
your Camel application inside Kubernetes, then you can use local or client as
the URL to tell Camel to run in local mode. If you connect remotely to
Kubernetes, then you may also need some of the many other configuration options
for secured connection with certif [...]
+ { "name": "camel.cluster.kubernetes.namespace", "required": false,
"description": "Kubernetes namespace", "sourceType":
"org.apache.camel.component.kubernetes.cluster.KubernetesClusterService",
"type": "string", "javaType": "java.lang.String", "secret": false,
"deprecated": true },
+ { "name": "camel.cluster.kubernetes.podName", "required": false,
"description": "Name of the current pod (defaults to host name).",
"sourceType":
"org.apache.camel.component.kubernetes.cluster.KubernetesClusterService",
"type": "string", "javaType": "java.lang.String", "secret": false,
"deprecated": true },
+ { "name": "camel.cluster.kubernetes.renewDeadlineMillis", "required":
false, "description": "The deadline after which the leader must stop its
services because it may have lost the leadership.", "sourceType":
"org.apache.camel.component.kubernetes.cluster.KubernetesClusterService",
"type": "integer", "javaType": "long", "defaultValue": 10000, "secret": false,
"deprecated": true },
+ { "name": "camel.cluster.kubernetes.retryPeriodMillis", "required": false,
"description": "The time between two subsequent attempts to check and acquire
the leadership. It is randomized using the jitter factor.", "sourceType":
"org.apache.camel.component.kubernetes.cluster.KubernetesClusterService",
"type": "integer", "javaType": "long", "defaultValue": 2000, "secret": false,
"deprecated": true },
+ { "name": "camel.cluster.zookeeper.basePath", "required": true,
"description": "The base path to store in ZooKeeper", "sourceType":
"org.apache.camel.component.zookeeper.cluster.ZooKeeperClusterService", "type":
"string", "javaType": "java.lang.String", "secret": false },
+ { "name": "camel.cluster.zookeeper.connectTimeout", "required": false,
"description": "Connect timeout (millis)", "sourceType":
"org.apache.camel.component.zookeeper.cluster.ZooKeeperClusterService", "type":
"integer", "javaType": "long", "defaultValue": 15000, "secret": false },
+ { "name": "camel.cluster.zookeeper.enabled", "required": false,
"description": "Whether to enable this cluster service.", "sourceType":
"org.apache.camel.component.zookeeper.cluster.ZooKeeperClusterService", "type":
"boolean", "javaType": "boolean", "defaultValue": true, "secret": false },
+ { "name": "camel.cluster.zookeeper.id", "required": true, "description":
"Node id", "sourceType":
"org.apache.camel.component.zookeeper.cluster.ZooKeeperClusterService", "type":
"string", "javaType": "java.lang.String", "secret": false },
+ { "name": "camel.cluster.zookeeper.maxCloseWait", "required": false,
"description": "Time to wait (millis) during close to join background threads",
"sourceType":
"org.apache.camel.component.zookeeper.cluster.ZooKeeperClusterService", "type":
"integer", "javaType": "long", "defaultValue": 1000, "secret": false },
+ { "name": "camel.cluster.zookeeper.namespace", "required": false,
"description": "ZooKeeper namespace. If a namespace is set here, all paths will
get pre-pended with the namespace", "sourceType":
"org.apache.camel.component.zookeeper.cluster.ZooKeeperClusterService", "type":
"string", "javaType": "java.lang.String", "secret": false },
+ { "name": "camel.cluster.zookeeper.nodes", "required": true,
"description": "The Zookeeper server hosts (multiple servers can be separated
by comma)", "sourceType":
"org.apache.camel.component.zookeeper.cluster.ZooKeeperClusterService", "type":
"string", "javaType": "java.lang.String", "secret": false },
+ { "name": "camel.cluster.zookeeper.reconnectBaseSleepTime", "required":
false, "description": "Initial amount of time (millis) to wait between
retries", "sourceType":
"org.apache.camel.component.zookeeper.cluster.ZooKeeperClusterService", "type":
"integer", "javaType": "long", "defaultValue": 1000, "secret": false },
+ { "name": "camel.cluster.zookeeper.reconnectMaxRetries", "required":
false, "description": "Max number of times to retry", "sourceType":
"org.apache.camel.component.zookeeper.cluster.ZooKeeperClusterService", "type":
"integer", "javaType": "int", "defaultValue": 3, "secret": false },
+ { "name": "camel.cluster.zookeeper.reconnectMaxSleepTime", "required":
false, "description": "Max time (millis) to sleep on each retry", "sourceType":
"org.apache.camel.component.zookeeper.cluster.ZooKeeperClusterService", "type":
"integer", "javaType": "long", "secret": false },
+ { "name": "camel.cluster.zookeeper.retryPolicy", "required": false,
"description": "To use a custom retry policy implementation", "sourceType":
"org.apache.camel.component.zookeeper.cluster.ZooKeeperClusterService", "type":
"object", "javaType": "org.apache.curator.RetryPolicy", "secret": false },
+ { "name": "camel.cluster.zookeeper.sessionTimeout", "required": false,
"description": "Session timeout (millis)", "sourceType":
"org.apache.camel.component.zookeeper.cluster.ZooKeeperClusterService", "type":
"integer", "javaType": "long", "defaultValue": 60000, "secret": false },
{ "name": "camel.debug.bodyIncludeFiles", "required": false,
"description": "Whether to include the message body of file based messages. The
overhead is that the file content has to be read from the file.", "sourceType":
"org.apache.camel.main.DebuggerConfigurationProperties", "type": "boolean",
"javaType": "boolean", "defaultValue": true, "secret": false },
{ "name": "camel.debug.bodyIncludeStreams", "required": false,
"description": "Whether to include the message body of stream based messages.
If enabled then beware the stream may not be re-readable later. See more about
Stream Caching.", "sourceType":
"org.apache.camel.main.DebuggerConfigurationProperties", "type": "boolean",
"javaType": "boolean", "defaultValue": false, "secret": false },
{ "name": "camel.debug.bodyMaxChars", "required": false, "description":
"To limit the message body to a maximum size in the traced message. Use 0 or
negative value to use unlimited size.", "sourceType":
"org.apache.camel.main.DebuggerConfigurationProperties", "type": "integer",
"javaType": "int", "defaultValue": 32768, "secret": false },
diff --git
a/components/camel-consul/src/generated/resources/META-INF/services/org/apache/camel/cluster-service-consul
b/components/camel-consul/src/generated/resources/META-INF/services/org/apache/camel/cluster-service-consul
new file mode 100644
index 000000000000..ac6f14497205
--- /dev/null
+++
b/components/camel-consul/src/generated/resources/META-INF/services/org/apache/camel/cluster-service-consul
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.component.consul.cluster.ConsulClusterService
diff --git
a/components/camel-consul/src/main/java/org/apache/camel/component/consul/cluster/ConsulClusterService.java
b/components/camel-consul/src/main/java/org/apache/camel/component/consul/cluster/ConsulClusterService.java
index ae40b63e23f0..8d754190ad90 100644
---
a/components/camel-consul/src/main/java/org/apache/camel/component/consul/cluster/ConsulClusterService.java
+++
b/components/camel-consul/src/main/java/org/apache/camel/component/consul/cluster/ConsulClusterService.java
@@ -21,10 +21,12 @@ import java.time.temporal.ChronoUnit;
import org.apache.camel.spi.Configurer;
import org.apache.camel.spi.Metadata;
+import org.apache.camel.spi.annotations.JdkService;
import org.apache.camel.support.cluster.AbstractCamelClusterService;
import org.apache.camel.support.jsse.SSLContextParameters;
import org.apache.camel.util.ObjectHelper;
+@JdkService("cluster-service-consul")
@Metadata(label = "bean",
description = "A consul based cluster locking",
annotations = {
"interfaceName=org.apache.camel.cluster.CamelClusterService" })
diff --git
a/components/camel-file/src/generated/resources/META-INF/services/org/apache/camel/cluster-service-file
b/components/camel-file/src/generated/resources/META-INF/services/org/apache/camel/cluster-service-file
new file mode 100644
index 000000000000..b7e0112b7785
--- /dev/null
+++
b/components/camel-file/src/generated/resources/META-INF/services/org/apache/camel/cluster-service-file
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.component.file.cluster.FileLockClusterService
diff --git
a/components/camel-file/src/main/java/org/apache/camel/component/file/cluster/FileLockClusterService.java
b/components/camel-file/src/main/java/org/apache/camel/component/file/cluster/FileLockClusterService.java
index 40415e75ceed..f36f96b806be 100644
---
a/components/camel-file/src/main/java/org/apache/camel/component/file/cluster/FileLockClusterService.java
+++
b/components/camel-file/src/main/java/org/apache/camel/component/file/cluster/FileLockClusterService.java
@@ -24,9 +24,11 @@ import java.util.concurrent.locks.Lock;
import org.apache.camel.CamelContext;
import org.apache.camel.spi.Configurer;
import org.apache.camel.spi.Metadata;
+import org.apache.camel.spi.annotations.JdkService;
import org.apache.camel.support.cluster.AbstractCamelClusterService;
import org.apache.camel.util.ObjectHelper;
+@JdkService("cluster-service-file")
@Metadata(label = "bean",
description = "A file based cluster locking (read documentation to
understand limitations)",
annotations = {
"interfaceName=org.apache.camel.cluster.CamelClusterService" })
diff --git
a/components/camel-infinispan/camel-infinispan/src/generated/resources/META-INF/services/org/apache/camel/cluster-service-infinispan
b/components/camel-infinispan/camel-infinispan/src/generated/resources/META-INF/services/org/apache/camel/cluster-service-infinispan
new file mode 100644
index 000000000000..43ae6131118b
--- /dev/null
+++
b/components/camel-infinispan/camel-infinispan/src/generated/resources/META-INF/services/org/apache/camel/cluster-service-infinispan
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.component.infinispan.remote.cluster.InfinispanRemoteClusterService
diff --git
a/components/camel-infinispan/camel-infinispan/src/main/java/org/apache/camel/component/infinispan/remote/cluster/InfinispanRemoteClusterService.java
b/components/camel-infinispan/camel-infinispan/src/main/java/org/apache/camel/component/infinispan/remote/cluster/InfinispanRemoteClusterService.java
index fdd540d34dee..f3015c27606c 100644
---
a/components/camel-infinispan/camel-infinispan/src/main/java/org/apache/camel/component/infinispan/remote/cluster/InfinispanRemoteClusterService.java
+++
b/components/camel-infinispan/camel-infinispan/src/main/java/org/apache/camel/component/infinispan/remote/cluster/InfinispanRemoteClusterService.java
@@ -23,10 +23,12 @@ import
org.apache.camel.component.infinispan.cluster.InfinispanClusterService;
import org.apache.camel.component.infinispan.cluster.InfinispanClusterView;
import org.apache.camel.spi.Configurer;
import org.apache.camel.spi.Metadata;
+import org.apache.camel.spi.annotations.JdkService;
import org.apache.camel.util.ObjectHelper;
import org.infinispan.client.hotrod.RemoteCacheManager;
import org.infinispan.client.hotrod.configuration.Configuration;
+@JdkService("cluster-service-infinispan")
@Metadata(label = "bean",
description = "Infinispan based remote cluster locking",
annotations = {
"interfaceName=org.apache.camel.cluster.CamelClusterService" })
diff --git
a/components/camel-jgroups-raft/src/generated/resources/META-INF/services/org/apache/camel/cluster-service-jgroups-raft
b/components/camel-jgroups-raft/src/generated/resources/META-INF/services/org/apache/camel/cluster-service-jgroups-raft
new file mode 100644
index 000000000000..d9d72a1970ae
--- /dev/null
+++
b/components/camel-jgroups-raft/src/generated/resources/META-INF/services/org/apache/camel/cluster-service-jgroups-raft
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.component.jgroups.raft.cluster.JGroupsRaftClusterService
diff --git
a/components/camel-jgroups-raft/src/main/java/org/apache/camel/component/jgroups/raft/cluster/JGroupsRaftClusterService.java
b/components/camel-jgroups-raft/src/main/java/org/apache/camel/component/jgroups/raft/cluster/JGroupsRaftClusterService.java
index 503eb7a596df..8c481dabe678 100644
---
a/components/camel-jgroups-raft/src/main/java/org/apache/camel/component/jgroups/raft/cluster/JGroupsRaftClusterService.java
+++
b/components/camel-jgroups-raft/src/main/java/org/apache/camel/component/jgroups/raft/cluster/JGroupsRaftClusterService.java
@@ -18,9 +18,11 @@ package org.apache.camel.component.jgroups.raft.cluster;
import org.apache.camel.spi.Configurer;
import org.apache.camel.spi.Metadata;
+import org.apache.camel.spi.annotations.JdkService;
import org.apache.camel.support.cluster.AbstractCamelClusterService;
import org.jgroups.raft.RaftHandle;
+@JdkService("cluster-service-jgroups-raft")
@Metadata(label = "bean",
description = "JGroups Raft based cluster locking",
annotations = {
"interfaceName=org.apache.camel.cluster.CamelClusterService" })
diff --git
a/components/camel-kubernetes/src/generated/resources/META-INF/services/org/apache/camel/cluster-service-kubernetes
b/components/camel-kubernetes/src/generated/resources/META-INF/services/org/apache/camel/cluster-service-kubernetes
new file mode 100644
index 000000000000..c38224c93c0a
--- /dev/null
+++
b/components/camel-kubernetes/src/generated/resources/META-INF/services/org/apache/camel/cluster-service-kubernetes
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.component.kubernetes.cluster.KubernetesClusterService
diff --git
a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/cluster/KubernetesClusterService.java
b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/cluster/KubernetesClusterService.java
index c1973ebc6196..7b43d8178f07 100644
---
a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/cluster/KubernetesClusterService.java
+++
b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/cluster/KubernetesClusterService.java
@@ -28,12 +28,14 @@ import
org.apache.camel.component.kubernetes.KubernetesConfiguration;
import
org.apache.camel.component.kubernetes.cluster.lock.KubernetesLockConfiguration;
import org.apache.camel.spi.Configurer;
import org.apache.camel.spi.Metadata;
+import org.apache.camel.spi.annotations.JdkService;
import org.apache.camel.support.cluster.AbstractCamelClusterService;
import org.apache.camel.util.ObjectHelper;
/**
* A Kubernetes based cluster service leveraging Kubernetes optimistic locks
on resources (specifically ConfigMaps).
*/
+@JdkService("cluster-service-kubernetes")
@Metadata(label = "bean",
description = "Kubernetes based cluster locking",
annotations = {
"interfaceName=org.apache.camel.cluster.CamelClusterService" })
diff --git
a/components/camel-zookeeper/src/generated/resources/META-INF/services/org/apache/camel/cluster-service-zookeeper
b/components/camel-zookeeper/src/generated/resources/META-INF/services/org/apache/camel/cluster-service-zookeeper
new file mode 100644
index 000000000000..e3d5f2c031b7
--- /dev/null
+++
b/components/camel-zookeeper/src/generated/resources/META-INF/services/org/apache/camel/cluster-service-zookeeper
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.component.zookeeper.cluster.ZooKeeperClusterService
diff --git
a/components/camel-zookeeper/src/main/java/org/apache/camel/component/zookeeper/cluster/ZooKeeperClusterService.java
b/components/camel-zookeeper/src/main/java/org/apache/camel/component/zookeeper/cluster/ZooKeeperClusterService.java
index 878e68eb493c..438b87b58bba 100644
---
a/components/camel-zookeeper/src/main/java/org/apache/camel/component/zookeeper/cluster/ZooKeeperClusterService.java
+++
b/components/camel-zookeeper/src/main/java/org/apache/camel/component/zookeeper/cluster/ZooKeeperClusterService.java
@@ -20,6 +20,7 @@ import
org.apache.camel.component.zookeeper.ZooKeeperCuratorConfiguration;
import org.apache.camel.component.zookeeper.ZooKeeperCuratorHelper;
import org.apache.camel.spi.Configurer;
import org.apache.camel.spi.Metadata;
+import org.apache.camel.spi.annotations.JdkService;
import org.apache.camel.support.cluster.AbstractCamelClusterService;
import org.apache.camel.util.IOHelper;
import org.apache.camel.util.ObjectHelper;
@@ -28,6 +29,7 @@ import org.apache.curator.framework.CuratorFramework;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+@JdkService("cluster-service-zookeeper")
@Metadata(label = "bean",
description = "ZooKeeper based cluster locking",
annotations = {
"interfaceName=org.apache.camel.cluster.CamelClusterService" })
diff --git
a/core/camel-main/src/generated/resources/META-INF/camel-main-configuration-metadata.json
b/core/camel-main/src/generated/resources/META-INF/camel-main-configuration-metadata.json
index ebf86b1e192c..034183e3dda7 100644
---
a/core/camel-main/src/generated/resources/META-INF/camel-main-configuration-metadata.json
+++
b/core/camel-main/src/generated/resources/META-INF/camel-main-configuration-metadata.json
@@ -28,7 +28,13 @@
{ "name": "camel.faulttolerance", "description": "Fault Tolerance EIP
Circuit Breaker configurations", "sourceType":
"org.apache.camel.main.FaultToleranceConfigurationProperties" },
{ "name": "camel.resilience4j", "description": "Resilience4j EIP Circuit
Breaker configurations", "sourceType":
"org.apache.camel.main.Resilience4jConfigurationProperties" },
{ "name": "camel.lra", "description": "Camel Saga EIP (Long Running
Actions) configurations", "sourceType":
"org.apache.camel.main.LraConfigurationProperties" },
- { "name": "camel.errorRegistry", "description": "Camel Error Registry
configurations", "sourceType":
"org.apache.camel.main.ErrorRegistryConfigurationProperties" }
+ { "name": "camel.errorRegistry", "description": "Camel Error Registry
configurations", "sourceType":
"org.apache.camel.main.ErrorRegistryConfigurationProperties" },
+ { "name": "camel.cluster.file", "description": "Camel File Cluster Service
configurations", "sourceType":
"org.apache.camel.component.file.cluster.FileLockClusterService" },
+ { "name": "camel.cluster.kubernetes", "description": "Camel Kubernetes
Cluster Service configurations", "sourceType":
"org.apache.camel.component.kubernetes.cluster.KubernetesClusterService" },
+ { "name": "camel.cluster.zookeeper", "description": "Camel ZooKeeper
Cluster Service configurations", "sourceType":
"org.apache.camel.component.zookeeper.cluster.ZooKeeperClusterService" },
+ { "name": "camel.cluster.consul", "description": "Camel Consul Cluster
Service configurations", "sourceType":
"org.apache.camel.component.consul.cluster.ConsulClusterService" },
+ { "name": "camel.cluster.jgroups-raft", "description": "Camel JGroups Raft
Cluster Service configurations", "sourceType":
"org.apache.camel.component.jgroups.raft.cluster.JGroupsRaftClusterService" },
+ { "name": "camel.cluster.infinispan", "description": "Camel Infinispan
Remote Cluster Service configurations", "sourceType":
"org.apache.camel.component.infinispan.remote.cluster.InfinispanRemoteClusterService"
}
],
"properties": [
{ "name": "camel.main.additionalSensitiveKeywords", "required": false,
"description": "Camel comes with a default set of sensitive keywords which are
automatically masked. This option allows to add additional custom keywords to
be masked as well. Multiple keywords can be separated by comma.", "sourceType":
"org.apache.camel.main.DefaultConfigurationProperties", "type": "string",
"javaType": "java.lang.String", "secret": false },
@@ -160,6 +166,81 @@
{ "name": "camel.main.uuidGenerator", "required": false, "description":
"UUID generator to use. default (32 bytes), short (16 bytes), classic (32 bytes
or longer), simple (long incrementing counter), off (turned off for exchanges -
only intended for performance profiling)", "sourceType":
"org.apache.camel.main.DefaultConfigurationProperties", "type": "enum",
"javaType": "java.lang.String", "defaultValue": "default", "secret": false,
"enum": [ "classic", "default", "short", "simple", [...]
{ "name": "camel.main.virtualThreadsEnabled", "required": false,
"description": "Whether to enable virtual threads when creating thread pools.
When enabled, Camel will use virtual threads instead of platform threads for
its thread pools. This can also be enabled via the JVM system property {code
camel.threads.virtual.enabled=true} . This option must be read early during
bootstrap, so it is set as a system property before thread pools are created.",
"sourceType": "org.apache.camel.mai [...]
{ "name": "camel.main.yamlDslCompactNotationWarn", "required": false,
"description": "Whether to log a WARN when YAML DSL routes use compact
(shorthand) notation instead of the canonical (explicit\/normalized) form. The
canonical style is recommended as it is more tooling and AI friendly. Use Camel
CLI to normalize existing routes: camel validate normalize <file>",
"sourceType": "org.apache.camel.main.DefaultConfigurationProperties", "type":
"boolean", "javaType": "boolean", "d [...]
+ { "name": "camel.cluster.consul.aclToken", "required": false,
"description": "Sets the ACL token to be used with Consul", "sourceType":
"org.apache.camel.component.consul.cluster.ConsulClusterService", "type":
"string", "javaType": "java.lang.String", "secret": true, "security": "secret"
},
+ { "name": "camel.cluster.consul.blockSeconds", "required": false,
"description": "The second to wait for a watch event, default 10 seconds",
"sourceType": "org.apache.camel.component.consul.cluster.ConsulClusterService",
"type": "integer", "javaType": "int", "defaultValue": 10, "secret": false },
+ { "name": "camel.cluster.consul.configuration", "required": false,
"description": "To use an existing configuration", "sourceType":
"org.apache.camel.component.consul.cluster.ConsulClusterService", "type":
"object", "javaType":
"org.apache.camel.component.consul.cluster.ConsulClusterConfiguration",
"secret": false },
+ { "name": "camel.cluster.consul.connectTimeout", "required": false,
"description": "Connect timeout in millis", "sourceType":
"org.apache.camel.component.consul.cluster.ConsulClusterService", "type":
"integer", "javaType": "int", "secret": false },
+ { "name": "camel.cluster.consul.datacenter", "required": false,
"description": "The data center", "sourceType":
"org.apache.camel.component.consul.cluster.ConsulClusterService", "type":
"string", "javaType": "java.lang.String", "secret": false },
+ { "name": "camel.cluster.consul.enabled", "required": false,
"description": "Whether to enable this cluster service.", "sourceType":
"org.apache.camel.component.consul.cluster.ConsulClusterService", "type":
"boolean", "javaType": "boolean", "defaultValue": true, "secret": false },
+ { "name": "camel.cluster.consul.id", "required": true, "description":
"Client id registered as _consul.service.registry.id", "sourceType":
"org.apache.camel.component.consul.cluster.ConsulClusterService", "type":
"string", "javaType": "java.lang.String", "secret": false },
+ { "name": "camel.cluster.consul.password", "required": false,
"description": "Sets the password to be used for basic authentication",
"sourceType": "org.apache.camel.component.consul.cluster.ConsulClusterService",
"type": "string", "javaType": "java.lang.String", "secret": true, "security":
"secret" },
+ { "name": "camel.cluster.consul.readTimeout", "required": false,
"description": "Read timeout in millis", "sourceType":
"org.apache.camel.component.consul.cluster.ConsulClusterService", "type":
"integer", "javaType": "int", "secret": false },
+ { "name": "camel.cluster.consul.rootPath", "required": false,
"description": "The Consul cluster root directory path", "sourceType":
"org.apache.camel.component.consul.cluster.ConsulClusterService", "type":
"string", "javaType": "java.lang.String", "defaultValue": "\/camel", "secret":
false },
+ { "name": "camel.cluster.consul.sessionLockDelay", "required": false,
"description": "Session lock delay in seconds", "sourceType":
"org.apache.camel.component.consul.cluster.ConsulClusterService", "type":
"integer", "javaType": "int", "defaultValue": 5, "secret": false },
+ { "name": "camel.cluster.consul.sessionRefreshInterval", "required":
false, "description": "Session refresh interval in seconds", "sourceType":
"org.apache.camel.component.consul.cluster.ConsulClusterService", "type":
"integer", "javaType": "int", "defaultValue": 5, "secret": false },
+ { "name": "camel.cluster.consul.sessionTtl", "required": false,
"description": "Session time to live in seconds", "sourceType":
"org.apache.camel.component.consul.cluster.ConsulClusterService", "type":
"integer", "javaType": "int", "defaultValue": 60, "secret": false },
+ { "name": "camel.cluster.consul.sslContextParameters", "required": false,
"description": "SSL configuration for advanced security configuration",
"sourceType": "org.apache.camel.component.consul.cluster.ConsulClusterService",
"type": "object", "javaType":
"org.apache.camel.support.jsse.SSLContextParameters", "secret": false },
+ { "name": "camel.cluster.consul.url", "required": false, "description":
"The Consul agent URL", "sourceType":
"org.apache.camel.component.consul.cluster.ConsulClusterService", "type":
"string", "javaType": "java.lang.String", "secret": false },
+ { "name": "camel.cluster.consul.userName", "required": false,
"description": "Sets the username to be used for basic authentication",
"sourceType": "org.apache.camel.component.consul.cluster.ConsulClusterService",
"type": "string", "javaType": "java.lang.String", "secret": true, "security":
"secret" },
+ { "name": "camel.cluster.consul.writeTimeout", "required": false,
"description": "Write timeout in mills", "sourceType":
"org.apache.camel.component.consul.cluster.ConsulClusterService", "type":
"integer", "javaType": "int", "secret": false },
+ { "name": "camel.cluster.file.acquireLockDelay", "required": false,
"description": "The time to wait before starting to try to acquire the cluster
lock. Note that if FileLockClusterService determines no cluster members are
running or cannot reliably determine the cluster state, the initial delay is
computed from the acquireLockInterval.", "sourceType":
"org.apache.camel.component.file.cluster.FileLockClusterService", "type":
"integer", "javaType": "long", "defaultValue": 1, "secret": [...]
+ { "name": "camel.cluster.file.acquireLockDelayUnit", "required": false,
"description": "The time unit for the acquireLockDelay", "sourceType":
"org.apache.camel.component.file.cluster.FileLockClusterService", "type":
"object", "javaType": "java.util.concurrent.TimeUnit", "defaultValue":
"SECONDS", "secret": false },
+ { "name": "camel.cluster.file.acquireLockInterval", "required": false,
"description": "The time to wait between attempts to try to acquire the cluster
lock evaluated using wall-clock time. All cluster members must use the same
value so leadership checks and leader liveness detection remain consistent.",
"sourceType": "org.apache.camel.component.file.cluster.FileLockClusterService",
"type": "integer", "javaType": "long", "defaultValue": 10, "secret": false },
+ { "name": "camel.cluster.file.acquireLockIntervalUnit", "required": false,
"description": "The time unit for the acquireLockInterval", "sourceType":
"org.apache.camel.component.file.cluster.FileLockClusterService", "type":
"object", "javaType": "java.util.concurrent.TimeUnit", "defaultValue":
"SECONDS", "secret": false },
+ { "name": "camel.cluster.file.clusterDataTaskMaxAttempts", "required":
false, "description": "Sets how many times a cluster data task will run,
counting both the first execution and subsequent retries in case of failure or
timeout. The default is 5 attempts. This can be useful when the cluster data
root is on network based file storage, where I\/O operations may occasionally
block for long or unpredictable periods.", "sourceType":
"org.apache.camel.component.file.cluster.FileLockClus [...]
+ { "name": "camel.cluster.file.clusterDataTaskTimeout", "required": false,
"description": "Sets the timeout for a cluster data task (reading or writing
cluster data). The default is 10 seconds. Timeouts are useful when the cluster
data root is on network storage, where I\/O operations may occasionally block
for long or unpredictable periods.", "sourceType":
"org.apache.camel.component.file.cluster.FileLockClusterService", "type":
"integer", "javaType": "long", "defaultValue": 10, "sec [...]
+ { "name": "camel.cluster.file.clusterDataTaskTimeoutUnit", "required":
false, "description": "The time unit for the clusterDataTaskTimeoutUnit",
"sourceType": "org.apache.camel.component.file.cluster.FileLockClusterService",
"type": "object", "javaType": "java.util.concurrent.TimeUnit", "defaultValue":
"SECONDS", "secret": false },
+ { "name": "camel.cluster.file.enabled", "required": false, "description":
"Whether to enable this cluster service.", "sourceType":
"org.apache.camel.component.file.cluster.FileLockClusterService", "type":
"boolean", "javaType": "boolean", "defaultValue": true, "secret": false },
+ { "name": "camel.cluster.file.heartbeatTimeoutMultiplier", "required":
false, "description": "Multiplier applied to the cluster leader
acquireLockInterval to determine how long followers should wait before
considering the leader stale. For example, if the leader updates its heartbeat
every 2 seconds and the heartbeatTimeoutMultiplier is 3, followers will
tolerate up to 2s * 3 = 6s of silence before declaring the leader
unavailable.", "sourceType": "org.apache.camel.component.file.clu [...]
+ { "name": "camel.cluster.file.root", "required": true, "description": "The
root file path", "sourceType":
"org.apache.camel.component.file.cluster.FileLockClusterService", "type":
"string", "javaType": "java.lang.String", "secret": false },
+ { "name": "camel.cluster.infinispan.cacheContainer", "required": false,
"description": "Specifies the cache Container to connect", "sourceType":
"org.apache.camel.component.infinispan.remote.cluster.InfinispanRemoteClusterService",
"type": "object", "javaType":
"org.infinispan.client.hotrod.RemoteCacheManager", "secret": false },
+ { "name": "camel.cluster.infinispan.cacheContainerConfiguration",
"required": false, "description": "The CacheContainer configuration. Used if
the cacheContainer is not defined.", "sourceType":
"org.apache.camel.component.infinispan.remote.cluster.InfinispanRemoteClusterService",
"type": "object", "javaType":
"org.infinispan.client.hotrod.configuration.Configuration", "secret": false },
+ { "name": "camel.cluster.infinispan.configuration", "required": false,
"description": "To use an existing configuration", "sourceType":
"org.apache.camel.component.infinispan.remote.cluster.InfinispanRemoteClusterService",
"type": "object", "javaType":
"org.apache.camel.component.infinispan.remote.cluster.InfinispanRemoteClusterConfiguration",
"secret": false },
+ { "name": "camel.cluster.infinispan.configurationProperties", "required":
false, "description": "Implementation specific properties for the
CacheManager", "sourceType":
"org.apache.camel.component.infinispan.remote.cluster.InfinispanRemoteClusterService",
"type": "object", "javaType": "java.util.Map", "secret": false },
+ { "name": "camel.cluster.infinispan.configurationUri", "required": false,
"description": "An implementation specific URI for the CacheManager",
"sourceType":
"org.apache.camel.component.infinispan.remote.cluster.InfinispanRemoteClusterService",
"type": "string", "javaType": "java.lang.String", "secret": false },
+ { "name": "camel.cluster.infinispan.enabled", "required": false,
"description": "Whether to enable this cluster service.", "sourceType":
"org.apache.camel.component.infinispan.remote.cluster.InfinispanRemoteClusterService",
"type": "boolean", "javaType": "boolean", "defaultValue": true, "secret":
false },
+ { "name": "camel.cluster.infinispan.hosts", "required": false,
"description": "Specifies the host of the cache on Infinispan instance.
Multiple hosts can be separated by semicolon.", "sourceType":
"org.apache.camel.component.infinispan.remote.cluster.InfinispanRemoteClusterService",
"type": "string", "javaType": "java.lang.String", "secret": false },
+ { "name": "camel.cluster.infinispan.id", "required": true, "description":
"Node id", "sourceType":
"org.apache.camel.component.infinispan.remote.cluster.InfinispanRemoteClusterService",
"type": "string", "javaType": "java.lang.String", "secret": false },
+ { "name": "camel.cluster.infinispan.lifespan", "required": false,
"description": "The lifespan of the cache entry for the local cluster member
registered to the inventory", "sourceType":
"org.apache.camel.component.infinispan.remote.cluster.InfinispanRemoteClusterService",
"type": "integer", "javaType": "long", "defaultValue": 30, "secret": false },
+ { "name": "camel.cluster.infinispan.lifespanTimeUnit", "required": false,
"description": "The TimeUnit of the lifespan", "sourceType":
"org.apache.camel.component.infinispan.remote.cluster.InfinispanRemoteClusterService",
"type": "object", "javaType": "java.util.concurrent.TimeUnit", "defaultValue":
"SECONDS", "secret": false },
+ { "name": "camel.cluster.infinispan.password", "required": false,
"description": "Define the password to access the infinispan instance",
"sourceType":
"org.apache.camel.component.infinispan.remote.cluster.InfinispanRemoteClusterService",
"type": "string", "javaType": "java.lang.String", "secret": true, "security":
"secret" },
+ { "name": "camel.cluster.infinispan.saslMechanism", "required": false,
"description": "Define the SASL Mechanism to access the infinispan instance",
"sourceType":
"org.apache.camel.component.infinispan.remote.cluster.InfinispanRemoteClusterService",
"type": "string", "javaType": "java.lang.String", "secret": false },
+ { "name": "camel.cluster.infinispan.secure", "required": false,
"description": "Define if we are connecting to a secured Infinispan instance",
"sourceType":
"org.apache.camel.component.infinispan.remote.cluster.InfinispanRemoteClusterService",
"type": "boolean", "javaType": "boolean", "defaultValue": false, "secret":
false },
+ { "name": "camel.cluster.infinispan.securityRealm", "required": false,
"description": "Define the security realm to access the infinispan instance",
"sourceType":
"org.apache.camel.component.infinispan.remote.cluster.InfinispanRemoteClusterService",
"type": "string", "javaType": "java.lang.String", "secret": false },
+ { "name": "camel.cluster.infinispan.securityServerName", "required":
false, "description": "Define the security server name to access the infinispan
instance", "sourceType":
"org.apache.camel.component.infinispan.remote.cluster.InfinispanRemoteClusterService",
"type": "string", "javaType": "java.lang.String", "secret": false },
+ { "name": "camel.cluster.infinispan.username", "required": false,
"description": "Define the username to access the infinispan instance",
"sourceType":
"org.apache.camel.component.infinispan.remote.cluster.InfinispanRemoteClusterService",
"type": "string", "javaType": "java.lang.String", "secret": false },
+ { "name": "camel.cluster.jgroups-raft.enabled", "required": false,
"description": "Whether to enable this cluster service.", "sourceType":
"org.apache.camel.component.jgroups.raft.cluster.JGroupsRaftClusterService",
"type": "boolean", "javaType": "boolean", "defaultValue": true, "secret": false
},
+ { "name": "camel.cluster.jgroups-raft.id", "required": true,
"description": "Unique Raft id", "sourceType":
"org.apache.camel.component.jgroups.raft.cluster.JGroupsRaftClusterService",
"type": "string", "javaType": "java.lang.String", "secret": false },
+ { "name": "camel.cluster.jgroups-raft.jgroupsClusterName", "required":
false, "description": "The name of the cluster", "sourceType":
"org.apache.camel.component.jgroups.raft.cluster.JGroupsRaftClusterService",
"type": "string", "javaType": "java.lang.String", "defaultValue":
"jgroupsraft-master", "secret": false },
+ { "name": "camel.cluster.jgroups-raft.jgroupsConfig", "required": false,
"description": "The path to the JGroups Raft configuration", "sourceType":
"org.apache.camel.component.jgroups.raft.cluster.JGroupsRaftClusterService",
"type": "string", "javaType": "java.lang.String", "defaultValue": "raft.xml",
"secret": false },
+ { "name": "camel.cluster.jgroups-raft.raftHandle", "required": false,
"description": "To use a custom RaftHandler", "sourceType":
"org.apache.camel.component.jgroups.raft.cluster.JGroupsRaftClusterService",
"type": "object", "javaType": "org.jgroups.raft.RaftHandle", "secret": false },
+ { "name": "camel.cluster.kubernetes.clusterLabels", "required": false,
"description": "Labels used to identify the members of the cluster.",
"sourceType":
"org.apache.camel.component.kubernetes.cluster.KubernetesClusterService",
"type": "object", "javaType": "java.util.Map", "secret": false, "deprecated":
true },
+ { "name": "camel.cluster.kubernetes.configuration", "required": false,
"description": "To use an existing configuration for Kubernetes", "sourceType":
"org.apache.camel.component.kubernetes.cluster.KubernetesClusterService",
"type": "object", "javaType":
"org.apache.camel.component.kubernetes.KubernetesConfiguration", "secret":
false, "deprecated": true },
+ { "name": "camel.cluster.kubernetes.connectionTimeout", "required": false,
"description": "Connection timeout in milliseconds to use when making requests
to the Kubernetes API server.", "sourceType":
"org.apache.camel.component.kubernetes.cluster.KubernetesClusterService",
"type": "integer", "javaType": "java.lang.Integer", "secret": false,
"deprecated": true },
+ { "name": "camel.cluster.kubernetes.enabled", "required": false,
"description": "Whether to enable this cluster service.", "sourceType":
"org.apache.camel.component.kubernetes.cluster.KubernetesClusterService",
"type": "boolean", "javaType": "boolean", "defaultValue": true, "secret": false
},
+ { "name": "camel.cluster.kubernetes.groupName", "required": false,
"description": "Name of the lock group (or namespace according to the Camel
cluster convention) within the chosen ConfigMap.", "sourceType":
"org.apache.camel.component.kubernetes.cluster.KubernetesClusterService",
"type": "string", "javaType": "java.lang.String", "secret": false,
"deprecated": true },
+ { "name": "camel.cluster.kubernetes.jitterFactor", "required": false,
"description": "A jitter factor to apply in order to prevent all pods to call
Kubernetes APIs in the same instant.", "sourceType":
"org.apache.camel.component.kubernetes.cluster.KubernetesClusterService",
"type": "number", "javaType": "double", "defaultValue": "1.2", "secret": false,
"deprecated": true },
+ { "name": "camel.cluster.kubernetes.kubernetesResourceName", "required":
false, "description": "Name of the resource used for locking (or prefix, in
case multiple ones are used).", "sourceType":
"org.apache.camel.component.kubernetes.cluster.KubernetesClusterService",
"type": "string", "javaType": "java.lang.String", "defaultValue": "leaders",
"secret": false, "deprecated": true },
+ { "name": "camel.cluster.kubernetes.kubernetesResourcesNamespace",
"required": false, "description": "Kubernetes namespace containing the pods and
the ConfigMap used for locking.", "sourceType":
"org.apache.camel.component.kubernetes.cluster.KubernetesClusterService",
"type": "string", "javaType": "java.lang.String", "secret": false,
"deprecated": true },
+ { "name": "camel.cluster.kubernetes.leaseDurationMillis", "required":
false, "description": "The default duration of the lease for the current
leader.", "sourceType":
"org.apache.camel.component.kubernetes.cluster.KubernetesClusterService",
"type": "integer", "javaType": "long", "defaultValue": 15000, "secret": false,
"deprecated": true },
+ { "name": "camel.cluster.kubernetes.leaseResourceType", "required": false,
"description": "Kubernetes resource type used to hold the leases.",
"sourceType":
"org.apache.camel.component.kubernetes.cluster.KubernetesClusterService",
"type": "object", "javaType":
"org.apache.camel.component.kubernetes.cluster.LeaseResourceType",
"defaultValue": "Lease", "secret": false, "deprecated": true },
+ { "name": "camel.cluster.kubernetes.masterUrl", "required": false,
"description": "URL to a remote Kubernetes API server. This should only be used
when your Camel application is connecting from outside Kubernetes. If you run
your Camel application inside Kubernetes, then you can use local or client as
the URL to tell Camel to run in local mode. If you connect remotely to
Kubernetes, then you may also need some of the many other configuration options
for secured connection with certif [...]
+ { "name": "camel.cluster.kubernetes.namespace", "required": false,
"description": "Kubernetes namespace", "sourceType":
"org.apache.camel.component.kubernetes.cluster.KubernetesClusterService",
"type": "string", "javaType": "java.lang.String", "secret": false,
"deprecated": true },
+ { "name": "camel.cluster.kubernetes.podName", "required": false,
"description": "Name of the current pod (defaults to host name).",
"sourceType":
"org.apache.camel.component.kubernetes.cluster.KubernetesClusterService",
"type": "string", "javaType": "java.lang.String", "secret": false,
"deprecated": true },
+ { "name": "camel.cluster.kubernetes.renewDeadlineMillis", "required":
false, "description": "The deadline after which the leader must stop its
services because it may have lost the leadership.", "sourceType":
"org.apache.camel.component.kubernetes.cluster.KubernetesClusterService",
"type": "integer", "javaType": "long", "defaultValue": 10000, "secret": false,
"deprecated": true },
+ { "name": "camel.cluster.kubernetes.retryPeriodMillis", "required": false,
"description": "The time between two subsequent attempts to check and acquire
the leadership. It is randomized using the jitter factor.", "sourceType":
"org.apache.camel.component.kubernetes.cluster.KubernetesClusterService",
"type": "integer", "javaType": "long", "defaultValue": 2000, "secret": false,
"deprecated": true },
+ { "name": "camel.cluster.zookeeper.basePath", "required": true,
"description": "The base path to store in ZooKeeper", "sourceType":
"org.apache.camel.component.zookeeper.cluster.ZooKeeperClusterService", "type":
"string", "javaType": "java.lang.String", "secret": false },
+ { "name": "camel.cluster.zookeeper.connectTimeout", "required": false,
"description": "Connect timeout (millis)", "sourceType":
"org.apache.camel.component.zookeeper.cluster.ZooKeeperClusterService", "type":
"integer", "javaType": "long", "defaultValue": 15000, "secret": false },
+ { "name": "camel.cluster.zookeeper.enabled", "required": false,
"description": "Whether to enable this cluster service.", "sourceType":
"org.apache.camel.component.zookeeper.cluster.ZooKeeperClusterService", "type":
"boolean", "javaType": "boolean", "defaultValue": true, "secret": false },
+ { "name": "camel.cluster.zookeeper.id", "required": true, "description":
"Node id", "sourceType":
"org.apache.camel.component.zookeeper.cluster.ZooKeeperClusterService", "type":
"string", "javaType": "java.lang.String", "secret": false },
+ { "name": "camel.cluster.zookeeper.maxCloseWait", "required": false,
"description": "Time to wait (millis) during close to join background threads",
"sourceType":
"org.apache.camel.component.zookeeper.cluster.ZooKeeperClusterService", "type":
"integer", "javaType": "long", "defaultValue": 1000, "secret": false },
+ { "name": "camel.cluster.zookeeper.namespace", "required": false,
"description": "ZooKeeper namespace. If a namespace is set here, all paths will
get pre-pended with the namespace", "sourceType":
"org.apache.camel.component.zookeeper.cluster.ZooKeeperClusterService", "type":
"string", "javaType": "java.lang.String", "secret": false },
+ { "name": "camel.cluster.zookeeper.nodes", "required": true,
"description": "The Zookeeper server hosts (multiple servers can be separated
by comma)", "sourceType":
"org.apache.camel.component.zookeeper.cluster.ZooKeeperClusterService", "type":
"string", "javaType": "java.lang.String", "secret": false },
+ { "name": "camel.cluster.zookeeper.reconnectBaseSleepTime", "required":
false, "description": "Initial amount of time (millis) to wait between
retries", "sourceType":
"org.apache.camel.component.zookeeper.cluster.ZooKeeperClusterService", "type":
"integer", "javaType": "long", "defaultValue": 1000, "secret": false },
+ { "name": "camel.cluster.zookeeper.reconnectMaxRetries", "required":
false, "description": "Max number of times to retry", "sourceType":
"org.apache.camel.component.zookeeper.cluster.ZooKeeperClusterService", "type":
"integer", "javaType": "int", "defaultValue": 3, "secret": false },
+ { "name": "camel.cluster.zookeeper.reconnectMaxSleepTime", "required":
false, "description": "Max time (millis) to sleep on each retry", "sourceType":
"org.apache.camel.component.zookeeper.cluster.ZooKeeperClusterService", "type":
"integer", "javaType": "long", "secret": false },
+ { "name": "camel.cluster.zookeeper.retryPolicy", "required": false,
"description": "To use a custom retry policy implementation", "sourceType":
"org.apache.camel.component.zookeeper.cluster.ZooKeeperClusterService", "type":
"object", "javaType": "org.apache.curator.RetryPolicy", "secret": false },
+ { "name": "camel.cluster.zookeeper.sessionTimeout", "required": false,
"description": "Session timeout (millis)", "sourceType":
"org.apache.camel.component.zookeeper.cluster.ZooKeeperClusterService", "type":
"integer", "javaType": "long", "defaultValue": 60000, "secret": false },
{ "name": "camel.debug.bodyIncludeFiles", "required": false,
"description": "Whether to include the message body of file based messages. The
overhead is that the file content has to be read from the file.", "sourceType":
"org.apache.camel.main.DebuggerConfigurationProperties", "type": "boolean",
"javaType": "boolean", "defaultValue": true, "secret": false },
{ "name": "camel.debug.bodyIncludeStreams", "required": false,
"description": "Whether to include the message body of stream based messages.
If enabled then beware the stream may not be re-readable later. See more about
Stream Caching.", "sourceType":
"org.apache.camel.main.DebuggerConfigurationProperties", "type": "boolean",
"javaType": "boolean", "defaultValue": false, "secret": false },
{ "name": "camel.debug.bodyMaxChars", "required": false, "description":
"To limit the message body to a maximum size in the traced message. Use 0 or
negative value to use unlimited size.", "sourceType":
"org.apache.camel.main.DebuggerConfigurationProperties", "type": "integer",
"javaType": "int", "defaultValue": 32768, "secret": false },
diff --git a/core/camel-main/src/main/docs/main.adoc
b/core/camel-main/src/main/docs/main.adoc
index 3af1204ab2bc..20d29d34c351 100644
--- a/core/camel-main/src/main/docs/main.adoc
+++ b/core/camel-main/src/main/docs/main.adoc
@@ -734,6 +734,135 @@ The camel.errorRegistry supports 8 options, which are
listed below.
| *camel.errorRegistry.maximumEntries* | The maximum number of error entries
to keep in the registry. When the limit is exceeded, the oldest entries are
evicted. | 100 | int
| *camel.errorRegistry.timeToLiveSeconds* | The time-to-live in seconds for
error entries. Entries older than this are evicted. The default value is 0
(disabled). | 0 | int
|===
+
+
+=== Camel File Cluster Service configurations
+The camel.cluster.file supports 10 options, which are listed below.
+
+[width="100%",cols="2,5,^1,2",options="header"]
+|===
+| Name | Description | Default | Type
+| *camel.cluster.file.acquireLockDelay* | The time to wait before starting to
try to acquire the cluster lock. Note that if FileLockClusterService determines
no cluster members are running or cannot reliably determine the cluster state,
the initial delay is computed from the acquireLockInterval. | 1 | long
+| *camel.cluster.file.acquireLockDelayUnit* | The time unit for the
acquireLockDelay | SECONDS | TimeUnit
+| *camel.cluster.file.acquireLockInterval* | The time to wait between attempts
to try to acquire the cluster lock evaluated using wall-clock time. All cluster
members must use the same value so leadership checks and leader liveness
detection remain consistent. | 10 | long
+| *camel.cluster.file.acquireLockIntervalUnit* | The time unit for the
acquireLockInterval | SECONDS | TimeUnit
+| *camel.cluster.file.clusterDataTaskMaxAttempts* | Sets how many times a
cluster data task will run, counting both the first execution and subsequent
retries in case of failure or timeout. The default is 5 attempts. This can be
useful when the cluster data root is on network based file storage, where I/O
operations may occasionally block for long or unpredictable periods. | 5 | int
+| *camel.cluster.file.clusterDataTaskTimeout* | Sets the timeout for a cluster
data task (reading or writing cluster data). The default is 10 seconds.
Timeouts are useful when the cluster data root is on network storage, where I/O
operations may occasionally block for long or unpredictable periods. | 10 | long
+| *camel.cluster.file.clusterDataTaskTimeoutUnit* | The time unit for the
clusterDataTaskTimeoutUnit | SECONDS | TimeUnit
+| *camel.cluster.file.enabled* | Whether to enable this cluster service. |
true | boolean
+| *camel.cluster.file.heartbeatTimeoutMultiplier* | Multiplier applied to the
cluster leader acquireLockInterval to determine how long followers should wait
before considering the leader stale. For example, if the leader updates its
heartbeat every 2 seconds and the heartbeatTimeoutMultiplier is 3, followers
will tolerate up to 2s * 3 = 6s of silence before declaring the leader
unavailable. | 5 | int
+| *camel.cluster.file.root* | The root file path | | String
+|===
+
+
+=== Camel Kubernetes Cluster Service configurations
+The camel.cluster.kubernetes supports 15 options, which are listed below.
+
+[width="100%",cols="2,5,^1,2",options="header"]
+|===
+| Name | Description | Default | Type
+| *camel.cluster.kubernetes.clusterLabels* | Labels used to identify the
members of the cluster. | | Map
+| *camel.cluster.kubernetes.configuration* | To use an existing configuration
for Kubernetes | | KubernetesConfiguration
+| *camel.cluster.kubernetes.connectionTimeout* | Connection timeout in
milliseconds to use when making requests to the Kubernetes API server. | |
Integer
+| *camel.cluster.kubernetes.enabled* | Whether to enable this cluster service.
| true | boolean
+| *camel.cluster.kubernetes.groupName* | Name of the lock group (or namespace
according to the Camel cluster convention) within the chosen ConfigMap. | |
String
+| *camel.cluster.kubernetes.jitterFactor* | A jitter factor to apply in order
to prevent all pods to call Kubernetes APIs in the same instant. | 1.2 | double
+| *camel.cluster.kubernetes.kubernetesResourceName* | Name of the resource
used for locking (or prefix, in case multiple ones are used). | leaders | String
+| *camel.cluster.kubernetes.kubernetesResourcesNamespace* | Kubernetes
namespace containing the pods and the ConfigMap used for locking. | | String
+| *camel.cluster.kubernetes.leaseDurationMillis* | The default duration of the
lease for the current leader. | 15000 | long
+| *camel.cluster.kubernetes.leaseResourceType* | Kubernetes resource type used
to hold the leases. | Lease | LeaseResourceType
+| *camel.cluster.kubernetes.masterUrl* | URL to a remote Kubernetes API
server. This should only be used when your Camel application is connecting from
outside Kubernetes. If you run your Camel application inside Kubernetes, then
you can use local or client as the URL to tell Camel to run in local mode. If
you connect remotely to Kubernetes, then you may also need some of the many
other configuration options for secured connection with certificates, etc. | |
String
+| *camel.cluster.kubernetes.namespace* | Kubernetes namespace | | String
+| *camel.cluster.kubernetes.podName* | Name of the current pod (defaults to
host name). | | String
+| *camel.cluster.kubernetes.renewDeadlineMillis* | The deadline after which
the leader must stop its services because it may have lost the leadership. |
10000 | long
+| *camel.cluster.kubernetes.retryPeriodMillis* | The time between two
subsequent attempts to check and acquire the leadership. It is randomized using
the jitter factor. | 2000 | long
+|===
+
+
+=== Camel ZooKeeper Cluster Service configurations
+The camel.cluster.zookeeper supports 12 options, which are listed below.
+
+[width="100%",cols="2,5,^1,2",options="header"]
+|===
+| Name | Description | Default | Type
+| *camel.cluster.zookeeper.basePath* | The base path to store in ZooKeeper |
| String
+| *camel.cluster.zookeeper.connectTimeout* | Connect timeout (millis) | 15000
| long
+| *camel.cluster.zookeeper.enabled* | Whether to enable this cluster service.
| true | boolean
+| *camel.cluster.zookeeper.id* | Node id | | String
+| *camel.cluster.zookeeper.maxCloseWait* | Time to wait (millis) during close
to join background threads | 1000 | long
+| *camel.cluster.zookeeper.namespace* | ZooKeeper namespace. If a namespace is
set here, all paths will get pre-pended with the namespace | | String
+| *camel.cluster.zookeeper.nodes* | The Zookeeper server hosts (multiple
servers can be separated by comma) | | String
+| *camel.cluster.zookeeper.reconnectBaseSleepTime* | Initial amount of time
(millis) to wait between retries | 1000 | long
+| *camel.cluster.zookeeper.reconnectMaxRetries* | Max number of times to retry
| 3 | int
+| *camel.cluster.zookeeper.reconnectMaxSleepTime* | Max time (millis) to sleep
on each retry | | long
+| *camel.cluster.zookeeper.retryPolicy* | To use a custom retry policy
implementation | | RetryPolicy
+| *camel.cluster.zookeeper.sessionTimeout* | Session timeout (millis) | 60000
| long
+|===
+
+
+=== Camel Consul Cluster Service configurations
+The camel.cluster.consul supports 17 options, which are listed below.
+
+[width="100%",cols="2,5,^1,2",options="header"]
+|===
+| Name | Description | Default | Type
+| *camel.cluster.consul.aclToken* | Sets the ACL token to be used with Consul
| | String
+| *camel.cluster.consul.blockSeconds* | The second to wait for a watch event,
default 10 seconds | 10 | int
+| *camel.cluster.consul.configuration* | To use an existing configuration | |
ConsulClusterConfiguration
+| *camel.cluster.consul.connectTimeout* | Connect timeout in millis | | int
+| *camel.cluster.consul.datacenter* | The data center | | String
+| *camel.cluster.consul.enabled* | Whether to enable this cluster service. |
true | boolean
+| *camel.cluster.consul.id* | Client id registered as
_consul.service.registry.id | | String
+| *camel.cluster.consul.password* | Sets the password to be used for basic
authentication | | String
+| *camel.cluster.consul.readTimeout* | Read timeout in millis | | int
+| *camel.cluster.consul.rootPath* | The Consul cluster root directory path |
/camel | String
+| *camel.cluster.consul.sessionLockDelay* | Session lock delay in seconds | 5
| int
+| *camel.cluster.consul.sessionRefreshInterval* | Session refresh interval in
seconds | 5 | int
+| *camel.cluster.consul.sessionTtl* | Session time to live in seconds | 60 |
int
+| *camel.cluster.consul.sslContextParameters* | SSL configuration for advanced
security configuration | | SSLContextParameters
+| *camel.cluster.consul.url* | The Consul agent URL | | String
+| *camel.cluster.consul.userName* | Sets the username to be used for basic
authentication | | String
+| *camel.cluster.consul.writeTimeout* | Write timeout in mills | | int
+|===
+
+
+=== Camel JGroups Raft Cluster Service configurations
+The camel.cluster.jgroups-raft supports 5 options, which are listed below.
+
+[width="100%",cols="2,5,^1,2",options="header"]
+|===
+| Name | Description | Default | Type
+| *camel.cluster.jgroups-raft.enabled* | Whether to enable this cluster
service. | true | boolean
+| *camel.cluster.jgroups-raft.id* | Unique Raft id | | String
+| *camel.cluster.jgroups-raft.jgroupsClusterName* | The name of the cluster |
jgroupsraft-master | String
+| *camel.cluster.jgroups-raft.jgroupsConfig* | The path to the JGroups Raft
configuration | raft.xml | String
+| *camel.cluster.jgroups-raft.raftHandle* | To use a custom RaftHandler | |
RaftHandle
+|===
+
+
+=== Camel Infinispan Remote Cluster Service configurations
+The camel.cluster.infinispan supports 16 options, which are listed below.
+
+[width="100%",cols="2,5,^1,2",options="header"]
+|===
+| Name | Description | Default | Type
+| *camel.cluster.infinispan.cacheContainer* | Specifies the cache Container to
connect | | RemoteCacheManager
+| *camel.cluster.infinispan.cacheContainerConfiguration* | The CacheContainer
configuration. Used if the cacheContainer is not defined. | | Configuration
+| *camel.cluster.infinispan.configuration* | To use an existing configuration
| | InfinispanRemoteClusterConfiguration
+| *camel.cluster.infinispan.configurationProperties* | Implementation specific
properties for the CacheManager | | Map
+| *camel.cluster.infinispan.configurationUri* | An implementation specific URI
for the CacheManager | | String
+| *camel.cluster.infinispan.enabled* | Whether to enable this cluster service.
| true | boolean
+| *camel.cluster.infinispan.hosts* | Specifies the host of the cache on
Infinispan instance. Multiple hosts can be separated by semicolon. | | String
+| *camel.cluster.infinispan.id* | Node id | | String
+| *camel.cluster.infinispan.lifespan* | The lifespan of the cache entry for
the local cluster member registered to the inventory | 30 | long
+| *camel.cluster.infinispan.lifespanTimeUnit* | The TimeUnit of the lifespan |
SECONDS | TimeUnit
+| *camel.cluster.infinispan.password* | Define the password to access the
infinispan instance | | String
+| *camel.cluster.infinispan.saslMechanism* | Define the SASL Mechanism to
access the infinispan instance | | String
+| *camel.cluster.infinispan.secure* | Define if we are connecting to a secured
Infinispan instance | false | boolean
+| *camel.cluster.infinispan.securityRealm* | Define the security realm to
access the infinispan instance | | String
+| *camel.cluster.infinispan.securityServerName* | Define the security server
name to access the infinispan instance | | String
+| *camel.cluster.infinispan.username* | Define the username to access the
infinispan instance | | String
+|===
// main options: END
== Package Scanning
diff --git
a/core/camel-main/src/main/java/org/apache/camel/main/BaseMainSupport.java
b/core/camel-main/src/main/java/org/apache/camel/main/BaseMainSupport.java
index d0b745a39c09..b933427bf2c7 100644
--- a/core/camel-main/src/main/java/org/apache/camel/main/BaseMainSupport.java
+++ b/core/camel-main/src/main/java/org/apache/camel/main/BaseMainSupport.java
@@ -54,6 +54,7 @@ import org.apache.camel.PropertiesLookupListener;
import org.apache.camel.RuntimeCamelException;
import org.apache.camel.Service;
import org.apache.camel.StartupStep;
+import org.apache.camel.cluster.CamelClusterService;
import org.apache.camel.console.DevConsole;
import org.apache.camel.console.DevConsoleRegistry;
import org.apache.camel.health.HealthCheck;
@@ -153,7 +154,7 @@ public abstract class BaseMainSupport extends BaseService {
private static final String[] GROUP_PREFIXES = new String[] {
"camel.context.", "camel.resilience4j.", "camel.faulttolerance.",
"camel.rest.", "camel.vault.", "camel.threadpool.",
"camel.health.",
- "camel.lra.", "camel.opentelemetry2.", "camel.opentelemetry.",
+ "camel.lra.", "camel.cluster.", "camel.opentelemetry2.",
"camel.opentelemetry.",
"camel.telemetryDev.", "camel.management.", "camel.mdc.",
"camel.metrics.", "camel.routeTemplate",
"camel.devConsole.", "camel.variable.", "camel.beans.",
"camel.globalOptions.",
PREFIX_SERVER, PREFIX_SSL, PREFIX_SECURITY, PREFIX_DEBUG,
PREFIX_TRACE,
@@ -1396,6 +1397,7 @@ public abstract class BaseMainSupport extends BaseService
{
OrderedLocationProperties threadPoolProperties = new
OrderedLocationProperties();
OrderedLocationProperties healthProperties = new
OrderedLocationProperties();
OrderedLocationProperties lraProperties = new
OrderedLocationProperties();
+ OrderedLocationProperties clusterProperties = new
OrderedLocationProperties();
OrderedLocationProperties otelProperties = new
OrderedLocationProperties();
OrderedLocationProperties otel2Properties = new
OrderedLocationProperties();
OrderedLocationProperties mdcProperties = new
OrderedLocationProperties();
@@ -1459,6 +1461,12 @@ public abstract class BaseMainSupport extends
BaseService {
String option = key.substring(10);
validateOptionAndValue(key, option, value);
lraProperties.put(loc, optionKey(option), value);
+ } else if (startsWithIgnoreCase(key, "camel.cluster.")) {
+ // grab the value
+ String value = prop.getProperty(key);
+ String option = key.substring(14);
+ validateOptionAndValue(key, option, value);
+ clusterProperties.put(loc, optionKey(option), value);
} else if (startsWithIgnoreCase(key, "camel.opentelemetry2.")) {
// grab the value
String value = prop.getProperty(key);
@@ -1646,6 +1654,12 @@ public abstract class BaseMainSupport extends
BaseService {
setLraCheckProperties(camelContext, lraProperties,
mainConfigurationProperties.isAutoConfigurationFailFast(),
autoConfiguredProperties);
}
+ if (!clusterProperties.isEmpty()) {
+ LOG.debug("Auto-configuring Cluster Service from loaded
properties: {}", clusterProperties.size());
+ setClusterServiceProperties(camelContext, clusterProperties,
+ mainConfigurationProperties.isAutoConfigurationFailFast(),
+ autoConfiguredProperties);
+ }
if (!otelProperties.isEmpty() ||
mainConfigurationProperties.hasOtelConfiguration()) {
LOG.debug("Auto-configuring OpenTelemetry from loaded properties:
{}", otelProperties.size());
setOtelProperties(camelContext, otelProperties,
mainConfigurationProperties.isAutoConfigurationFailFast(),
@@ -1980,6 +1994,51 @@ public abstract class BaseMainSupport extends
BaseService {
}
}
+ private void setClusterServiceProperties(
+ CamelContext camelContext, OrderedLocationProperties
clusterProperties,
+ boolean failIfNotSet, OrderedLocationProperties
autoConfiguredProperties)
+ throws Exception {
+
+ // group properties by cluster type (first dot-delimited segment)
+ // e.g., "file.root" -> type="file", option="root"
+ Map<String, OrderedLocationProperties> byType = new LinkedHashMap<>();
+ for (String key : clusterProperties.stringPropertyNames()) {
+ String loc = clusterProperties.getLocation(key);
+ String value = clusterProperties.getProperty(key);
+ int dot = key.indexOf('.');
+ if (dot > 0) {
+ String type = key.substring(0, dot);
+ String option = key.substring(dot + 1);
+ byType.computeIfAbsent(type, k -> new
OrderedLocationProperties())
+ .put(loc, optionKey(option), value);
+ }
+ }
+
+ for (Map.Entry<String, OrderedLocationProperties> entry :
byType.entrySet()) {
+ String type = entry.getKey();
+ OrderedLocationProperties typeProperties = entry.getValue();
+
+ String enabledLoc = typeProperties.getLocation("enabled");
+ Object enabledObj = typeProperties.remove("enabled");
+ if (ObjectHelper.isNotEmpty(enabledObj)) {
+ autoConfiguredProperties.put(enabledLoc, "camel.cluster." +
type + ".enabled", enabledObj.toString());
+ }
+ boolean enabled = enabledObj != null ?
CamelContextHelper.parseBoolean(camelContext, enabledObj.toString()) : true;
+ if (enabled) {
+ CamelClusterService css = resolveClusterService(camelContext,
type);
+ setPropertiesOnTarget(camelContext, css, typeProperties,
"camel.cluster." + type + ".", failIfNotSet, true,
+ autoConfiguredProperties);
+ camelContext.addService(css, true, true);
+ }
+ }
+ }
+
+ private static CamelClusterService resolveClusterService(CamelContext
camelContext, String type) throws Exception {
+ String factoryKey = "cluster-service-" + type;
+ return ResolverHelper.resolveMandatoryBootstrapService(
+ camelContext, factoryKey, CamelClusterService.class, "camel-"
+ type);
+ }
+
private void setOtelProperties(
CamelContext camelContext, OrderedLocationProperties
otelProperties,
boolean failIfNotSet, OrderedLocationProperties
autoConfiguredProperties)
diff --git
a/dsl/camel-kamelet-main/src/generated/resources/camel-factoryfinder-known-dependencies.properties
b/dsl/camel-kamelet-main/src/generated/resources/camel-factoryfinder-known-dependencies.properties
index 4b6ae8f81790..dfb61a3383e3 100644
---
a/dsl/camel-kamelet-main/src/generated/resources/camel-factoryfinder-known-dependencies.properties
+++
b/dsl/camel-kamelet-main/src/generated/resources/camel-factoryfinder-known-dependencies.properties
@@ -15,8 +15,15 @@
## limitations under the License.
## ---------------------------------------------------------------------------
+META-INF/services/org/apache/camel/avro-rpc-http-server-factory=camel:avro-rpc-jetty
META-INF/services/org/apache/camel/bean-processor-factory=camel:bean
META-INF/services/org/apache/camel/bean-proxy-factory=camel:bean
+META-INF/services/org/apache/camel/cluster-service-consul=camel:consul
+META-INF/services/org/apache/camel/cluster-service-file=camel:file
+META-INF/services/org/apache/camel/cluster-service-infinispan=camel:infinispan
+META-INF/services/org/apache/camel/cluster-service-jgroups-raft=camel:jgroups-raft
+META-INF/services/org/apache/camel/cluster-service-kubernetes=camel:kubernetes
+META-INF/services/org/apache/camel/cluster-service-zookeeper=camel:zookeeper
META-INF/services/org/apache/camel/csimple-compiler=camel:csimple-joor
META-INF/services/org/apache/camel/debugger-factory=camel:debug
META-INF/services/org/apache/camel/file-adapter-factory=camel:file
@@ -26,24 +33,32 @@
META-INF/services/org/apache/camel/jandex-class-resolver=camel:jandex
META-INF/services/org/apache/camel/jmx-rest-definition-resolver=camel:openapi-java
META-INF/services/org/apache/camel/kafka-adapter-factory=camel:kafka
META-INF/services/org/apache/camel/kafka-resume-strategy=camel:kafka
+META-INF/services/org/apache/camel/kinesis-resume-strategy=camel:aws2-kinesis
META-INF/services/org/apache/camel/lra-saga-service=camel:lra
META-INF/services/org/apache/camel/mdc-service=camel:mdc
META-INF/services/org/apache/camel/micrometer-observability-tracer=camel:micrometer-observability
META-INF/services/org/apache/camel/micrometer-prometheus=camel:micrometer-prometheus
META-INF/services/org/apache/camel/mock-send-to-endpoint-strategy-factory=camel:mock
+META-INF/services/org/apache/camel/model-jaxbcontext-factory-spring=camel:spring-xml
META-INF/services/org/apache/camel/mongodb-adapter-factory=camel:mongodb
META-INF/services/org/apache/camel/mongodb-resume-strategy=camel:mongodb
META-INF/services/org/apache/camel/oauth-client-authentication-factory=camel:oauth
META-INF/services/org/apache/camel/oauth-token-validation-factory=camel:oauth
META-INF/services/org/apache/camel/opentelemetry-tracer-2=camel:opentelemetry2
META-INF/services/org/apache/camel/opentelemetry-tracer=camel:opentelemetry
+META-INF/services/org/apache/camel/periodic-task/aws-secret-refresh=camel:aws-secrets-manager
+META-INF/services/org/apache/camel/periodic-task/azure-secret-refresh=camel:azure-key-vault
+META-INF/services/org/apache/camel/periodic-task/gcp-secret-refresh=camel:google-secret-manager
META-INF/services/org/apache/camel/periodic-task/hashicorp-secret-refresh=camel:hashicorp-vault
+META-INF/services/org/apache/camel/periodic-task/ibm-secret-refresh=camel:ibm-secrets-manager
META-INF/services/org/apache/camel/periodic-task/kubernetes-configmaps-refresh=camel:kubernetes
META-INF/services/org/apache/camel/periodic-task/kubernetes-secret-refresh=camel:kubernetes
+META-INF/services/org/apache/camel/periodic-task/spring-config-refresh=camel:spring-cloud-config
META-INF/services/org/apache/camel/platform-http-engine=camel:platform-http-vertx
META-INF/services/org/apache/camel/platform-http-server=camel:platform-http-main
META-INF/services/org/apache/camel/platform-http/jolokia=camel:platform-http-jolokia
META-INF/services/org/apache/camel/platform-http/plugin-registry=camel:platform-http
+META-INF/services/org/apache/camel/properties-source-factory=camel:microprofile-config
META-INF/services/org/apache/camel/resilience4j-micrometer-factory=camel:resilience4j-micrometer
META-INF/services/org/apache/camel/resource-resolver/bean=camel:bean
META-INF/services/org/apache/camel/resource-resolver/gist=camel:resourceresolver-github
diff --git
a/dsl/camel-kamelet-main/src/main/resources/camel-main-known-dependencies.properties
b/dsl/camel-kamelet-main/src/main/resources/camel-main-known-dependencies.properties
index ac4afe0e433b..70730cfcc430 100644
---
a/dsl/camel-kamelet-main/src/main/resources/camel-main-known-dependencies.properties
+++
b/dsl/camel-kamelet-main/src/main/resources/camel-main-known-dependencies.properties
@@ -44,6 +44,12 @@ camel.opentelemetry = camel:opentelemetry
camel.opentelemetry2 = camel:opentelemetry2
camel.lra = camel:lra
camel.telemetryDev = camel:telemetry-dev
+camel.cluster.file = camel:file
+camel.cluster.kubernetes = camel:kubernetes
+camel.cluster.zookeeper = camel:zookeeper
+camel.cluster.consul = camel:consul
+camel.cluster.jgroups-raft = camel:jgroups-raft
+camel.cluster.infinispan = camel:infinispan
META-INF/services/org/apache/camel/modelxml-dumper = camel:xml-io
META-INF/services/org/apache/camel/modelyaml-dumper = camel:yaml-io
diff --git
a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareCamelMainMojo.java
b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareCamelMainMojo.java
index c2ada8247cb2..df0651404763 100644
---
a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareCamelMainMojo.java
+++
b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareCamelMainMojo.java
@@ -18,9 +18,11 @@ package org.apache.camel.maven.packaging;
import java.io.File;
import java.io.IOException;
+import java.nio.file.Files;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
+import java.util.Map;
import java.util.stream.Collectors;
import javax.inject.Inject;
@@ -31,6 +33,8 @@ import org.apache.camel.tooling.model.MainModel;
import org.apache.camel.tooling.model.MainModel.MainGroupModel;
import org.apache.camel.tooling.util.JavadocHelper;
import org.apache.camel.tooling.util.PackageHelper;
+import org.apache.camel.util.json.JsonObject;
+import org.apache.camel.util.json.Jsoner;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
import org.apache.maven.plugins.annotations.LifecyclePhase;
@@ -150,6 +154,85 @@ public class PrepareCamelMainMojo extends
AbstractGeneratorMojo {
return answer;
}
+ /**
+ * Loads cluster service configuration metadata from a bean JSON file.
+ */
+ public static List<MainModel.MainOptionModel> loadClusterServiceMetadata(
+ String prefix, File beanJsonFile)
+ throws Exception {
+
+ final List<MainModel.MainOptionModel> answer = new ArrayList<>();
+
+ String json = Files.readString(beanJsonFile.toPath());
+ JsonObject root = (JsonObject) Jsoner.deserialize(json);
+ JsonObject bean = root.getMap("bean");
+ String sourceType = bean.getString("javaType");
+ boolean classDeprecated = Boolean.TRUE.equals(bean.get("deprecated"));
+
+ // add synthetic "enabled" property
+ MainModel.MainOptionModel enabledModel = new
MainModel.MainOptionModel();
+ enabledModel.setName(prefix + "enabled");
+ enabledModel.setJavaType("boolean");
+ enabledModel.setType("boolean");
+ enabledModel.setDefaultValue(true);
+ enabledModel.setDescription("Whether to enable this cluster service.");
+ enabledModel.setSourceType(sourceType);
+ answer.add(enabledModel);
+
+ JsonObject properties = bean.getMap("properties");
+ if (properties != null) {
+ for (Map.Entry<String, Object> entry : properties.entrySet()) {
+ String name = entry.getKey();
+ JsonObject prop = (JsonObject) entry.getValue();
+
+ String javaType = prop.getString("javaType");
+
+ MainModel.MainOptionModel model = new
MainModel.MainOptionModel();
+ model.setName(prefix + name);
+ model.setJavaType(javaType);
+ model.setSourceType(sourceType);
+ model.setRequired(Boolean.TRUE.equals(prop.get("required")));
+ model.setDeprecated(classDeprecated ||
Boolean.TRUE.equals(prop.get("deprecated")));
+ model.setSecret(Boolean.TRUE.equals(prop.get("secret")));
+ model.setDescription(prop.getString("description"));
+
+ String security = prop.getString("security");
+ if (security != null) {
+ model.setSecurity(security);
+ if ("secret".equals(security) && !model.isSecret()) {
+ model.setSecret(true);
+ }
+ }
+
+ // determine type and handle enums
+ String type = prop.getString("type");
+ List<String> enums = null;
+ Object enumObj = prop.get("enum");
+ if (enumObj instanceof List) {
+ enums = ((List<?>)
enumObj).stream().map(Object::toString).collect(Collectors.toList());
+ type = "enum";
+ }
+ if (type == null) {
+ type = MojoHelper.getType(javaType, enums != null, false);
+ }
+ model.setType(type);
+ model.setEnums(enums);
+
+ // default value
+ Object defaultValue = prop.get("defaultValue");
+ if (defaultValue != null) {
+ model.setDefaultValue(defaultValue);
+ } else if ("boolean".equals(type)) {
+ model.setDefaultValue("false");
+ }
+
+ answer.add(model);
+ }
+ }
+
+ return answer;
+ }
+
private static Object asDefaultValue(String type, String defaultValue) {
if (defaultValue != null) {
if ("boolean".equals(type)) {
@@ -359,6 +442,38 @@ public class PrepareCamelMainMojo extends
AbstractGeneratorMojo {
throw new MojoFailureException("Error parsing file " +
cyberarkVaultConfig + " due " + e.getMessage(), e);
}
+ // include cluster service configuration from component bean metadata
+ String[][] clusterServices = {
+ { "file", "components/camel-file", "FileLockClusterService" },
+ { "kubernetes", "components/camel-kubernetes",
"KubernetesClusterService" },
+ { "zookeeper", "components/camel-zookeeper",
"ZooKeeperClusterService" },
+ { "consul", "components/camel-consul", "ConsulClusterService"
},
+ { "jgroups-raft", "components/camel-jgroups-raft",
"JGroupsRaftClusterService" },
+ { "infinispan",
"components/camel-infinispan/camel-infinispan",
"InfinispanRemoteClusterService" },
+ };
+ for (String[] cs : clusterServices) {
+ String type = cs[0];
+ String componentPath = cs[1];
+ String beanName = cs[2];
+ try {
+ File componentDir =
PackageHelper.findCamelDirectory(project.getBasedir(), componentPath);
+ File beanJson = new File(
+ componentDir,
+
"src/generated/resources/META-INF/services/org/apache/camel/bean/" + beanName +
".json");
+ if (beanJson.isFile()) {
+ String prefix = "camel.cluster." + type + ".";
+ List<MainModel.MainOptionModel> clusterModel =
loadClusterServiceMetadata(prefix, beanJson);
+ data.addAll(clusterModel);
+ getLog().info("Loaded cluster service metadata: " + type +
" (" + clusterModel.size() + " options)");
+ } else {
+ getLog().warn("Cluster service bean metadata not found: "
+ beanJson);
+ }
+ } catch (Exception e) {
+ throw new MojoFailureException(
+ "Error loading cluster service metadata for " + type +
" due " + e.getMessage(), e);
+ }
+ }
+
// lets sort so they are always ordered (but camel.main in top)
data.sort((o1, o2) -> {
if (o1.getName().startsWith("camel.main.") &&
!o2.getName().startsWith("camel.main.")) {
@@ -477,6 +592,24 @@ public class PrepareCamelMainMojo extends
AbstractGeneratorMojo {
model.getGroups().add(new MainGroupModel(
"camel.errorRegistry", "Camel Error Registry
configurations",
"org.apache.camel.main.ErrorRegistryConfigurationProperties"));
+ model.getGroups().add(new MainGroupModel(
+ "camel.cluster.file", "Camel File Cluster Service
configurations",
+
"org.apache.camel.component.file.cluster.FileLockClusterService"));
+ model.getGroups().add(new MainGroupModel(
+ "camel.cluster.kubernetes", "Camel Kubernetes Cluster
Service configurations",
+
"org.apache.camel.component.kubernetes.cluster.KubernetesClusterService"));
+ model.getGroups().add(new MainGroupModel(
+ "camel.cluster.zookeeper", "Camel ZooKeeper Cluster
Service configurations",
+
"org.apache.camel.component.zookeeper.cluster.ZooKeeperClusterService"));
+ model.getGroups().add(new MainGroupModel(
+ "camel.cluster.consul", "Camel Consul Cluster Service
configurations",
+
"org.apache.camel.component.consul.cluster.ConsulClusterService"));
+ model.getGroups().add(new MainGroupModel(
+ "camel.cluster.jgroups-raft", "Camel JGroups Raft Cluster
Service configurations",
+
"org.apache.camel.component.jgroups.raft.cluster.JGroupsRaftClusterService"));
+ model.getGroups().add(new MainGroupModel(
+ "camel.cluster.infinispan", "Camel Infinispan Remote
Cluster Service configurations",
+
"org.apache.camel.component.infinispan.remote.cluster.InfinispanRemoteClusterService"));
String json = JsonMapper.createJsonSchema(model);
diff --git
a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareKameletMainMojo.java
b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareKameletMainMojo.java
index 14fc2003efeb..d847b4686476 100644
---
a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareKameletMainMojo.java
+++
b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareKameletMainMojo.java
@@ -47,7 +47,6 @@ import org.apache.maven.project.MavenProject;
import org.codehaus.plexus.build.BuildContext;
import static
org.apache.camel.maven.packaging.generics.PackagePluginUtils.joinHeaderAndSource;
-import static org.apache.camel.tooling.util.PackageHelper.findCamelDirectory;
import static org.apache.camel.tooling.util.PackageHelper.loadText;
/**
@@ -212,17 +211,34 @@ public class PrepareKameletMainMojo extends AbstractMojo {
private static List<String> findFactoryFinder(File rootDir) {
List<String> answer = new ArrayList<>();
+ String serviceDir =
"src/generated/resources/META-INF/services/org/apache/camel/";
for (File f : Objects.requireNonNull(rootDir.listFiles())) {
- String artifact = f.getName();
- if (artifact.startsWith("camel-")) {
- artifact = artifact.substring(6);
- }
if (f.isDirectory()) {
- File fd = findCamelDirectory(f,
"src/generated/resources/META-INF/services/org/apache/camel/");
- if (fd != null && fd.isDirectory()) {
+ File fd = new File(f, serviceDir);
+ if (fd.isDirectory()) {
+ String artifact = f.getName();
+ if (artifact.startsWith("camel-")) {
+ artifact = artifact.substring(6);
+ }
findFactoryFinder(answer, artifact, fd, null);
}
+ // scan nested module directories (e.g.,
camel-infinispan/camel-infinispan/)
+ File[] children = f.listFiles();
+ if (children != null) {
+ for (File nested : children) {
+ if (nested.isDirectory() &&
nested.getName().startsWith("camel-")) {
+ fd = new File(nested, serviceDir);
+ if (fd.isDirectory()) {
+ String nestedArtifact = nested.getName();
+ if (nestedArtifact.startsWith("camel-")) {
+ nestedArtifact =
nestedArtifact.substring(6);
+ }
+ findFactoryFinder(answer, nestedArtifact, fd,
null);
+ }
+ }
+ }
+ }
}
}