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 e0e7169e0f3 CAMEL-21389: First version of Flowable Camel component
e0e7169e0f3 is described below
commit e0e7169e0f304d471ded82533b8e3bc7f677796c
Author: Claus Ibsen <[email protected]>
AuthorDate: Sun Oct 27 14:29:53 2024 +0100
CAMEL-21389: First version of Flowable Camel component
---
bom/camel-bom/pom.xml | 5 +
catalog/camel-allcomponents/pom.xml | 5 +
.../org/apache/camel/catalog/components.properties | 1 +
.../apache/camel/catalog/components/flowable.json | 38 +++
components/camel-flowable/pom.xml | 76 +++++
.../flowable/FlowableComponentConfigurer.java | 63 ++++
.../flowable/FlowableEndpointConfigurer.java | 69 +++++
.../flowable/FlowableEndpointUriFactory.java | 74 +++++
.../apache/camel/component/flowable/flowable.json | 38 +++
.../services/org/apache/camel/component.properties | 7 +
.../services/org/apache/camel/component/flowable | 2 +
.../org/apache/camel/configurer/flowable-component | 2 +
.../org/apache/camel/configurer/flowable-endpoint | 2 +
.../org/apache/camel/urifactory/flowable-endpoint | 2 +
.../src/main/docs/flowable-component.adoc | 70 +++++
.../flowable/CamelChannelModelProcessor.java | 137 +++++++++
...CamelOperationsOutboundEventChannelAdapter.java | 45 +++
.../component/flowable/FlowableComponent.java | 35 +++
.../camel/component/flowable/FlowableConsumer.java | 39 +++
.../camel/component/flowable/FlowableEndpoint.java | 126 ++++++++
.../camel/component/flowable/FlowableProducer.java | 46 +++
.../component/flowable/CamelFlowableTestCase.java | 66 +++++
.../component/flowable/FlowableEngineUtil.java | 62 ++++
.../flowable/FlowableInboundChannelHeaderTest.java | 70 +++++
.../flowable/FlowableInboundChannelTest.java | 65 +++++
.../flowable/FlowableOutboundChannelTest.java | 64 ++++
.../flowable/FlowableRedeployChannelTest.java | 76 +++++
.../FlowableSendAndReceiveChannelTest.java | 85 ++++++
.../src/test/resources/channel/userChannel.channel | 11 +
.../resources/channel/userChannelUpdated.channel | 11 +
.../resources/channel/userHeaderChannel.channel | 11 +
.../resources/channel/userInboundChannel.channel | 11 +
.../resources/channel/userOutboundChannel.channel | 8 +
.../src/test/resources/event/userEvent.event | 14 +
.../test/resources/event/userEventUpdated.event | 18 ++
.../test/resources/event/userInboundEvent.event | 15 +
.../test/resources/event/userWithHeaderEvent.event | 24 ++
.../src/test/resources/log4j2.properties | 28 ++
.../process/sendAndReceiveEvent.bpmn20.xml | 60 ++++
.../test/resources/process/sendEvent.bpmn20.xml | 55 ++++
.../src/test/resources/process/start.bpmn20.xml | 44 +++
.../resources/process/startWithHeader.bpmn20.xml | 46 +++
.../src/main/docs/knative-http-component.adoc | 2 +-
.../internal/client/PubSubApiClient.java | 1 -
components/pom.xml | 1 +
.../org/apache/camel/main/components.properties | 1 +
.../modules/ROOT/examples/json/flowable.json | 1 +
docs/components/modules/ROOT/nav.adoc | 1 +
.../modules/ROOT/pages/flowable-component.adoc | 1 +
.../component/ComponentsBuilderFactory.java | 13 +
.../dsl/FlowableComponentBuilderFactory.java | 149 ++++++++++
.../builder/endpoint/EndpointBuilderFactory.java | 1 +
.../camel/builder/endpoint/EndpointBuilders.java | 1 +
.../builder/endpoint/StaticEndpointBuilders.java | 40 +++
.../dsl/FlowableEndpointBuilderFactory.java | 321 +++++++++++++++++++++
.../camel-component-known-dependencies.properties | 1 +
parent/pom.xml | 7 +
pom.xml | 2 +
58 files changed, 2267 insertions(+), 2 deletions(-)
diff --git a/bom/camel-bom/pom.xml b/bom/camel-bom/pom.xml
index c5e11e83c5c..8cfe8024e90 100644
--- a/bom/camel-bom/pom.xml
+++ b/bom/camel-bom/pom.xml
@@ -797,6 +797,11 @@
<artifactId>camel-flink</artifactId>
<version>4.9.0-SNAPSHOT</version>
</dependency>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-flowable</artifactId>
+ <version>4.9.0-SNAPSHOT</version>
+ </dependency>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-fop</artifactId>
diff --git a/catalog/camel-allcomponents/pom.xml
b/catalog/camel-allcomponents/pom.xml
index fcb5049fc8b..1be613cbc73 100644
--- a/catalog/camel-allcomponents/pom.xml
+++ b/catalog/camel-allcomponents/pom.xml
@@ -671,6 +671,11 @@
<artifactId>camel-flink</artifactId>
<version>${project.version}</version>
</dependency>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-flowable</artifactId>
+ <version>${project.version}</version>
+ </dependency>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-fop</artifactId>
diff --git
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components.properties
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components.properties
index 256a1d470c4..87d12ba79bf 100644
---
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components.properties
+++
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components.properties
@@ -104,6 +104,7 @@ file
file-watch
flatpack
flink
+flowable
fop
freemarker
ftp
diff --git
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/flowable.json
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/flowable.json
new file mode 100644
index 00000000000..4b460cb5cbd
--- /dev/null
+++
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/flowable.json
@@ -0,0 +1,38 @@
+{
+ "component": {
+ "kind": "component",
+ "name": "flowable",
+ "title": "Flowable",
+ "description": "Send and receive messages from the Flowable BPMN and CMMN
engines.",
+ "deprecated": false,
+ "firstVersion": "4.19.0",
+ "label": "workflow",
+ "javaType": "org.apache.camel.component.flowable.FlowableComponent",
+ "supportLevel": "Preview",
+ "groupId": "org.apache.camel",
+ "artifactId": "camel-flowable",
+ "version": "4.9.0-SNAPSHOT",
+ "scheme": "flowable",
+ "extendsScheme": "",
+ "syntax": "flowable:channelKey",
+ "async": false,
+ "api": false,
+ "consumerOnly": false,
+ "producerOnly": false,
+ "lenientProperties": false,
+ "browsable": false,
+ "remote": true
+ },
+ "componentProperties": {
+ "bridgeErrorHandler": { "index": 0, "kind": "property", "displayName":
"Bridge Error Handler", "group": "consumer", "label": "consumer", "required":
false, "type": "boolean", "javaType": "boolean", "deprecated": false,
"autowired": false, "secret": false, "defaultValue": false, "description":
"Allows for bridging the consumer to the Camel routing Error Handler, which
mean any exceptions (if possible) occurred while the Camel consumer is trying
to pickup incoming messages, or the like [...]
+ "lazyStartProducer": { "index": 1, "kind": "property", "displayName":
"Lazy Start Producer", "group": "producer", "label": "producer", "required":
false, "type": "boolean", "javaType": "boolean", "deprecated": false,
"autowired": false, "secret": false, "defaultValue": false, "description":
"Whether the producer should be started lazy (on the first message). By
starting lazy you can use this to allow CamelContext and routes to startup in
situations where a producer may otherwise fail [...]
+ "autowiredEnabled": { "index": 2, "kind": "property", "displayName":
"Autowired Enabled", "group": "advanced", "label": "advanced", "required":
false, "type": "boolean", "javaType": "boolean", "deprecated": false,
"autowired": false, "secret": false, "defaultValue": true, "description":
"Whether autowiring is enabled. This is used for automatic autowiring options
(the option must be marked as autowired) by looking up in the registry to find
if there is a single instance of matching t [...]
+ },
+ "properties": {
+ "channelKey": { "index": 0, "kind": "path", "displayName": "Channel Key",
"group": "common", "label": "", "required": true, "type": "string", "javaType":
"java.lang.String", "deprecated": false, "deprecationNote": "", "autowired":
false, "secret": false, "description": "The channel key" },
+ "bridgeErrorHandler": { "index": 1, "kind": "parameter", "displayName":
"Bridge Error Handler", "group": "consumer (advanced)", "label":
"consumer,advanced", "required": false, "type": "boolean", "javaType":
"boolean", "deprecated": false, "autowired": false, "secret": false,
"defaultValue": false, "description": "Allows for bridging the consumer to the
Camel routing Error Handler, which mean any exceptions (if possible) occurred
while the Camel consumer is trying to pickup incoming [...]
+ "exceptionHandler": { "index": 2, "kind": "parameter", "displayName":
"Exception Handler", "group": "consumer (advanced)", "label":
"consumer,advanced", "required": false, "type": "object", "javaType":
"org.apache.camel.spi.ExceptionHandler", "optionalPrefix": "consumer.",
"deprecated": false, "autowired": false, "secret": false, "description": "To
let the consumer use a custom ExceptionHandler. Notice if the option
bridgeErrorHandler is enabled then this option is not in use. By def [...]
+ "exchangePattern": { "index": 3, "kind": "parameter", "displayName":
"Exchange Pattern", "group": "consumer (advanced)", "label":
"consumer,advanced", "required": false, "type": "object", "javaType":
"org.apache.camel.ExchangePattern", "enum": [ "InOnly", "InOut" ],
"deprecated": false, "autowired": false, "secret": false, "description": "Sets
the exchange pattern when the consumer creates an exchange." },
+ "lazyStartProducer": { "index": 4, "kind": "parameter", "displayName":
"Lazy Start Producer", "group": "producer (advanced)", "label":
"producer,advanced", "required": false, "type": "boolean", "javaType":
"boolean", "deprecated": false, "autowired": false, "secret": false,
"defaultValue": false, "description": "Whether the producer should be started
lazy (on the first message). By starting lazy you can use this to allow
CamelContext and routes to startup in situations where a produc [...]
+ }
+}
diff --git a/components/camel-flowable/pom.xml
b/components/camel-flowable/pom.xml
new file mode 100644
index 00000000000..d01be2d5998
--- /dev/null
+++ b/components/camel-flowable/pom.xml
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/maven-v4_0_0.xsd">
+
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>components</artifactId>
+ <version>4.9.0-SNAPSHOT</version>
+ </parent>
+
+ <artifactId>camel-flowable</artifactId>
+ <packaging>jar</packaging>
+ <name>Camel :: Flowable</name>
+ <description>Camel Flowable support</description>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-support</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-core-model</artifactId>
+ </dependency>
+
+ <!-- testing -->
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-test-junit5</artifactId>
+ <scope>test</scope>
+ </dependency>
+
+ <!-- Flowable JARs -->
+ <dependency>
+ <groupId>org.flowable</groupId>
+ <artifactId>flowable-engine</artifactId>
+ <version>${flowable-version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.flowable</groupId>
+ <artifactId>flowable-event-registry</artifactId>
+ <version>${flowable-version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.logging.log4j</groupId>
+ <artifactId>log4j-slf4j-impl</artifactId>
+ <version>${log4j2-version}</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>com.h2database</groupId>
+ <artifactId>h2</artifactId>
+ <scope>test</scope>
+ <version>${h2-version}</version>
+ </dependency>
+ </dependencies>
+</project>
diff --git
a/components/camel-flowable/src/generated/java/org/apache/camel/component/flowable/FlowableComponentConfigurer.java
b/components/camel-flowable/src/generated/java/org/apache/camel/component/flowable/FlowableComponentConfigurer.java
new file mode 100644
index 00000000000..3ea852b446d
--- /dev/null
+++
b/components/camel-flowable/src/generated/java/org/apache/camel/component/flowable/FlowableComponentConfigurer.java
@@ -0,0 +1,63 @@
+/* Generated by camel build tools - do NOT edit this file! */
+package org.apache.camel.component.flowable;
+
+import javax.annotation.processing.Generated;
+import java.util.Map;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.spi.ExtendedPropertyConfigurerGetter;
+import org.apache.camel.spi.PropertyConfigurerGetter;
+import org.apache.camel.spi.ConfigurerStrategy;
+import org.apache.camel.spi.GeneratedPropertyConfigurer;
+import org.apache.camel.util.CaseInsensitiveMap;
+import org.apache.camel.support.component.PropertyConfigurerSupport;
+
+/**
+ * Generated by camel build tools - do NOT edit this file!
+ */
+@Generated("org.apache.camel.maven.packaging.EndpointSchemaGeneratorMojo")
+@SuppressWarnings("unchecked")
+public class FlowableComponentConfigurer extends PropertyConfigurerSupport
implements GeneratedPropertyConfigurer, PropertyConfigurerGetter {
+
+ @Override
+ public boolean configure(CamelContext camelContext, Object obj, String
name, Object value, boolean ignoreCase) {
+ FlowableComponent target = (FlowableComponent) obj;
+ switch (ignoreCase ? name.toLowerCase() : name) {
+ case "autowiredenabled":
+ case "autowiredEnabled":
target.setAutowiredEnabled(property(camelContext, boolean.class, value));
return true;
+ case "bridgeerrorhandler":
+ case "bridgeErrorHandler":
target.setBridgeErrorHandler(property(camelContext, boolean.class, value));
return true;
+ case "lazystartproducer":
+ case "lazyStartProducer":
target.setLazyStartProducer(property(camelContext, boolean.class, value));
return true;
+ default: return false;
+ }
+ }
+
+ @Override
+ public Class<?> getOptionType(String name, boolean ignoreCase) {
+ switch (ignoreCase ? name.toLowerCase() : name) {
+ case "autowiredenabled":
+ case "autowiredEnabled": return boolean.class;
+ case "bridgeerrorhandler":
+ case "bridgeErrorHandler": return boolean.class;
+ case "lazystartproducer":
+ case "lazyStartProducer": return boolean.class;
+ default: return null;
+ }
+ }
+
+ @Override
+ public Object getOptionValue(Object obj, String name, boolean ignoreCase) {
+ FlowableComponent target = (FlowableComponent) obj;
+ switch (ignoreCase ? name.toLowerCase() : name) {
+ case "autowiredenabled":
+ case "autowiredEnabled": return target.isAutowiredEnabled();
+ case "bridgeerrorhandler":
+ case "bridgeErrorHandler": return target.isBridgeErrorHandler();
+ case "lazystartproducer":
+ case "lazyStartProducer": return target.isLazyStartProducer();
+ default: return null;
+ }
+ }
+}
+
diff --git
a/components/camel-flowable/src/generated/java/org/apache/camel/component/flowable/FlowableEndpointConfigurer.java
b/components/camel-flowable/src/generated/java/org/apache/camel/component/flowable/FlowableEndpointConfigurer.java
new file mode 100644
index 00000000000..e4c055db078
--- /dev/null
+++
b/components/camel-flowable/src/generated/java/org/apache/camel/component/flowable/FlowableEndpointConfigurer.java
@@ -0,0 +1,69 @@
+/* Generated by camel build tools - do NOT edit this file! */
+package org.apache.camel.component.flowable;
+
+import javax.annotation.processing.Generated;
+import java.util.Map;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.spi.ExtendedPropertyConfigurerGetter;
+import org.apache.camel.spi.PropertyConfigurerGetter;
+import org.apache.camel.spi.ConfigurerStrategy;
+import org.apache.camel.spi.GeneratedPropertyConfigurer;
+import org.apache.camel.util.CaseInsensitiveMap;
+import org.apache.camel.support.component.PropertyConfigurerSupport;
+
+/**
+ * Generated by camel build tools - do NOT edit this file!
+ */
+@Generated("org.apache.camel.maven.packaging.EndpointSchemaGeneratorMojo")
+@SuppressWarnings("unchecked")
+public class FlowableEndpointConfigurer extends PropertyConfigurerSupport
implements GeneratedPropertyConfigurer, PropertyConfigurerGetter {
+
+ @Override
+ public boolean configure(CamelContext camelContext, Object obj, String
name, Object value, boolean ignoreCase) {
+ FlowableEndpoint target = (FlowableEndpoint) obj;
+ switch (ignoreCase ? name.toLowerCase() : name) {
+ case "bridgeerrorhandler":
+ case "bridgeErrorHandler":
target.setBridgeErrorHandler(property(camelContext, boolean.class, value));
return true;
+ case "exceptionhandler":
+ case "exceptionHandler":
target.setExceptionHandler(property(camelContext,
org.apache.camel.spi.ExceptionHandler.class, value)); return true;
+ case "exchangepattern":
+ case "exchangePattern":
target.setExchangePattern(property(camelContext,
org.apache.camel.ExchangePattern.class, value)); return true;
+ case "lazystartproducer":
+ case "lazyStartProducer":
target.setLazyStartProducer(property(camelContext, boolean.class, value));
return true;
+ default: return false;
+ }
+ }
+
+ @Override
+ public Class<?> getOptionType(String name, boolean ignoreCase) {
+ switch (ignoreCase ? name.toLowerCase() : name) {
+ case "bridgeerrorhandler":
+ case "bridgeErrorHandler": return boolean.class;
+ case "exceptionhandler":
+ case "exceptionHandler": return
org.apache.camel.spi.ExceptionHandler.class;
+ case "exchangepattern":
+ case "exchangePattern": return org.apache.camel.ExchangePattern.class;
+ case "lazystartproducer":
+ case "lazyStartProducer": return boolean.class;
+ default: return null;
+ }
+ }
+
+ @Override
+ public Object getOptionValue(Object obj, String name, boolean ignoreCase) {
+ FlowableEndpoint target = (FlowableEndpoint) obj;
+ switch (ignoreCase ? name.toLowerCase() : name) {
+ case "bridgeerrorhandler":
+ case "bridgeErrorHandler": return target.isBridgeErrorHandler();
+ case "exceptionhandler":
+ case "exceptionHandler": return target.getExceptionHandler();
+ case "exchangepattern":
+ case "exchangePattern": return target.getExchangePattern();
+ case "lazystartproducer":
+ case "lazyStartProducer": return target.isLazyStartProducer();
+ default: return null;
+ }
+ }
+}
+
diff --git
a/components/camel-flowable/src/generated/java/org/apache/camel/component/flowable/FlowableEndpointUriFactory.java
b/components/camel-flowable/src/generated/java/org/apache/camel/component/flowable/FlowableEndpointUriFactory.java
new file mode 100644
index 00000000000..e9704df5c8e
--- /dev/null
+++
b/components/camel-flowable/src/generated/java/org/apache/camel/component/flowable/FlowableEndpointUriFactory.java
@@ -0,0 +1,74 @@
+/* Generated by camel build tools - do NOT edit this file! */
+package org.apache.camel.component.flowable;
+
+import javax.annotation.processing.Generated;
+import java.net.URISyntaxException;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.camel.spi.EndpointUriFactory;
+
+/**
+ * Generated by camel build tools - do NOT edit this file!
+ */
+@Generated("org.apache.camel.maven.packaging.GenerateEndpointUriFactoryMojo")
+public class FlowableEndpointUriFactory extends
org.apache.camel.support.component.EndpointUriFactorySupport implements
EndpointUriFactory {
+
+ private static final String BASE = ":channelKey";
+
+ private static final Set<String> PROPERTY_NAMES;
+ private static final Set<String> SECRET_PROPERTY_NAMES;
+ private static final Set<String> MULTI_VALUE_PREFIXES;
+ static {
+ Set<String> props = new HashSet<>(5);
+ props.add("bridgeErrorHandler");
+ props.add("channelKey");
+ props.add("exceptionHandler");
+ props.add("exchangePattern");
+ props.add("lazyStartProducer");
+ PROPERTY_NAMES = Collections.unmodifiableSet(props);
+ SECRET_PROPERTY_NAMES = Collections.emptySet();
+ MULTI_VALUE_PREFIXES = Collections.emptySet();
+ }
+
+ @Override
+ public boolean isEnabled(String scheme) {
+ return "flowable".equals(scheme);
+ }
+
+ @Override
+ public String buildUri(String scheme, Map<String, Object> properties,
boolean encode) throws URISyntaxException {
+ String syntax = scheme + BASE;
+ String uri = syntax;
+
+ Map<String, Object> copy = new HashMap<>(properties);
+
+ uri = buildPathParameter(syntax, uri, "channelKey", null, true, copy);
+ uri = buildQueryParameters(uri, copy, encode);
+ return uri;
+ }
+
+ @Override
+ public Set<String> propertyNames() {
+ return PROPERTY_NAMES;
+ }
+
+ @Override
+ public Set<String> secretPropertyNames() {
+ return SECRET_PROPERTY_NAMES;
+ }
+
+ @Override
+ public Set<String> multiValuePrefixes() {
+ return MULTI_VALUE_PREFIXES;
+ }
+
+ @Override
+ public boolean isLenientProperties() {
+ return false;
+ }
+}
+
diff --git
a/components/camel-flowable/src/generated/resources/META-INF/org/apache/camel/component/flowable/flowable.json
b/components/camel-flowable/src/generated/resources/META-INF/org/apache/camel/component/flowable/flowable.json
new file mode 100644
index 00000000000..4b460cb5cbd
--- /dev/null
+++
b/components/camel-flowable/src/generated/resources/META-INF/org/apache/camel/component/flowable/flowable.json
@@ -0,0 +1,38 @@
+{
+ "component": {
+ "kind": "component",
+ "name": "flowable",
+ "title": "Flowable",
+ "description": "Send and receive messages from the Flowable BPMN and CMMN
engines.",
+ "deprecated": false,
+ "firstVersion": "4.19.0",
+ "label": "workflow",
+ "javaType": "org.apache.camel.component.flowable.FlowableComponent",
+ "supportLevel": "Preview",
+ "groupId": "org.apache.camel",
+ "artifactId": "camel-flowable",
+ "version": "4.9.0-SNAPSHOT",
+ "scheme": "flowable",
+ "extendsScheme": "",
+ "syntax": "flowable:channelKey",
+ "async": false,
+ "api": false,
+ "consumerOnly": false,
+ "producerOnly": false,
+ "lenientProperties": false,
+ "browsable": false,
+ "remote": true
+ },
+ "componentProperties": {
+ "bridgeErrorHandler": { "index": 0, "kind": "property", "displayName":
"Bridge Error Handler", "group": "consumer", "label": "consumer", "required":
false, "type": "boolean", "javaType": "boolean", "deprecated": false,
"autowired": false, "secret": false, "defaultValue": false, "description":
"Allows for bridging the consumer to the Camel routing Error Handler, which
mean any exceptions (if possible) occurred while the Camel consumer is trying
to pickup incoming messages, or the like [...]
+ "lazyStartProducer": { "index": 1, "kind": "property", "displayName":
"Lazy Start Producer", "group": "producer", "label": "producer", "required":
false, "type": "boolean", "javaType": "boolean", "deprecated": false,
"autowired": false, "secret": false, "defaultValue": false, "description":
"Whether the producer should be started lazy (on the first message). By
starting lazy you can use this to allow CamelContext and routes to startup in
situations where a producer may otherwise fail [...]
+ "autowiredEnabled": { "index": 2, "kind": "property", "displayName":
"Autowired Enabled", "group": "advanced", "label": "advanced", "required":
false, "type": "boolean", "javaType": "boolean", "deprecated": false,
"autowired": false, "secret": false, "defaultValue": true, "description":
"Whether autowiring is enabled. This is used for automatic autowiring options
(the option must be marked as autowired) by looking up in the registry to find
if there is a single instance of matching t [...]
+ },
+ "properties": {
+ "channelKey": { "index": 0, "kind": "path", "displayName": "Channel Key",
"group": "common", "label": "", "required": true, "type": "string", "javaType":
"java.lang.String", "deprecated": false, "deprecationNote": "", "autowired":
false, "secret": false, "description": "The channel key" },
+ "bridgeErrorHandler": { "index": 1, "kind": "parameter", "displayName":
"Bridge Error Handler", "group": "consumer (advanced)", "label":
"consumer,advanced", "required": false, "type": "boolean", "javaType":
"boolean", "deprecated": false, "autowired": false, "secret": false,
"defaultValue": false, "description": "Allows for bridging the consumer to the
Camel routing Error Handler, which mean any exceptions (if possible) occurred
while the Camel consumer is trying to pickup incoming [...]
+ "exceptionHandler": { "index": 2, "kind": "parameter", "displayName":
"Exception Handler", "group": "consumer (advanced)", "label":
"consumer,advanced", "required": false, "type": "object", "javaType":
"org.apache.camel.spi.ExceptionHandler", "optionalPrefix": "consumer.",
"deprecated": false, "autowired": false, "secret": false, "description": "To
let the consumer use a custom ExceptionHandler. Notice if the option
bridgeErrorHandler is enabled then this option is not in use. By def [...]
+ "exchangePattern": { "index": 3, "kind": "parameter", "displayName":
"Exchange Pattern", "group": "consumer (advanced)", "label":
"consumer,advanced", "required": false, "type": "object", "javaType":
"org.apache.camel.ExchangePattern", "enum": [ "InOnly", "InOut" ],
"deprecated": false, "autowired": false, "secret": false, "description": "Sets
the exchange pattern when the consumer creates an exchange." },
+ "lazyStartProducer": { "index": 4, "kind": "parameter", "displayName":
"Lazy Start Producer", "group": "producer (advanced)", "label":
"producer,advanced", "required": false, "type": "boolean", "javaType":
"boolean", "deprecated": false, "autowired": false, "secret": false,
"defaultValue": false, "description": "Whether the producer should be started
lazy (on the first message). By starting lazy you can use this to allow
CamelContext and routes to startup in situations where a produc [...]
+ }
+}
diff --git
a/components/camel-flowable/src/generated/resources/META-INF/services/org/apache/camel/component.properties
b/components/camel-flowable/src/generated/resources/META-INF/services/org/apache/camel/component.properties
new file mode 100644
index 00000000000..9b4c23e6374
--- /dev/null
+++
b/components/camel-flowable/src/generated/resources/META-INF/services/org/apache/camel/component.properties
@@ -0,0 +1,7 @@
+# Generated by camel build tools - do NOT edit this file!
+components=flowable
+groupId=org.apache.camel
+artifactId=camel-flowable
+version=4.9.0-SNAPSHOT
+projectName=Camel :: Flowable
+projectDescription=Camel Flowable support
diff --git
a/components/camel-flowable/src/generated/resources/META-INF/services/org/apache/camel/component/flowable
b/components/camel-flowable/src/generated/resources/META-INF/services/org/apache/camel/component/flowable
new file mode 100644
index 00000000000..e7e59e963fa
--- /dev/null
+++
b/components/camel-flowable/src/generated/resources/META-INF/services/org/apache/camel/component/flowable
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.component.flowable.FlowableComponent
diff --git
a/components/camel-flowable/src/generated/resources/META-INF/services/org/apache/camel/configurer/flowable-component
b/components/camel-flowable/src/generated/resources/META-INF/services/org/apache/camel/configurer/flowable-component
new file mode 100644
index 00000000000..5a92a130fef
--- /dev/null
+++
b/components/camel-flowable/src/generated/resources/META-INF/services/org/apache/camel/configurer/flowable-component
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.component.flowable.FlowableComponentConfigurer
diff --git
a/components/camel-flowable/src/generated/resources/META-INF/services/org/apache/camel/configurer/flowable-endpoint
b/components/camel-flowable/src/generated/resources/META-INF/services/org/apache/camel/configurer/flowable-endpoint
new file mode 100644
index 00000000000..840befbddb1
--- /dev/null
+++
b/components/camel-flowable/src/generated/resources/META-INF/services/org/apache/camel/configurer/flowable-endpoint
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.component.flowable.FlowableEndpointConfigurer
diff --git
a/components/camel-flowable/src/generated/resources/META-INF/services/org/apache/camel/urifactory/flowable-endpoint
b/components/camel-flowable/src/generated/resources/META-INF/services/org/apache/camel/urifactory/flowable-endpoint
new file mode 100644
index 00000000000..fba770381ae
--- /dev/null
+++
b/components/camel-flowable/src/generated/resources/META-INF/services/org/apache/camel/urifactory/flowable-endpoint
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.component.flowable.FlowableEndpointUriFactory
diff --git a/components/camel-flowable/src/main/docs/flowable-component.adoc
b/components/camel-flowable/src/main/docs/flowable-component.adoc
new file mode 100644
index 00000000000..dfb56f8dec4
--- /dev/null
+++ b/components/camel-flowable/src/main/docs/flowable-component.adoc
@@ -0,0 +1,70 @@
+= Flowable Component
+:doctitle: Flowable
+:shortname: flowable
+:artifactid: camel-flowable
+:description: Send and receive messages from the Flowable BPMN and CMMN
engines.
+:since: 4.19
+:supportlevel: Preview
+:tabs-sync-option:
+:component-header: Both producer and consumer are supported
+
+*Since Camel {since}*
+
+*{component-header}*
+
+Communicate with the Flowable Event Registry for sending and receiving
messages from the Flowable BPMN and CMMN engines.
+
+== URI format
+
+------------------------------
+flowable-event://[channelKey]?[options]
+------------------------------
+
+Where *channelKey* is the unique key value of the channel model deployed in
the Flowable Event Registry.
+
+// component-configure options: START
+
+// component-configure options: END
+
+// component options: START
+include::partial$component-configure-options.adoc[]
+include::partial$component-endpoint-options.adoc[]
+// component options: END
+
+// endpoint options: START
+
+// endpoint options: END
+
+== Usage
+
+=== Body content
+
+The body content is defined by the event model that is deployed to the
Flowable Event Registry.
+The event message can then be mapped to process or case variables in the
process BPMN or case CMMN model.
+
+== Examples
+
+The following example sends an event to the Flowable event registry for
further processing:
+
+[source,java]
+----------------------------------------------------------------------
+from("direct:start").to("flowable:exampleChannel");
+----------------------------------------------------------------------
+
+== Dependencies
+
+To use Flowable in your Camel routes, you need to add a dependency on
+*camel-flowable*, which implements the component.
+
+If you use Maven, you can add the following to your pom.xml,
+substituting the version number for the latest and greatest release (see
+the download page for the latest versions).
+
+[source,xml]
+-------------------------------------
+<dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-flowable</artifactId>
+ <version>x.x.x</version>
+</dependency>
+-------------------------------------
diff --git
a/components/camel-flowable/src/main/java/org/apache/camel/component/flowable/CamelChannelModelProcessor.java
b/components/camel-flowable/src/main/java/org/apache/camel/component/flowable/CamelChannelModelProcessor.java
new file mode 100644
index 00000000000..11d88b61fca
--- /dev/null
+++
b/components/camel-flowable/src/main/java/org/apache/camel/component/flowable/CamelChannelModelProcessor.java
@@ -0,0 +1,137 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.flowable;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.commons.lang3.StringUtils;
+import org.flowable.common.engine.api.FlowableException;
+import org.flowable.eventregistry.api.ChannelModelProcessor;
+import org.flowable.eventregistry.api.EventRegistry;
+import org.flowable.eventregistry.api.EventRepositoryService;
+import org.flowable.eventregistry.api.OutboundEventChannelAdapter;
+import org.flowable.eventregistry.impl.EventRegistryEngineConfiguration;
+import org.flowable.eventregistry.impl.util.CommandContextUtil;
+import org.flowable.eventregistry.model.CamelInboundChannelModel;
+import org.flowable.eventregistry.model.CamelOutboundChannelModel;
+import org.flowable.eventregistry.model.ChannelModel;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class CamelChannelModelProcessor implements ChannelModelProcessor {
+
+ protected final Logger logger = LoggerFactory.getLogger(getClass());
+
+ protected CamelContext camelContext;
+
+ public CamelChannelModelProcessor(CamelContext camelContext) {
+ this.camelContext = camelContext;
+ }
+
+ @Override
+ public boolean canProcess(ChannelModel channelModel) {
+ return channelModel instanceof CamelInboundChannelModel ||
channelModel instanceof CamelOutboundChannelModel;
+ }
+
+ @Override
+ public boolean canProcessIfChannelModelAlreadyRegistered(ChannelModel
channelModel) {
+ return channelModel instanceof CamelOutboundChannelModel;
+ }
+
+ @Override
+ public void registerChannelModel(
+ ChannelModel channelModel, String tenantId, EventRegistry
eventRegistry,
+ EventRepositoryService eventRepositoryService,
+ boolean fallbackToDefaultTenant) {
+
+ if (channelModel instanceof CamelInboundChannelModel
camelInboundChannelModel) {
+ logger.debug("Starting to register inbound channel {} in tenant
{}", channelModel.getKey(), tenantId);
+ processInboundDefinition(camelInboundChannelModel, tenantId);
+ logger.debug("Finished registering inbound channel {} in tenant
{}", channelModel.getKey(), tenantId);
+
+ } else if (channelModel instanceof CamelOutboundChannelModel
camelOutboundChannelModel) {
+ logger.debug("Starting to register outbound channel {} in tenant
{}", channelModel.getKey(), tenantId);
+ processOutboundDefinition(camelOutboundChannelModel, tenantId);
+ logger.debug("Finished registering outbound channel {} in tenant
{}", channelModel.getKey(), tenantId);
+ }
+ }
+
+ protected void processInboundDefinition(CamelInboundChannelModel
channelModel, String tenantId) {
+ EventRegistryEngineConfiguration eventRegistryEngineConfiguration =
CommandContextUtil.getEventRegistryConfiguration();
+ try (FlowableEndpoint endpoint = new FlowableEndpoint(channelModel,
eventRegistryEngineConfiguration)) {
+
+ camelContext.addEndpoint(endpoint.getEndpointUri(), endpoint);
+ if (StringUtils.isNotEmpty(channelModel.getSourceUri())) {
+ camelContext.addRoutes(new RouteBuilder() {
+
+ @Override
+ public void configure() throws Exception {
+
from(channelModel.getSourceUri()).routeId(channelModel.getKey()).to(endpoint.getEndpointUri());
+ }
+ });
+ }
+
+ } catch (Exception e) {
+ throw new FlowableException(
+ "Error creating producer for inbound channel " +
channelModel.getKey() + " in tenant " + tenantId);
+ }
+ }
+
+ protected void processOutboundDefinition(CamelOutboundChannelModel
channelModel, String tenantId) {
+ String destination = channelModel.getDestination();
+ if (channelModel.getOutboundEventChannelAdapter() == null &&
StringUtils.isNotEmpty(destination)) {
+
channelModel.setOutboundEventChannelAdapter(createOutboundEventChannelAdapter(channelModel,
tenantId));
+ }
+ }
+
+ protected OutboundEventChannelAdapter<String>
createOutboundEventChannelAdapter(
+ CamelOutboundChannelModel channelModel, String tenantId) {
+
+ EventRegistryEngineConfiguration eventRegistryEngineConfiguration =
CommandContextUtil.getEventRegistryConfiguration();
+ String destination = resolve(channelModel.getDestination());
+ try (FlowableEndpoint endpoint = new FlowableEndpoint(channelModel,
eventRegistryEngineConfiguration)) {
+ camelContext.addEndpoint(endpoint.getEndpointUri(), endpoint);
+ camelContext.addRoutes(new RouteBuilder() {
+
+ @Override
+ public void configure() throws Exception {
+
from(endpoint).routeId(channelModel.getKey()).to(destination);
+ }
+ });
+
+ return new CamelOperationsOutboundEventChannelAdapter(endpoint);
+
+ } catch (Exception e) {
+ throw new FlowableException(
+ "Error creating route for outbound channel " +
channelModel.getKey() + " in tenant " + tenantId);
+ }
+ }
+
+ @Override
+ public void unregisterChannelModel(
+ ChannelModel channelModel, String tenantId, EventRepositoryService
eventRepositoryService) {
+
+ }
+
+ public void setCamelContext(CamelContext camelContext) {
+ this.camelContext = camelContext;
+ }
+
+ protected String resolve(String value) {
+ return value;
+ }
+}
diff --git
a/components/camel-flowable/src/main/java/org/apache/camel/component/flowable/CamelOperationsOutboundEventChannelAdapter.java
b/components/camel-flowable/src/main/java/org/apache/camel/component/flowable/CamelOperationsOutboundEventChannelAdapter.java
new file mode 100644
index 00000000000..ea117625433
--- /dev/null
+++
b/components/camel-flowable/src/main/java/org/apache/camel/component/flowable/CamelOperationsOutboundEventChannelAdapter.java
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.flowable;
+
+import java.util.Map;
+
+import org.apache.camel.Exchange;
+import org.flowable.common.engine.api.FlowableException;
+import org.flowable.eventregistry.api.OutboundEventChannelAdapter;
+
+public class CamelOperationsOutboundEventChannelAdapter implements
OutboundEventChannelAdapter<String> {
+
+ protected FlowableEndpoint endpoint;
+
+ public CamelOperationsOutboundEventChannelAdapter(FlowableEndpoint
endpoint) {
+ this.endpoint = endpoint;
+ }
+
+ @Override
+ public void sendEvent(String rawEvent, Map<String, Object> headerMap) {
+ Exchange exchange = endpoint.createExchange();
+ exchange.getIn().setBody(rawEvent);
+ exchange.getIn().setHeaders(headerMap);
+
+ try {
+ endpoint.process(exchange);
+ } catch (Exception e) {
+ throw new FlowableException("Exception while processing Camel
exchange", e);
+ }
+ }
+}
diff --git
a/components/camel-flowable/src/main/java/org/apache/camel/component/flowable/FlowableComponent.java
b/components/camel-flowable/src/main/java/org/apache/camel/component/flowable/FlowableComponent.java
new file mode 100644
index 00000000000..ce18c733996
--- /dev/null
+++
b/components/camel-flowable/src/main/java/org/apache/camel/component/flowable/FlowableComponent.java
@@ -0,0 +1,35 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.flowable;
+
+import java.util.Map;
+
+import org.apache.camel.Endpoint;
+import org.apache.camel.spi.annotations.Component;
+import org.apache.camel.support.DefaultComponent;
+
+@Component("flowable")
+public class FlowableComponent extends DefaultComponent {
+
+ public FlowableComponent() {
+ }
+
+ @Override
+ protected Endpoint createEndpoint(String uri, String remaining,
Map<String, Object> parameters) throws Exception {
+ return new FlowableEndpoint(remaining);
+ }
+}
diff --git
a/components/camel-flowable/src/main/java/org/apache/camel/component/flowable/FlowableConsumer.java
b/components/camel-flowable/src/main/java/org/apache/camel/component/flowable/FlowableConsumer.java
new file mode 100644
index 00000000000..6260f9a3fc6
--- /dev/null
+++
b/components/camel-flowable/src/main/java/org/apache/camel/component/flowable/FlowableConsumer.java
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.flowable;
+
+import org.apache.camel.Processor;
+import org.apache.camel.support.DefaultConsumer;
+
+public class FlowableConsumer extends DefaultConsumer {
+
+ public FlowableConsumer(FlowableEndpoint endpoint, Processor processor) {
+ super(endpoint, processor);
+ }
+
+ @Override
+ protected void doStart() throws Exception {
+ super.doStart();
+ ((FlowableEndpoint) getEndpoint()).addConsumer(this);
+ }
+
+ @Override
+ protected void doStop() throws Exception {
+ super.doStop();
+ ((FlowableEndpoint) getEndpoint()).removeConsumer();
+ }
+}
diff --git
a/components/camel-flowable/src/main/java/org/apache/camel/component/flowable/FlowableEndpoint.java
b/components/camel-flowable/src/main/java/org/apache/camel/component/flowable/FlowableEndpoint.java
new file mode 100644
index 00000000000..4f64689bf17
--- /dev/null
+++
b/components/camel-flowable/src/main/java/org/apache/camel/component/flowable/FlowableEndpoint.java
@@ -0,0 +1,126 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.flowable;
+
+import org.apache.camel.Category;
+import org.apache.camel.Consumer;
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+import org.apache.camel.Producer;
+import org.apache.camel.spi.Metadata;
+import org.apache.camel.spi.UriEndpoint;
+import org.apache.camel.spi.UriPath;
+import org.apache.camel.support.DefaultEndpoint;
+import org.flowable.common.engine.api.FlowableException;
+import org.flowable.eventregistry.impl.EventRegistryEngineConfiguration;
+import org.flowable.eventregistry.model.CamelInboundChannelModel;
+import org.flowable.eventregistry.model.CamelOutboundChannelModel;
+
+/**
+ * Send and receive messages from the Flowable BPMN and CMMN engines.
+ */
+@UriEndpoint(firstVersion = "4.19.0", scheme = "flowable", title = "Flowable",
syntax = "flowable:channelKey",
+ category = { Category.WORKFLOW })
+public class FlowableEndpoint extends DefaultEndpoint {
+
+ private EventRegistryEngineConfiguration eventRegistryEngineConfiguration;
+ private FlowableConsumer flowableConsumer;
+
+ @UriPath
+ @Metadata(required = true)
+ private String channelKey;
+ private CamelInboundChannelModel camelInboundChannel;
+ private CamelOutboundChannelModel camelOutboundChannel;
+
+ public FlowableEndpoint(String channelKey) {
+ this.channelKey = channelKey;
+ }
+
+ public FlowableEndpoint(CamelInboundChannelModel camelInboundChannel,
+ EventRegistryEngineConfiguration
eventRegistryEngineConfiguration) {
+ this.camelInboundChannel = camelInboundChannel;
+ this.eventRegistryEngineConfiguration =
eventRegistryEngineConfiguration;
+ }
+
+ public FlowableEndpoint(CamelOutboundChannelModel camelOutboundChannel,
+ EventRegistryEngineConfiguration
eventRegistryEngineConfiguration) {
+ this.camelOutboundChannel = camelOutboundChannel;
+ this.eventRegistryEngineConfiguration =
eventRegistryEngineConfiguration;
+ }
+
+ public void process(Exchange ex) throws Exception {
+ if (flowableConsumer == null) {
+ throw new FlowableException("Consumer not defined for " +
getEndpointUri());
+ }
+ flowableConsumer.getProcessor().process(ex);
+ }
+
+ @Override
+ public Producer createProducer() throws Exception {
+ return new FlowableProducer(camelInboundChannel, this,
eventRegistryEngineConfiguration);
+ }
+
+ @Override
+ public Consumer createConsumer(Processor processor) throws Exception {
+ return new FlowableConsumer(this, processor);
+ }
+
+ @Override
+ protected String createEndpointUri() {
+ if (channelKey != null) {
+ return "flowable:" + channelKey;
+ } else if (camelInboundChannel != null) {
+ return "flowable:" + camelInboundChannel.getKey();
+ } else {
+ return "flowable:" + camelOutboundChannel.getKey();
+ }
+ }
+
+ protected void addConsumer(FlowableConsumer consumer) {
+ if (flowableConsumer != null) {
+ throw new FlowableException("Consumer already defined for " +
getEndpointUri() + "!");
+ }
+ flowableConsumer = consumer;
+ }
+
+ protected void removeConsumer() {
+ flowableConsumer = null;
+ }
+
+ public String getChannelKey() {
+ return channelKey;
+ }
+
+ /**
+ * The channel key
+ */
+ public void setChannelKey(String channelKey) {
+ this.channelKey = channelKey;
+ }
+
+ public void setCamelInboundChannel(CamelInboundChannelModel
camelInboundChannel) {
+ this.camelInboundChannel = camelInboundChannel;
+ }
+
+ public void setCamelOutboundChannel(CamelOutboundChannelModel
camelOutboundChannel) {
+ this.camelOutboundChannel = camelOutboundChannel;
+ }
+
+ public void
setEventRegistryEngineConfiguration(EventRegistryEngineConfiguration
eventRegistryEngineConfiguration) {
+ this.eventRegistryEngineConfiguration =
eventRegistryEngineConfiguration;
+ }
+}
diff --git
a/components/camel-flowable/src/main/java/org/apache/camel/component/flowable/FlowableProducer.java
b/components/camel-flowable/src/main/java/org/apache/camel/component/flowable/FlowableProducer.java
new file mode 100644
index 00000000000..d58eff3e8ec
--- /dev/null
+++
b/components/camel-flowable/src/main/java/org/apache/camel/component/flowable/FlowableProducer.java
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.flowable;
+
+import org.apache.camel.Endpoint;
+import org.apache.camel.Exchange;
+import org.apache.camel.Message;
+import org.apache.camel.support.DefaultProducer;
+import org.flowable.eventregistry.impl.DefaultInboundEvent;
+import org.flowable.eventregistry.impl.EventRegistryEngineConfiguration;
+import org.flowable.eventregistry.model.CamelInboundChannelModel;
+
+public class FlowableProducer extends DefaultProducer {
+
+ protected CamelInboundChannelModel camelInboundChannel;
+ protected EventRegistryEngineConfiguration
eventRegistryEngineConfiguration;
+
+ public FlowableProducer(CamelInboundChannelModel camelInboundChannel,
Endpoint endpoint,
+ EventRegistryEngineConfiguration
eventRegistryEngineConfiguration) {
+
+ super(endpoint);
+ this.camelInboundChannel = camelInboundChannel;
+ this.eventRegistryEngineConfiguration =
eventRegistryEngineConfiguration;
+ }
+
+ @Override
+ public void process(Exchange exchange) throws Exception {
+ Message message = exchange.getMessage();
+ DefaultInboundEvent inboundEvent = new
DefaultInboundEvent(message.getBody(), message.getHeaders());
+
eventRegistryEngineConfiguration.getEventRegistry().eventReceived(camelInboundChannel,
inboundEvent);
+ }
+}
diff --git
a/components/camel-flowable/src/test/java/org/apache/camel/component/flowable/CamelFlowableTestCase.java
b/components/camel-flowable/src/test/java/org/apache/camel/component/flowable/CamelFlowableTestCase.java
new file mode 100644
index 00000000000..1b12cdfb857
--- /dev/null
+++
b/components/camel-flowable/src/test/java/org/apache/camel/component/flowable/CamelFlowableTestCase.java
@@ -0,0 +1,66 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.flowable;
+
+import java.util.List;
+
+import org.apache.camel.test.junit5.CamelTestSupport;
+import org.flowable.engine.ProcessEngine;
+import org.flowable.engine.ProcessEngineConfiguration;
+import org.flowable.engine.RepositoryService;
+import org.flowable.engine.RuntimeService;
+import org.flowable.engine.TaskService;
+import org.flowable.eventregistry.api.EventDeployment;
+import org.flowable.eventregistry.impl.EventRegistryEngineConfiguration;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+
+public abstract class CamelFlowableTestCase extends CamelTestSupport {
+
+ protected ProcessEngineConfiguration processEngineConfiguration;
+ protected EventRegistryEngineConfiguration
eventRegistryEngineConfiguration;
+ protected RepositoryService repositoryService;
+ protected RuntimeService runtimeService;
+ protected TaskService taskService;
+
+ @BeforeEach
+ public void initialize() {
+ ProcessEngine processEngine =
FlowableEngineUtil.getProcessEngine(context);
+ processEngineConfiguration =
processEngine.getProcessEngineConfiguration();
+ eventRegistryEngineConfiguration =
FlowableEngineUtil.getEventRegistryEngineConfiguration();
+ repositoryService = processEngine.getRepositoryService();
+ runtimeService = processEngine.getRuntimeService();
+ taskService = processEngine.getTaskService();
+ }
+
+ @AfterEach
+ public void tearDown() throws Exception {
+ List<EventDeployment> eventDeployments
+ =
eventRegistryEngineConfiguration.getEventRepositoryService().createDeploymentQuery().list();
+ for (EventDeployment eventDeployment : eventDeployments) {
+
eventRegistryEngineConfiguration.getEventRepositoryService().deleteDeployment(eventDeployment.getId());
+ }
+ }
+
+ protected String deployProcessDefinition(String resource) {
+ return
repositoryService.createDeployment().addClasspathResource(resource).deploy().getId();
+ }
+
+ protected void deleteDeployment(String id) {
+ repositoryService.deleteDeployment(id);
+ }
+}
diff --git
a/components/camel-flowable/src/test/java/org/apache/camel/component/flowable/FlowableEngineUtil.java
b/components/camel-flowable/src/test/java/org/apache/camel/component/flowable/FlowableEngineUtil.java
new file mode 100644
index 00000000000..2900aa6eb30
--- /dev/null
+++
b/components/camel-flowable/src/test/java/org/apache/camel/component/flowable/FlowableEngineUtil.java
@@ -0,0 +1,62 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.flowable;
+
+import org.apache.camel.CamelContext;
+import org.flowable.engine.ProcessEngine;
+import org.flowable.engine.ProcessEngineConfiguration;
+import org.flowable.engine.impl.cfg.StandaloneInMemProcessEngineConfiguration;
+import org.flowable.eventregistry.impl.EventRegistryEngineConfiguration;
+import
org.flowable.eventregistry.impl.configurator.EventRegistryEngineConfigurator;
+
+public class FlowableEngineUtil {
+
+ protected static ProcessEngine processEngine;
+ protected static EventRegistryEngineConfiguration
eventRegistryEngineConfiguration;
+ protected static CamelChannelModelProcessor camelChannelModelProcessor;
+
+ public static ProcessEngine getProcessEngine(CamelContext camelContext) {
+ if (processEngine == null) {
+ buildEngine(camelContext);
+ } else {
+ camelChannelModelProcessor.setCamelContext(camelContext);
+ }
+
+ return processEngine;
+ }
+
+ public static EventRegistryEngineConfiguration
getEventRegistryEngineConfiguration() {
+ return eventRegistryEngineConfiguration;
+ }
+
+ protected static void buildEngine(CamelContext camelContext) {
+ eventRegistryEngineConfiguration = new
EventRegistryEngineConfiguration();
+ eventRegistryEngineConfiguration.setDatabaseSchemaUpdate("true");
+
eventRegistryEngineConfiguration.setEnableEventRegistryChangeDetection(false);
+ camelChannelModelProcessor = new
CamelChannelModelProcessor(camelContext);
+
eventRegistryEngineConfiguration.addChannelModelProcessor(camelChannelModelProcessor);
+
+ EventRegistryEngineConfigurator eventRegistryEngineConfigurator = new
EventRegistryEngineConfigurator();
+
eventRegistryEngineConfigurator.setEventEngineConfiguration(eventRegistryEngineConfiguration);
+
+ ProcessEngineConfiguration processEngineConfiguration = new
StandaloneInMemProcessEngineConfiguration();
+ processEngineConfiguration.setDatabaseSchemaUpdate("true");
+ processEngineConfiguration.setAsyncExecutorActivate(false);
+
processEngineConfiguration.setEventRegistryConfigurator(eventRegistryEngineConfigurator);
+ processEngine = processEngineConfiguration.buildProcessEngine();
+ }
+}
diff --git
a/components/camel-flowable/src/test/java/org/apache/camel/component/flowable/FlowableInboundChannelHeaderTest.java
b/components/camel-flowable/src/test/java/org/apache/camel/component/flowable/FlowableInboundChannelHeaderTest.java
new file mode 100644
index 00000000000..18df1b8e5a6
--- /dev/null
+++
b/components/camel-flowable/src/test/java/org/apache/camel/component/flowable/FlowableInboundChannelHeaderTest.java
@@ -0,0 +1,70 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.flowable;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import org.apache.camel.Exchange;
+import org.flowable.engine.runtime.ProcessInstance;
+import org.flowable.task.api.Task;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+
+public class FlowableInboundChannelHeaderTest extends CamelFlowableTestCase {
+
+ @BeforeEach
+ public void deployEventRegistryModels() throws Exception {
+
eventRegistryEngineConfiguration.getEventRepositoryService().createDeployment()
+ .addClasspathResource("channel/userHeaderChannel.channel")
+ .addClasspathResource("event/userWithHeaderEvent.event")
+ .deploy();
+ }
+
+ @Test
+ public void testStartProcessWithHeaderEvent() throws Exception {
+ String deploymentId =
deployProcessDefinition("process/startWithHeader.bpmn20.xml");
+ try {
+ ObjectNode bodyNode = new ObjectMapper().createObjectNode();
+ bodyNode.put("name", "John Doe");
+ bodyNode.put("age", 23);
+ Exchange exchange =
context.getEndpoint("direct:start").createExchange();
+ exchange.getIn().setBody(bodyNode);
+ exchange.getIn().setHeader("headerProperty1", "headerTestValue");
+ exchange.getIn().setHeader("headerProperty2", 99);
+ template.send("direct:start", exchange);
+
+ ProcessInstance processInstance =
runtimeService.createProcessInstanceQuery()
+ .processDefinitionKey("camelProcess")
+ .singleResult();
+ assertNotNull(processInstance);
+
+ assertEquals("John Doe",
runtimeService.getVariable(processInstance.getId(), "name"));
+ assertEquals(23,
runtimeService.getVariable(processInstance.getId(), "age"));
+ assertEquals("headerTestValue",
runtimeService.getVariable(processInstance.getId(), "header1"));
+ assertEquals(99,
runtimeService.getVariable(processInstance.getId(), "header2"));
+
+ Task task =
taskService.createTaskQuery().processInstanceId(processInstance.getId()).singleResult();
+ assertNotNull(task);
+
+ } finally {
+ repositoryService.deleteDeployment(deploymentId, true);
+ }
+ }
+}
diff --git
a/components/camel-flowable/src/test/java/org/apache/camel/component/flowable/FlowableInboundChannelTest.java
b/components/camel-flowable/src/test/java/org/apache/camel/component/flowable/FlowableInboundChannelTest.java
new file mode 100644
index 00000000000..39abdab4373
--- /dev/null
+++
b/components/camel-flowable/src/test/java/org/apache/camel/component/flowable/FlowableInboundChannelTest.java
@@ -0,0 +1,65 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.flowable;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import org.apache.camel.Exchange;
+import org.flowable.engine.runtime.ProcessInstance;
+import org.flowable.task.api.Task;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+
+public class FlowableInboundChannelTest extends CamelFlowableTestCase {
+
+ @BeforeEach
+ public void deployEventRegistryModels() throws Exception {
+
eventRegistryEngineConfiguration.getEventRepositoryService().createDeployment()
+ .addClasspathResource("channel/userChannel.channel")
+ .addClasspathResource("event/userEvent.event")
+ .deploy();
+ }
+
+ @Test
+ public void testStartProcessWithBasicEvent() throws Exception {
+ String deploymentId =
deployProcessDefinition("process/start.bpmn20.xml");
+ try {
+ ObjectNode bodyNode = new ObjectMapper().createObjectNode();
+ bodyNode.put("name", "John Doe");
+ bodyNode.put("age", 23);
+ Exchange exchange =
context.getEndpoint("direct:start").createExchange();
+ exchange.getIn().setBody(bodyNode);
+ template.send("direct:start", exchange);
+
+ ProcessInstance processInstance
+ =
runtimeService.createProcessInstanceQuery().processDefinitionKey("camelProcess").singleResult();
+ assertNotNull(processInstance);
+
+ assertEquals("John Doe",
runtimeService.getVariable(processInstance.getId(), "name"));
+ assertEquals(23,
runtimeService.getVariable(processInstance.getId(), "age"));
+
+ Task task =
taskService.createTaskQuery().processInstanceId(processInstance.getId()).singleResult();
+ assertNotNull(task);
+
+ } finally {
+ repositoryService.deleteDeployment(deploymentId, true);
+ }
+ }
+}
diff --git
a/components/camel-flowable/src/test/java/org/apache/camel/component/flowable/FlowableOutboundChannelTest.java
b/components/camel-flowable/src/test/java/org/apache/camel/component/flowable/FlowableOutboundChannelTest.java
new file mode 100644
index 00000000000..6e4b548ef57
--- /dev/null
+++
b/components/camel-flowable/src/test/java/org/apache/camel/component/flowable/FlowableOutboundChannelTest.java
@@ -0,0 +1,64 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.flowable;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.flowable.engine.runtime.ProcessInstance;
+import org.flowable.task.api.Task;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+public class FlowableOutboundChannelTest extends CamelFlowableTestCase {
+
+ @BeforeEach
+ public void deployEventRegistryModels() throws Exception {
+
eventRegistryEngineConfiguration.getEventRepositoryService().createDeployment()
+ .addClasspathResource("channel/userOutboundChannel.channel")
+ .addClasspathResource("event/userEvent.event")
+ .deploy();
+ }
+
+ @Test
+ public void testSendBasicEvent() throws Exception {
+ String deploymentId =
deployProcessDefinition("process/sendEvent.bpmn20.xml");
+ try {
+ ProcessInstance processInstance =
runtimeService.createProcessInstanceBuilder().processDefinitionKey("camelProcess")
+ .variable("name", "John Doe")
+ .variable("age", 23)
+ .start();
+
+ assertEquals("John Doe",
runtimeService.getVariable(processInstance.getId(), "name"));
+ assertEquals(23,
runtimeService.getVariable(processInstance.getId(), "age"));
+
+ Task task =
taskService.createTaskQuery().processInstanceId(processInstance.getId()).singleResult();
+ taskService.complete(task.getId());
+
+ MockEndpoint mockEndpoint = (MockEndpoint)
context.getEndpoint("mock:testQueue");
+ assertEquals(1, mockEndpoint.getExchanges().size());
+ String bodyString =
mockEndpoint.getExchanges().get(0).getIn().getBody(String.class);
+ JsonNode bodyNode =
processEngineConfiguration.getObjectMapper().readTree(bodyString);
+ assertEquals("John Doe", bodyNode.get("name").asText());
+ assertEquals(23, bodyNode.get("age").asInt());
+
+ } finally {
+ repositoryService.deleteDeployment(deploymentId, true);
+ }
+ }
+}
diff --git
a/components/camel-flowable/src/test/java/org/apache/camel/component/flowable/FlowableRedeployChannelTest.java
b/components/camel-flowable/src/test/java/org/apache/camel/component/flowable/FlowableRedeployChannelTest.java
new file mode 100644
index 00000000000..0544d22e9bd
--- /dev/null
+++
b/components/camel-flowable/src/test/java/org/apache/camel/component/flowable/FlowableRedeployChannelTest.java
@@ -0,0 +1,76 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.flowable;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import org.apache.camel.Exchange;
+import org.flowable.engine.runtime.ProcessInstance;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+
+public class FlowableRedeployChannelTest extends CamelFlowableTestCase {
+
+ @Test
+ public void testUnregisterChannelModel() throws Exception {
+ String deploymentId =
deployProcessDefinition("process/start.bpmn20.xml");
+ try {
+
eventRegistryEngineConfiguration.getEventRepositoryService().createDeployment()
+ .addClasspathResource("channel/userChannel.channel")
+ .addClasspathResource("event/userEvent.event")
+ .deploy();
+
+ ObjectNode bodyNode = new ObjectMapper().createObjectNode();
+ bodyNode.put("name", "John Doe");
+ bodyNode.put("age", 23);
+ Exchange exchange =
context.getEndpoint("direct:start").createExchange();
+ exchange.getIn().setBody(bodyNode);
+ template.send("direct:start", exchange);
+
+ ProcessInstance processInstance
+ =
runtimeService.createProcessInstanceQuery().processDefinitionKey("camelProcess").singleResult();
+ assertNotNull(processInstance);
+
+ assertEquals("John Doe",
runtimeService.getVariable(processInstance.getId(), "name"));
+ assertEquals(23,
runtimeService.getVariable(processInstance.getId(), "age"));
+
+
eventRegistryEngineConfiguration.getEventRepositoryService().createDeployment()
+ .addClasspathResource("channel/userChannelUpdated.channel")
+ .addClasspathResource("event/userEventUpdated.event")
+ .deploy();
+
+ bodyNode = new ObjectMapper().createObjectNode();
+ bodyNode.put("name", "Jane Doe");
+ bodyNode.put("age", 28);
+ bodyNode.put("address", "Main street 1");
+ assertEquals(null, context.hasEndpoint("direct:start"));
+
+ assertEquals(1,
runtimeService.createProcessInstanceQuery().processDefinitionKey("camelProcess").count());
+
+ exchange =
context.getEndpoint("direct:startUpdated").createExchange();
+ exchange.getIn().setBody(bodyNode);
+ template.send("direct:startUpdated", exchange);
+
+ assertEquals(2,
runtimeService.createProcessInstanceQuery().processDefinitionKey("camelProcess").count());
+
+ } finally {
+ repositoryService.deleteDeployment(deploymentId, true);
+ }
+ }
+}
diff --git
a/components/camel-flowable/src/test/java/org/apache/camel/component/flowable/FlowableSendAndReceiveChannelTest.java
b/components/camel-flowable/src/test/java/org/apache/camel/component/flowable/FlowableSendAndReceiveChannelTest.java
new file mode 100644
index 00000000000..dc9b50a0e4a
--- /dev/null
+++
b/components/camel-flowable/src/test/java/org/apache/camel/component/flowable/FlowableSendAndReceiveChannelTest.java
@@ -0,0 +1,85 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.flowable;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import org.apache.camel.Exchange;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.flowable.engine.runtime.ProcessInstance;
+import org.flowable.task.api.Task;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+public class FlowableSendAndReceiveChannelTest extends CamelFlowableTestCase {
+
+ @BeforeEach
+ public void deployEventRegistryModels() throws Exception {
+
eventRegistryEngineConfiguration.getEventRepositoryService().createDeployment()
+ .addClasspathResource("channel/userOutboundChannel.channel")
+ .addClasspathResource("event/userEvent.event")
+ .addClasspathResource("channel/userInboundChannel.channel")
+ .addClasspathResource("event/userInboundEvent.event")
+ .deploy();
+ }
+
+ @Test
+ public void testSendAndReceiveBasicEvent() throws Exception {
+ String deploymentId =
deployProcessDefinition("process/sendAndReceiveEvent.bpmn20.xml");
+ try {
+ ProcessInstance processInstance =
runtimeService.createProcessInstanceBuilder().processDefinitionKey("camelProcess")
+ .variable("name", "John Doe")
+ .variable("age", 23)
+ .start();
+
+ assertEquals("John Doe",
runtimeService.getVariable(processInstance.getId(), "name"));
+ assertEquals(23,
runtimeService.getVariable(processInstance.getId(), "age"));
+
+ Task task =
taskService.createTaskQuery().processInstanceId(processInstance.getId()).singleResult();
+ taskService.complete(task.getId());
+
+ MockEndpoint mockEndpoint = (MockEndpoint)
context.getEndpoint("mock:testQueue");
+ assertEquals(1, mockEndpoint.getExchanges().size());
+ String bodyString =
mockEndpoint.getExchanges().get(0).getIn().getBody(String.class);
+ JsonNode bodyNode =
processEngineConfiguration.getObjectMapper().readTree(bodyString);
+ assertEquals("John Doe", bodyNode.get("name").asText());
+ assertEquals(23, bodyNode.get("age").asInt());
+
+ ObjectNode sendBodyNode = new ObjectMapper().createObjectNode();
+ sendBodyNode.put("name", "John Doe");
+ sendBodyNode.put("city", "Amsterdam");
+ Exchange exchange =
context.getEndpoint("direct:start").createExchange();
+ exchange.getIn().setBody(sendBodyNode);
+ template.send("direct:start", exchange);
+
+ assertEquals("John Doe",
runtimeService.getVariable(processInstance.getId(), "correlationName"));
+ assertEquals("Amsterdam",
runtimeService.getVariable(processInstance.getId(), "city"));
+
+ task =
taskService.createTaskQuery().processInstanceId(processInstance.getId()).singleResult();
+ assertEquals("userTask2", task.getTaskDefinitionKey());
+ taskService.complete(task.getId());
+
+ assertEquals(0,
runtimeService.createProcessInstanceQuery().processInstanceId(processInstance.getId()).count());
+
+ } finally {
+ repositoryService.deleteDeployment(deploymentId, true);
+ }
+ }
+}
diff --git
a/components/camel-flowable/src/test/resources/channel/userChannel.channel
b/components/camel-flowable/src/test/resources/channel/userChannel.channel
new file mode 100644
index 00000000000..793c6e499f6
--- /dev/null
+++ b/components/camel-flowable/src/test/resources/channel/userChannel.channel
@@ -0,0 +1,11 @@
+{
+ "name": "Camel user channel",
+ "key": "userChannel",
+ "channelType": "inbound",
+ "type": "camel",
+ "sourceUri": "direct:start",
+ "deserializerType": "json",
+ "channelEventKeyDetection": {
+ "fixedValue": "userEvent"
+ }
+}
\ No newline at end of file
diff --git
a/components/camel-flowable/src/test/resources/channel/userChannelUpdated.channel
b/components/camel-flowable/src/test/resources/channel/userChannelUpdated.channel
new file mode 100644
index 00000000000..10cccf947b4
--- /dev/null
+++
b/components/camel-flowable/src/test/resources/channel/userChannelUpdated.channel
@@ -0,0 +1,11 @@
+{
+ "name": "Camel user channel",
+ "key": "userChannel",
+ "channelType": "inbound",
+ "type": "camel",
+ "sourceUri": "direct:startUpdated",
+ "deserializerType": "json",
+ "channelEventKeyDetection": {
+ "fixedValue": "userEvent"
+ }
+}
\ No newline at end of file
diff --git
a/components/camel-flowable/src/test/resources/channel/userHeaderChannel.channel
b/components/camel-flowable/src/test/resources/channel/userHeaderChannel.channel
new file mode 100644
index 00000000000..408e11e7701
--- /dev/null
+++
b/components/camel-flowable/src/test/resources/channel/userHeaderChannel.channel
@@ -0,0 +1,11 @@
+{
+ "name": "Camel user channel",
+ "key": "userHeaderChannel",
+ "channelType": "inbound",
+ "type": "camel",
+ "sourceUri": "direct:start",
+ "deserializerType": "json",
+ "channelEventKeyDetection": {
+ "fixedValue": "userHeaderEvent"
+ }
+}
\ No newline at end of file
diff --git
a/components/camel-flowable/src/test/resources/channel/userInboundChannel.channel
b/components/camel-flowable/src/test/resources/channel/userInboundChannel.channel
new file mode 100644
index 00000000000..fda84be8128
--- /dev/null
+++
b/components/camel-flowable/src/test/resources/channel/userInboundChannel.channel
@@ -0,0 +1,11 @@
+{
+ "name": "Camel user inbound channel",
+ "key": "userInboundChannel",
+ "channelType": "inbound",
+ "type": "camel",
+ "sourceUri": "direct:start",
+ "deserializerType": "json",
+ "channelEventKeyDetection": {
+ "fixedValue": "userInboundEvent"
+ }
+}
\ No newline at end of file
diff --git
a/components/camel-flowable/src/test/resources/channel/userOutboundChannel.channel
b/components/camel-flowable/src/test/resources/channel/userOutboundChannel.channel
new file mode 100644
index 00000000000..514c9a51f95
--- /dev/null
+++
b/components/camel-flowable/src/test/resources/channel/userOutboundChannel.channel
@@ -0,0 +1,8 @@
+{
+ "name": "Camel outbound user channel",
+ "key": "userOutboundChannel",
+ "channelType": "outbound",
+ "type": "camel",
+ "destination": "mock:testQueue",
+ "serializerType": "json"
+}
\ No newline at end of file
diff --git a/components/camel-flowable/src/test/resources/event/userEvent.event
b/components/camel-flowable/src/test/resources/event/userEvent.event
new file mode 100644
index 00000000000..685b69f3844
--- /dev/null
+++ b/components/camel-flowable/src/test/resources/event/userEvent.event
@@ -0,0 +1,14 @@
+{
+ "key": "userEvent",
+ "name": "User Event",
+ "payload": [
+ {
+ "name": "name",
+ "type": "string"
+ },
+ {
+ "name": "age",
+ "type": "integer"
+ }
+ ]
+}
\ No newline at end of file
diff --git
a/components/camel-flowable/src/test/resources/event/userEventUpdated.event
b/components/camel-flowable/src/test/resources/event/userEventUpdated.event
new file mode 100644
index 00000000000..8e546d51191
--- /dev/null
+++ b/components/camel-flowable/src/test/resources/event/userEventUpdated.event
@@ -0,0 +1,18 @@
+{
+ "key": "userEvent",
+ "name": "User Event",
+ "payload": [
+ {
+ "name": "name",
+ "type": "string"
+ },
+ {
+ "name": "age",
+ "type": "integer"
+ },
+ {
+ "name": "address",
+ "type": "string"
+ }
+ ]
+}
\ No newline at end of file
diff --git
a/components/camel-flowable/src/test/resources/event/userInboundEvent.event
b/components/camel-flowable/src/test/resources/event/userInboundEvent.event
new file mode 100644
index 00000000000..b6b54bfefd3
--- /dev/null
+++ b/components/camel-flowable/src/test/resources/event/userInboundEvent.event
@@ -0,0 +1,15 @@
+{
+ "key": "userInboundEvent",
+ "name": "User Inbound Event",
+ "payload": [
+ {
+ "name": "name",
+ "correlationParameter":true,
+ "type": "string"
+ },
+ {
+ "name": "city",
+ "type": "string"
+ }
+ ]
+}
\ No newline at end of file
diff --git
a/components/camel-flowable/src/test/resources/event/userWithHeaderEvent.event
b/components/camel-flowable/src/test/resources/event/userWithHeaderEvent.event
new file mode 100644
index 00000000000..14620f806b8
--- /dev/null
+++
b/components/camel-flowable/src/test/resources/event/userWithHeaderEvent.event
@@ -0,0 +1,24 @@
+{
+ "key": "userHeaderEvent",
+ "name": "User Header Event",
+ "payload": [
+ {
+ "name": "headerProperty1",
+ "type": "string",
+ "header": true
+ },
+ {
+ "name": "headerProperty2",
+ "type": "integer",
+ "header": true
+ },
+ {
+ "name": "name",
+ "type": "string"
+ },
+ {
+ "name": "age",
+ "type": "integer"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/components/camel-flowable/src/test/resources/log4j2.properties
b/components/camel-flowable/src/test/resources/log4j2.properties
new file mode 100644
index 00000000000..c4718d627b7
--- /dev/null
+++ b/components/camel-flowable/src/test/resources/log4j2.properties
@@ -0,0 +1,28 @@
+## ---------------------------------------------------------------------------
+## Licensed to the Apache Software Foundation (ASF) under one or more
+## contributor license agreements. See the NOTICE file distributed with
+## this work for additional information regarding copyright ownership.
+## The ASF licenses this file to You under the Apache License, Version 2.0
+## (the "License"); you may not use this file except in compliance with
+## the License. You may obtain a copy of the License at
+##
+## http://www.apache.org/licenses/LICENSE-2.0
+##
+## Unless required by applicable law or agreed to in writing, software
+## distributed under the License is distributed on an "AS IS" BASIS,
+## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+## See the License for the specific language governing permissions and
+## limitations under the License.
+## ---------------------------------------------------------------------------
+
+appender.console.type = Console
+appender.console.name = console
+appender.console.layout.type = PatternLayout
+appender.console.layout.pattern = %d %-5p %c{1} - %m %n
+appender.file.type = File
+appender.file.name = file
+appender.file.fileName = target/camel-flowable-test.log
+appender.file.layout.type = PatternLayout
+appender.file.layout.pattern = %d %-5p %c{1} - %m %n
+rootLogger.level = info
+rootLogger.appenderRef.file.ref = file
diff --git
a/components/camel-flowable/src/test/resources/process/sendAndReceiveEvent.bpmn20.xml
b/components/camel-flowable/src/test/resources/process/sendAndReceiveEvent.bpmn20.xml
new file mode 100644
index 00000000000..4391bd89fc1
--- /dev/null
+++
b/components/camel-flowable/src/test/resources/process/sendAndReceiveEvent.bpmn20.xml
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+-->
+<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"
+ xmlns:flowable="http://flowable.org/bpmn"
+ targetNamespace="Examples"
+ xmlns:tns="Examples">
+
+ <process id="camelProcess">
+
+ <startEvent id="theStart" />
+
+ <sequenceFlow id="flow1" sourceRef="theStart" targetRef="userTask1"/>
+
+ <userTask id="userTask1" />
+
+ <sequenceFlow id="flow2" sourceRef="userTask1" targetRef="task1"/>
+
+ <serviceTask id="task1" name="Send event task"
flowable:type="send-event" flowable:triggerable="true">
+ <extensionElements>
+
<flowable:channelKey><![CDATA[userOutboundChannel]]></flowable:channelKey>
+ <flowable:eventType><![CDATA[userEvent]]></flowable:eventType>
+ <flowable:eventInParameter sourceExpression="${name}"
target="name" />
+ <flowable:eventInParameter sourceExpression="${age}"
target="age" />
+ <flowable:sendSynchronously>true</flowable:sendSynchronously>
+
<flowable:triggerChannelKey><![CDATA[userInboundChannel]]></flowable:triggerChannelKey>
+
<flowable:triggerEventType><![CDATA[userInboundEvent]]></flowable:triggerEventType>
+ <flowable:triggerEventCorrelationParameter name="name"
value="${name}" />
+ <flowable:eventOutParameter source="name"
target="correlationName" />
+ <flowable:eventOutParameter source="city" target="city" />
+ </extensionElements>
+ </serviceTask>
+
+ <sequenceFlow id="flow3" sourceRef="task1" targetRef="userTask2"/>
+
+ <userTask id="userTask2" />
+
+ <sequenceFlow id="flow4" sourceRef="userTask2" targetRef="end" />
+
+ <endEvent id="end" />
+
+ </process>
+
+</definitions>
\ No newline at end of file
diff --git
a/components/camel-flowable/src/test/resources/process/sendEvent.bpmn20.xml
b/components/camel-flowable/src/test/resources/process/sendEvent.bpmn20.xml
new file mode 100644
index 00000000000..bf4e153ac56
--- /dev/null
+++ b/components/camel-flowable/src/test/resources/process/sendEvent.bpmn20.xml
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+-->
+<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"
+ xmlns:flowable="http://flowable.org/bpmn"
+ targetNamespace="Examples"
+ xmlns:tns="Examples">
+
+ <process id="camelProcess">
+
+ <startEvent id="theStart" />
+
+ <sequenceFlow id="flow1" sourceRef="theStart" targetRef="userTask1"/>
+
+ <userTask id="userTask1" />
+
+ <sequenceFlow id="flow2" sourceRef="userTask1" targetRef="task1"/>
+
+ <serviceTask id="task1" name="Send event task"
flowable:type="send-event">
+ <extensionElements>
+
<flowable:channelKey><![CDATA[userOutboundChannel]]></flowable:channelKey>
+ <flowable:eventType><![CDATA[userEvent]]></flowable:eventType>
+ <flowable:eventInParameter sourceExpression="${name}"
target="name" />
+ <flowable:eventInParameter sourceExpression="${age}"
target="age" />
+ <flowable:sendSynchronously>true</flowable:sendSynchronously>
+ </extensionElements>
+ </serviceTask>
+
+ <sequenceFlow id="flow3" sourceRef="task1" targetRef="userTask2"/>
+
+ <userTask id="userTask2" />
+
+ <sequenceFlow id="flow4" sourceRef="userTask2" targetRef="end" />
+
+ <endEvent id="end" />
+
+ </process>
+
+</definitions>
\ No newline at end of file
diff --git
a/components/camel-flowable/src/test/resources/process/start.bpmn20.xml
b/components/camel-flowable/src/test/resources/process/start.bpmn20.xml
new file mode 100644
index 00000000000..58f11b963c9
--- /dev/null
+++ b/components/camel-flowable/src/test/resources/process/start.bpmn20.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+-->
+<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"
+ xmlns:flowable="http://flowable.org/bpmn"
+ targetNamespace="Examples"
+ xmlns:tns="Examples">
+
+ <process id="camelProcess">
+
+ <startEvent id="theStart">
+ <extensionElements>
+ <flowable:eventType>userEvent</flowable:eventType>
+ <flowable:eventOutParameter source="name" target="name" />
+ <flowable:eventOutParameter source="age" target="age" />
+ </extensionElements>
+ </startEvent>
+
+ <sequenceFlow id="flow1" sourceRef="theStart" targetRef="userTask"/>
+
+ <userTask id="userTask" />
+ <sequenceFlow id="flow2" sourceRef="userTask" targetRef="end" />
+
+ <endEvent id="end" />
+
+ </process>
+
+</definitions>
\ No newline at end of file
diff --git
a/components/camel-flowable/src/test/resources/process/startWithHeader.bpmn20.xml
b/components/camel-flowable/src/test/resources/process/startWithHeader.bpmn20.xml
new file mode 100644
index 00000000000..87a00f17926
--- /dev/null
+++
b/components/camel-flowable/src/test/resources/process/startWithHeader.bpmn20.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+-->
+<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"
+ xmlns:flowable="http://flowable.org/bpmn"
+ targetNamespace="Examples"
+ xmlns:tns="Examples">
+
+ <process id="camelProcess">
+
+ <startEvent id="theStart">
+ <extensionElements>
+ <flowable:eventType>userHeaderEvent</flowable:eventType>
+ <flowable:eventOutParameter source="name" target="name" />
+ <flowable:eventOutParameter source="age" target="age" />
+ <flowable:eventOutParameter source="headerProperty1"
target="header1" />
+ <flowable:eventOutParameter source="headerProperty2"
target="header2" />
+ </extensionElements>
+ </startEvent>
+
+ <sequenceFlow id="flow1" sourceRef="theStart" targetRef="userTask"/>
+
+ <userTask id="userTask" />
+ <sequenceFlow id="flow2" sourceRef="userTask" targetRef="end" />
+
+ <endEvent id="end" />
+
+ </process>
+
+</definitions>
\ No newline at end of file
diff --git
a/components/camel-knative/camel-knative-http/src/main/docs/knative-http-component.adoc
b/components/camel-knative/camel-knative-http/src/main/docs/knative-http-component.adoc
index aabd23ccd4a..b129096ada3 100644
---
a/components/camel-knative/camel-knative-http/src/main/docs/knative-http-component.adoc
+++
b/components/camel-knative/camel-knative-http/src/main/docs/knative-http-component.adoc
@@ -167,4 +167,4 @@ spec:
value: "true"
- name: CAMEL_KNATIVE_CLIENT_SSL_KEY_CERT_PATH
value: /knative-certs/knative-eventing-bundle.pem
-----
+----
\ No newline at end of file
diff --git
a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/client/PubSubApiClient.java
b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/client/PubSubApiClient.java
index ed3c911a0d0..301d72b3484 100644
---
a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/client/PubSubApiClient.java
+++
b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/client/PubSubApiClient.java
@@ -110,7 +110,6 @@ public class PubSubApiClient extends ServiceSupport {
this.backoffIncrement = backoffIncrement;
this.reconnectDelay = backoffIncrement;
this.allowUseProxyServer = allowUseProxyServer;
-
}
public
List<org.apache.camel.component.salesforce.api.dto.pubsub.PublishResult>
publishMessage(
diff --git a/components/pom.xml b/components/pom.xml
index 823dd239e60..e865a52f2a4 100644
--- a/components/pom.xml
+++ b/components/pom.xml
@@ -134,6 +134,7 @@
<module>camel-file-watch</module>
<module>camel-flatpack</module>
<module>camel-flink</module>
+ <module>camel-flowable</module>
<module>camel-fop</module>
<module>camel-freemarker</module>
<module>camel-ftp</module>
diff --git
a/core/camel-main/src/generated/resources/org/apache/camel/main/components.properties
b/core/camel-main/src/generated/resources/org/apache/camel/main/components.properties
index 256a1d470c4..87d12ba79bf 100644
---
a/core/camel-main/src/generated/resources/org/apache/camel/main/components.properties
+++
b/core/camel-main/src/generated/resources/org/apache/camel/main/components.properties
@@ -104,6 +104,7 @@ file
file-watch
flatpack
flink
+flowable
fop
freemarker
ftp
diff --git a/docs/components/modules/ROOT/examples/json/flowable.json
b/docs/components/modules/ROOT/examples/json/flowable.json
new file mode 120000
index 00000000000..fbfb9450ca4
--- /dev/null
+++ b/docs/components/modules/ROOT/examples/json/flowable.json
@@ -0,0 +1 @@
+../../../../../../components/camel-flowable/src/generated/resources/META-INF/org/apache/camel/component/flowable/flowable.json
\ No newline at end of file
diff --git a/docs/components/modules/ROOT/nav.adoc
b/docs/components/modules/ROOT/nav.adoc
index 82a33462c5d..74d6e9db78f 100644
--- a/docs/components/modules/ROOT/nav.adoc
+++ b/docs/components/modules/ROOT/nav.adoc
@@ -116,6 +116,7 @@
** xref:file-watch-component.adoc[File Watch]
** xref:flatpack-component.adoc[Flatpack]
** xref:flink-component.adoc[Flink]
+** xref:flowable-component.adoc[Flowable]
** xref:fop-component.adoc[FOP]
** xref:freemarker-component.adoc[Freemarker]
** xref:ftp-component.adoc[FTP]
diff --git a/docs/components/modules/ROOT/pages/flowable-component.adoc
b/docs/components/modules/ROOT/pages/flowable-component.adoc
new file mode 120000
index 00000000000..b164c17ef43
--- /dev/null
+++ b/docs/components/modules/ROOT/pages/flowable-component.adoc
@@ -0,0 +1 @@
+../../../../../components/camel-flowable/src/main/docs/flowable-component.adoc
\ No newline at end of file
diff --git
a/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/ComponentsBuilderFactory.java
b/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/ComponentsBuilderFactory.java
index 493e569a980..f48a23e61a5 100644
---
a/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/ComponentsBuilderFactory.java
+++
b/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/ComponentsBuilderFactory.java
@@ -1453,6 +1453,19 @@ public interface ComponentsBuilderFactory {
static FlinkComponentBuilderFactory.FlinkComponentBuilder flink() {
return FlinkComponentBuilderFactory.flink();
}
+ /**
+ * Flowable (camel-flowable)
+ * Send and receive messages from the Flowable BPMN and CMMN engines.
+ *
+ * Category: workflow
+ * Since: 4.19
+ * Maven coordinates: org.apache.camel:camel-flowable
+ *
+ * @return the dsl builder
+ */
+ static FlowableComponentBuilderFactory.FlowableComponentBuilder flowable()
{
+ return FlowableComponentBuilderFactory.flowable();
+ }
/**
* FOP (camel-fop)
* Render messages into PDF and other output formats supported by Apache
diff --git
a/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/FlowableComponentBuilderFactory.java
b/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/FlowableComponentBuilderFactory.java
new file mode 100644
index 00000000000..ff972dd40d1
--- /dev/null
+++
b/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/FlowableComponentBuilderFactory.java
@@ -0,0 +1,149 @@
+/* Generated by camel build tools - do NOT edit this file! */
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.builder.component.dsl;
+
+import javax.annotation.processing.Generated;
+import org.apache.camel.Component;
+import org.apache.camel.builder.component.AbstractComponentBuilder;
+import org.apache.camel.builder.component.ComponentBuilder;
+import org.apache.camel.component.flowable.FlowableComponent;
+
+/**
+ * Send and receive messages from the Flowable BPMN and CMMN engines.
+ *
+ * Generated by camel build tools - do NOT edit this file!
+ */
+@Generated("org.apache.camel.maven.packaging.ComponentDslMojo")
+public interface FlowableComponentBuilderFactory {
+
+ /**
+ * Flowable (camel-flowable)
+ * Send and receive messages from the Flowable BPMN and CMMN engines.
+ *
+ * Category: workflow
+ * Since: 4.19
+ * Maven coordinates: org.apache.camel:camel-flowable
+ *
+ * @return the dsl builder
+ */
+ static FlowableComponentBuilder flowable() {
+ return new FlowableComponentBuilderImpl();
+ }
+
+ /**
+ * Builder for the Flowable component.
+ */
+ interface FlowableComponentBuilder extends
ComponentBuilder<FlowableComponent> {
+
+
+ /**
+ * Allows for bridging the consumer to the Camel routing Error Handler,
+ * which mean any exceptions (if possible) occurred while the Camel
+ * consumer is trying to pickup incoming messages, or the likes, will
+ * now be processed as a message and handled by the routing Error
+ * Handler. Important: This is only possible if the 3rd party component
+ * allows Camel to be alerted if an exception was thrown. Some
+ * components handle this internally only, and therefore
+ * bridgeErrorHandler is not possible. In other situations we may
+ * improve the Camel component to hook into the 3rd party component and
+ * make this possible for future releases. By default the consumer will
+ * use the org.apache.camel.spi.ExceptionHandler to deal with
+ * exceptions, that will be logged at WARN or ERROR level and ignored.
+ *
+ * The option is a: <code>boolean</code> type.
+ *
+ * Default: false
+ * Group: consumer
+ *
+ * @param bridgeErrorHandler the value to set
+ * @return the dsl builder
+ */
+ default FlowableComponentBuilder bridgeErrorHandler(boolean
bridgeErrorHandler) {
+ doSetProperty("bridgeErrorHandler", bridgeErrorHandler);
+ return this;
+ }
+
+
+ /**
+ * Whether the producer should be started lazy (on the first message).
+ * By starting lazy you can use this to allow CamelContext and routes
to
+ * startup in situations where a producer may otherwise fail during
+ * starting and cause the route to fail being started. By deferring
this
+ * startup to be lazy then the startup failure can be handled during
+ * routing messages via Camel's routing error handlers. Beware that
when
+ * the first message is processed then creating and starting the
+ * producer may take a little time and prolong the total processing
time
+ * of the processing.
+ *
+ * The option is a: <code>boolean</code> type.
+ *
+ * Default: false
+ * Group: producer
+ *
+ * @param lazyStartProducer the value to set
+ * @return the dsl builder
+ */
+ default FlowableComponentBuilder lazyStartProducer(boolean
lazyStartProducer) {
+ doSetProperty("lazyStartProducer", lazyStartProducer);
+ return this;
+ }
+
+
+ /**
+ * Whether autowiring is enabled. This is used for automatic autowiring
+ * options (the option must be marked as autowired) by looking up in
the
+ * registry to find if there is a single instance of matching type,
+ * which then gets configured on the component. This can be used for
+ * automatic configuring JDBC data sources, JMS connection factories,
+ * AWS Clients, etc.
+ *
+ * The option is a: <code>boolean</code> type.
+ *
+ * Default: true
+ * Group: advanced
+ *
+ * @param autowiredEnabled the value to set
+ * @return the dsl builder
+ */
+ default FlowableComponentBuilder autowiredEnabled(boolean
autowiredEnabled) {
+ doSetProperty("autowiredEnabled", autowiredEnabled);
+ return this;
+ }
+ }
+
+ class FlowableComponentBuilderImpl
+ extends AbstractComponentBuilder<FlowableComponent>
+ implements FlowableComponentBuilder {
+ @Override
+ protected FlowableComponent buildConcreteComponent() {
+ return new FlowableComponent();
+ }
+ @Override
+ protected boolean setPropertyOnComponent(
+ Component component,
+ String name,
+ Object value) {
+ switch (name) {
+ case "bridgeErrorHandler": ((FlowableComponent)
component).setBridgeErrorHandler((boolean) value); return true;
+ case "lazyStartProducer": ((FlowableComponent)
component).setLazyStartProducer((boolean) value); return true;
+ case "autowiredEnabled": ((FlowableComponent)
component).setAutowiredEnabled((boolean) value); return true;
+ default: return false;
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git
a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/EndpointBuilderFactory.java
b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/EndpointBuilderFactory.java
index 9548121ba0a..ede37cfa690 100644
---
a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/EndpointBuilderFactory.java
+++
b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/EndpointBuilderFactory.java
@@ -116,6 +116,7 @@ public interface EndpointBuilderFactory
org.apache.camel.builder.endpoint.dsl.FilesEndpointBuilderFactory.FilesBuilders,
org.apache.camel.builder.endpoint.dsl.FlatpackEndpointBuilderFactory.FlatpackBuilders,
org.apache.camel.builder.endpoint.dsl.FlinkEndpointBuilderFactory.FlinkBuilders,
+
org.apache.camel.builder.endpoint.dsl.FlowableEndpointBuilderFactory.FlowableBuilders,
org.apache.camel.builder.endpoint.dsl.FopEndpointBuilderFactory.FopBuilders,
org.apache.camel.builder.endpoint.dsl.FreemarkerEndpointBuilderFactory.FreemarkerBuilders,
org.apache.camel.builder.endpoint.dsl.FtpEndpointBuilderFactory.FtpBuilders,
diff --git
a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/EndpointBuilders.java
b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/EndpointBuilders.java
index a1cb5da9f58..46ddcbb6a8e 100644
---
a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/EndpointBuilders.java
+++
b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/EndpointBuilders.java
@@ -113,6 +113,7 @@ public interface EndpointBuilders
org.apache.camel.builder.endpoint.dsl.FilesEndpointBuilderFactory,
org.apache.camel.builder.endpoint.dsl.FlatpackEndpointBuilderFactory,
org.apache.camel.builder.endpoint.dsl.FlinkEndpointBuilderFactory,
+
org.apache.camel.builder.endpoint.dsl.FlowableEndpointBuilderFactory,
org.apache.camel.builder.endpoint.dsl.FopEndpointBuilderFactory,
org.apache.camel.builder.endpoint.dsl.FreemarkerEndpointBuilderFactory,
org.apache.camel.builder.endpoint.dsl.FtpEndpointBuilderFactory,
diff --git
a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/StaticEndpointBuilders.java
b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/StaticEndpointBuilders.java
index 227974786f0..c80bc1af520 100644
---
a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/StaticEndpointBuilders.java
+++
b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/StaticEndpointBuilders.java
@@ -4677,6 +4677,46 @@ public class StaticEndpointBuilders {
public static FlinkEndpointBuilderFactory.FlinkEndpointBuilder
flink(String componentName, String path) {
return FlinkEndpointBuilderFactory.endpointBuilder(componentName,
path);
}
+ /**
+ * Flowable (camel-flowable)
+ * Send and receive messages from the Flowable BPMN and CMMN engines.
+ *
+ * Category: workflow
+ * Since: 4.19
+ * Maven coordinates: org.apache.camel:camel-flowable
+ *
+ * Syntax: <code>flowable:channelKey</code>
+ *
+ * Path parameter: channelKey (required)
+ * The channel key
+ *
+ * @param path channelKey
+ * @return the dsl builder
+ */
+ public static FlowableEndpointBuilderFactory.FlowableEndpointBuilder
flowable(String path) {
+ return flowable("flowable", path);
+ }
+ /**
+ * Flowable (camel-flowable)
+ * Send and receive messages from the Flowable BPMN and CMMN engines.
+ *
+ * Category: workflow
+ * Since: 4.19
+ * Maven coordinates: org.apache.camel:camel-flowable
+ *
+ * Syntax: <code>flowable:channelKey</code>
+ *
+ * Path parameter: channelKey (required)
+ * The channel key
+ *
+ * @param componentName to use a custom component name for the endpoint
+ * instead of the default name
+ * @param path channelKey
+ * @return the dsl builder
+ */
+ public static FlowableEndpointBuilderFactory.FlowableEndpointBuilder
flowable(String componentName, String path) {
+ return FlowableEndpointBuilderFactory.endpointBuilder(componentName,
path);
+ }
/**
* FOP (camel-fop)
* Render messages into PDF and other output formats supported by Apache
diff --git
a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/FlowableEndpointBuilderFactory.java
b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/FlowableEndpointBuilderFactory.java
new file mode 100644
index 00000000000..6d403383dfb
--- /dev/null
+++
b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/FlowableEndpointBuilderFactory.java
@@ -0,0 +1,321 @@
+/* Generated by camel build tools - do NOT edit this file! */
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.builder.endpoint.dsl;
+
+import java.util.*;
+import java.util.concurrent.*;
+import java.util.function.*;
+import java.util.stream.*;
+import javax.annotation.processing.Generated;
+import org.apache.camel.builder.EndpointConsumerBuilder;
+import org.apache.camel.builder.EndpointProducerBuilder;
+import org.apache.camel.builder.endpoint.AbstractEndpointBuilder;
+
+/**
+ * Send and receive messages from the Flowable BPMN and CMMN engines.
+ *
+ * Generated by camel build tools - do NOT edit this file!
+ */
+@Generated("org.apache.camel.maven.packaging.EndpointDslMojo")
+public interface FlowableEndpointBuilderFactory {
+
+ /**
+ * Builder for endpoint consumers for the Flowable component.
+ */
+ public interface FlowableEndpointConsumerBuilder
+ extends
+ EndpointConsumerBuilder {
+ default AdvancedFlowableEndpointConsumerBuilder advanced() {
+ return (AdvancedFlowableEndpointConsumerBuilder) this;
+ }
+ }
+
+ /**
+ * Advanced builder for endpoint consumers for the Flowable component.
+ */
+ public interface AdvancedFlowableEndpointConsumerBuilder
+ extends
+ EndpointConsumerBuilder {
+ default FlowableEndpointConsumerBuilder basic() {
+ return (FlowableEndpointConsumerBuilder) this;
+ }
+ /**
+ * Allows for bridging the consumer to the Camel routing Error Handler,
+ * which mean any exceptions (if possible) occurred while the Camel
+ * consumer is trying to pickup incoming messages, or the likes, will
+ * now be processed as a message and handled by the routing Error
+ * Handler. Important: This is only possible if the 3rd party component
+ * allows Camel to be alerted if an exception was thrown. Some
+ * components handle this internally only, and therefore
+ * bridgeErrorHandler is not possible. In other situations we may
+ * improve the Camel component to hook into the 3rd party component and
+ * make this possible for future releases. By default the consumer will
+ * use the org.apache.camel.spi.ExceptionHandler to deal with
+ * exceptions, that will be logged at WARN or ERROR level and ignored.
+ *
+ * The option is a: <code>boolean</code> type.
+ *
+ * Default: false
+ * Group: consumer (advanced)
+ *
+ * @param bridgeErrorHandler the value to set
+ * @return the dsl builder
+ */
+ default AdvancedFlowableEndpointConsumerBuilder
bridgeErrorHandler(boolean bridgeErrorHandler) {
+ doSetProperty("bridgeErrorHandler", bridgeErrorHandler);
+ return this;
+ }
+ /**
+ * Allows for bridging the consumer to the Camel routing Error Handler,
+ * which mean any exceptions (if possible) occurred while the Camel
+ * consumer is trying to pickup incoming messages, or the likes, will
+ * now be processed as a message and handled by the routing Error
+ * Handler. Important: This is only possible if the 3rd party component
+ * allows Camel to be alerted if an exception was thrown. Some
+ * components handle this internally only, and therefore
+ * bridgeErrorHandler is not possible. In other situations we may
+ * improve the Camel component to hook into the 3rd party component and
+ * make this possible for future releases. By default the consumer will
+ * use the org.apache.camel.spi.ExceptionHandler to deal with
+ * exceptions, that will be logged at WARN or ERROR level and ignored.
+ *
+ * The option will be converted to a <code>boolean</code> type.
+ *
+ * Default: false
+ * Group: consumer (advanced)
+ *
+ * @param bridgeErrorHandler the value to set
+ * @return the dsl builder
+ */
+ default AdvancedFlowableEndpointConsumerBuilder
bridgeErrorHandler(String bridgeErrorHandler) {
+ doSetProperty("bridgeErrorHandler", bridgeErrorHandler);
+ return this;
+ }
+ /**
+ * To let the consumer use a custom ExceptionHandler. Notice if the
+ * option bridgeErrorHandler is enabled then this option is not in use.
+ * By default the consumer will deal with exceptions, that will be
+ * logged at WARN or ERROR level and ignored.
+ *
+ * The option is a: <code>org.apache.camel.spi.ExceptionHandler</code>
+ * type.
+ *
+ * Group: consumer (advanced)
+ *
+ * @param exceptionHandler the value to set
+ * @return the dsl builder
+ */
+ default AdvancedFlowableEndpointConsumerBuilder
exceptionHandler(org.apache.camel.spi.ExceptionHandler exceptionHandler) {
+ doSetProperty("exceptionHandler", exceptionHandler);
+ return this;
+ }
+ /**
+ * To let the consumer use a custom ExceptionHandler. Notice if the
+ * option bridgeErrorHandler is enabled then this option is not in use.
+ * By default the consumer will deal with exceptions, that will be
+ * logged at WARN or ERROR level and ignored.
+ *
+ * The option will be converted to a
+ * <code>org.apache.camel.spi.ExceptionHandler</code> type.
+ *
+ * Group: consumer (advanced)
+ *
+ * @param exceptionHandler the value to set
+ * @return the dsl builder
+ */
+ default AdvancedFlowableEndpointConsumerBuilder
exceptionHandler(String exceptionHandler) {
+ doSetProperty("exceptionHandler", exceptionHandler);
+ return this;
+ }
+ /**
+ * Sets the exchange pattern when the consumer creates an exchange.
+ *
+ * The option is a: <code>org.apache.camel.ExchangePattern</code> type.
+ *
+ * Group: consumer (advanced)
+ *
+ * @param exchangePattern the value to set
+ * @return the dsl builder
+ */
+ default AdvancedFlowableEndpointConsumerBuilder
exchangePattern(org.apache.camel.ExchangePattern exchangePattern) {
+ doSetProperty("exchangePattern", exchangePattern);
+ return this;
+ }
+ /**
+ * Sets the exchange pattern when the consumer creates an exchange.
+ *
+ * The option will be converted to a
+ * <code>org.apache.camel.ExchangePattern</code> type.
+ *
+ * Group: consumer (advanced)
+ *
+ * @param exchangePattern the value to set
+ * @return the dsl builder
+ */
+ default AdvancedFlowableEndpointConsumerBuilder exchangePattern(String
exchangePattern) {
+ doSetProperty("exchangePattern", exchangePattern);
+ return this;
+ }
+ }
+
+ /**
+ * Builder for endpoint producers for the Flowable component.
+ */
+ public interface FlowableEndpointProducerBuilder
+ extends
+ EndpointProducerBuilder {
+ default AdvancedFlowableEndpointProducerBuilder advanced() {
+ return (AdvancedFlowableEndpointProducerBuilder) this;
+ }
+
+ }
+
+ /**
+ * Advanced builder for endpoint producers for the Flowable component.
+ */
+ public interface AdvancedFlowableEndpointProducerBuilder extends
EndpointProducerBuilder {
+ default FlowableEndpointProducerBuilder basic() {
+ return (FlowableEndpointProducerBuilder) this;
+ }
+
+ /**
+ * Whether the producer should be started lazy (on the first message).
+ * By starting lazy you can use this to allow CamelContext and routes
to
+ * startup in situations where a producer may otherwise fail during
+ * starting and cause the route to fail being started. By deferring
this
+ * startup to be lazy then the startup failure can be handled during
+ * routing messages via Camel's routing error handlers. Beware that
when
+ * the first message is processed then creating and starting the
+ * producer may take a little time and prolong the total processing
time
+ * of the processing.
+ *
+ * The option is a: <code>boolean</code> type.
+ *
+ * Default: false
+ * Group: producer (advanced)
+ *
+ * @param lazyStartProducer the value to set
+ * @return the dsl builder
+ */
+ default AdvancedFlowableEndpointProducerBuilder
lazyStartProducer(boolean lazyStartProducer) {
+ doSetProperty("lazyStartProducer", lazyStartProducer);
+ return this;
+ }
+ /**
+ * Whether the producer should be started lazy (on the first message).
+ * By starting lazy you can use this to allow CamelContext and routes
to
+ * startup in situations where a producer may otherwise fail during
+ * starting and cause the route to fail being started. By deferring
this
+ * startup to be lazy then the startup failure can be handled during
+ * routing messages via Camel's routing error handlers. Beware that
when
+ * the first message is processed then creating and starting the
+ * producer may take a little time and prolong the total processing
time
+ * of the processing.
+ *
+ * The option will be converted to a <code>boolean</code> type.
+ *
+ * Default: false
+ * Group: producer (advanced)
+ *
+ * @param lazyStartProducer the value to set
+ * @return the dsl builder
+ */
+ default AdvancedFlowableEndpointProducerBuilder
lazyStartProducer(String lazyStartProducer) {
+ doSetProperty("lazyStartProducer", lazyStartProducer);
+ return this;
+ }
+ }
+
+ /**
+ * Builder for endpoint for the Flowable component.
+ */
+ public interface FlowableEndpointBuilder
+ extends
+ FlowableEndpointConsumerBuilder,
+ FlowableEndpointProducerBuilder {
+ default AdvancedFlowableEndpointBuilder advanced() {
+ return (AdvancedFlowableEndpointBuilder) this;
+ }
+
+ }
+
+ /**
+ * Advanced builder for endpoint for the Flowable component.
+ */
+ public interface AdvancedFlowableEndpointBuilder
+ extends
+ AdvancedFlowableEndpointConsumerBuilder,
+ AdvancedFlowableEndpointProducerBuilder {
+ default FlowableEndpointBuilder basic() {
+ return (FlowableEndpointBuilder) this;
+ }
+
+ }
+
+ public interface FlowableBuilders {
+ /**
+ * Flowable (camel-flowable)
+ * Send and receive messages from the Flowable BPMN and CMMN engines.
+ *
+ * Category: workflow
+ * Since: 4.19
+ * Maven coordinates: org.apache.camel:camel-flowable
+ *
+ * Syntax: <code>flowable:channelKey</code>
+ *
+ * Path parameter: channelKey (required)
+ * The channel key
+ *
+ * @param path channelKey
+ * @return the dsl builder
+ */
+ default FlowableEndpointBuilder flowable(String path) {
+ return FlowableEndpointBuilderFactory.endpointBuilder("flowable",
path);
+ }
+ /**
+ * Flowable (camel-flowable)
+ * Send and receive messages from the Flowable BPMN and CMMN engines.
+ *
+ * Category: workflow
+ * Since: 4.19
+ * Maven coordinates: org.apache.camel:camel-flowable
+ *
+ * Syntax: <code>flowable:channelKey</code>
+ *
+ * Path parameter: channelKey (required)
+ * The channel key
+ *
+ * @param componentName to use a custom component name for the endpoint
+ * instead of the default name
+ * @param path channelKey
+ * @return the dsl builder
+ */
+ default FlowableEndpointBuilder flowable(String componentName, String
path) {
+ return
FlowableEndpointBuilderFactory.endpointBuilder(componentName, path);
+ }
+
+ }
+ static FlowableEndpointBuilder endpointBuilder(String componentName,
String path) {
+ class FlowableEndpointBuilderImpl extends AbstractEndpointBuilder
implements FlowableEndpointBuilder, AdvancedFlowableEndpointBuilder {
+ public FlowableEndpointBuilderImpl(String path) {
+ super(componentName, path);
+ }
+ }
+ return new FlowableEndpointBuilderImpl(path);
+ }
+}
\ No newline at end of file
diff --git
a/dsl/camel-kamelet-main/src/generated/resources/camel-component-known-dependencies.properties
b/dsl/camel-kamelet-main/src/generated/resources/camel-component-known-dependencies.properties
index a7b83d9c9f2..e99da026437 100644
---
a/dsl/camel-kamelet-main/src/generated/resources/camel-component-known-dependencies.properties
+++
b/dsl/camel-kamelet-main/src/generated/resources/camel-component-known-dependencies.properties
@@ -122,6 +122,7 @@
org.apache.camel.component.file.remote.SftpComponent=camel:ftp
org.apache.camel.component.file.watch.FileWatchComponent=camel:file-watch
org.apache.camel.component.flatpack.FlatpackComponent=camel:flatpack
org.apache.camel.component.flink.FlinkComponent=camel:flink
+org.apache.camel.component.flowable.FlowableComponent=camel:flowable
org.apache.camel.component.fop.FopComponent=camel:fop
org.apache.camel.component.freemarker.FreemarkerComponent=camel:freemarker
org.apache.camel.component.geocoder.GeoCoderComponent=camel:geocoder
diff --git a/parent/pom.xml b/parent/pom.xml
index 63f741e5cbd..1bc53043f67 100644
--- a/parent/pom.xml
+++ b/parent/pom.xml
@@ -153,6 +153,7 @@
<google-maps-services-version>2.2.0</google-maps-services-version>
<flatpack-version>4.0.18</flatpack-version>
<flink-version>1.20.0</flink-version>
+ <flowable-version>7.1.0</flowable-version>
<fop-version>2.10</fop-version>
<formatter-maven-plugin-version>2.24.1</formatter-maven-plugin-version>
<ftpserver-version>1.2.0</ftpserver-version>
@@ -203,6 +204,7 @@
<gson-version>2.11.0</gson-version>
<guava-version>33.3.1-jre</guava-version>
<guice3-version>3.0</guice3-version>
+ <h2-version>2.2.224</h2-version>
<hadoop3-version>3.4.1</hadoop3-version>
<hamcrest-version>3.0</hamcrest-version>
<hapi-version>2.5.1</hapi-version>
@@ -1300,6 +1302,11 @@
<artifactId>camel-flink</artifactId>
<version>${project.version}</version>
</dependency>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-flowable</artifactId>
+ <version>${project.version}</version>
+ </dependency>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-fop</artifactId>
diff --git a/pom.xml b/pom.xml
index e8ad4e5ac2c..b9018ceb71c 100644
--- a/pom.xml
+++ b/pom.xml
@@ -253,8 +253,10 @@
<exclude>**/*.bin</exclude>
<exclude>**/*.cat</exclude>
<exclude>**/*.cer</exclude>
+ <exclude>**/*.channel</exclude>
<exclude>**/*.chtml</exclude>
<exclude>**/*.csv</exclude>
+ <exclude>**/*.event</exclude>
<exclude>**/*.gif</exclude>
<exclude>**/*.gpg</exclude>
<exclude>**/*.graphql*</exclude>