You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2019/06/20 06:14:44 UTC
[camel] 14/18: CAMEL-13636: camel3 - SPI for ReactiveHelper so we
can plugin different reactive engines
This is an automated email from the ASF dual-hosted git repository.
davsclaus pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/camel.git
commit 88942d066f6d19e49a464fa7c461daa42c16d5f8
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Thu Jun 13 11:04:29 2019 +0200
CAMEL-13636: camel3 - SPI for ReactiveHelper so we can plugin different reactive engines
---
.../camel-headersmap/src/main/docs/headersmap.adoc | 4 +-
core/camel-reactive-executor-vertx/pom.xml | 2 +
.../src/main/docs/reactive-executor-vertx.adoc | 44 ++++++++++++++++++++++
.../reactive/vertx/VertXReactiveExecutor.java | 25 ++++++++++--
examples/README.adoc | 2 +
examples/camel-example-main/pom.xml | 4 --
.../pom.xml | 13 ++-----
.../readme.adoc | 15 ++++++++
.../org/apache/camel/example/MyApplication.java | 38 +++++++++++++++++++
.../org/apache/camel/example/MyRouteBuilder.java | 30 +++++++++++++++
.../src/main/resources/application.properties | 28 ++++++++++++++
.../src/main/resources/log4j2.properties | 23 +++++++++++
examples/pom.xml | 1 +
13 files changed, 209 insertions(+), 20 deletions(-)
diff --git a/core/camel-headersmap/src/main/docs/headersmap.adoc b/core/camel-headersmap/src/main/docs/headersmap.adoc
index 6947bc1..b7d8759 100644
--- a/core/camel-headersmap/src/main/docs/headersmap.adoc
+++ b/core/camel-headersmap/src/main/docs/headersmap.adoc
@@ -15,11 +15,9 @@ and Camel should auto-detect this on startup and log as follows:
Detected and using custom HeadersMapFactory: org.apache.camel.component.headersmap.FastHeadersMapFactory@71e9ebae
----
-For spring-boot there is a `camel-headersmap-starter` dependency you should use.
-
=== Manual enabling
-If you use OSGi or the implementation is not added to the classpath, you need to enable this explict such:
+If you use OSGi or the implementation is not added to the classpath, you need to enable this explicit such:
[source,java]
----
diff --git a/core/camel-reactive-executor-vertx/pom.xml b/core/camel-reactive-executor-vertx/pom.xml
index 0ae3475..d76289a 100644
--- a/core/camel-reactive-executor-vertx/pom.xml
+++ b/core/camel-reactive-executor-vertx/pom.xml
@@ -27,6 +27,8 @@
<version>3.0.0-SNAPSHOT</version>
</parent>
+ <!-- TODO: move to components -->
+
<artifactId>camel-reactive-executor-vertx</artifactId>
<packaging>jar</packaging>
<name>Camel :: Reactive Executor :: Vert X</name>
diff --git a/core/camel-reactive-executor-vertx/src/main/docs/reactive-executor-vertx.adoc b/core/camel-reactive-executor-vertx/src/main/docs/reactive-executor-vertx.adoc
new file mode 100644
index 0000000..e541df4
--- /dev/null
+++ b/core/camel-reactive-executor-vertx/src/main/docs/reactive-executor-vertx.adoc
@@ -0,0 +1,44 @@
+== ReactiveExecutor VertX
+
+*Available as of Camel 3.0*
+
+The camel-reactive-executor-vertx is a VertX based implementation of the `ReactiveExecutor` SPI.
+
+By default Camel uses its own reactive engine for routing messages, but you can plugin
+different engines via a SPI interface. This is a VertX based plugin that uses the VertX event loop
+for processing message during routing.
+
+=== VertX instance
+
+This implementation will by default create a default `io.vertx.core.Vertx` instance to be used.
+However you can configure an existing instance using the getter/setter on the `VertXReactiveExecutor` class.
+
+=== Auto detection from classpath
+
+To use this implementation all you need to do is to add the `camel-reactive-executor-vertx` dependency to the classpath,
+and Camel should auto-detect this on startup and log as follows:
+
+[source,text]
+----
+Using ReactiveExecutor: org.apache.camel.reactive.vertx.VertXReactiveExecutor@2a62b5bc
+----
+
+=== Manual enabling
+
+If you use OSGi or the implementation is not added to the classpath, you need to enable this explict such:
+
+[source,java]
+----
+CamelContext camel = ...
+
+camel.setReactiveExecutor(new VertXReactiveExecutor());
+----
+
+Or in XML DSL (spring or blueprint XML file) you can declare the factory as a `<bean>`:
+
+[source,xml]
+----
+<bean id="vertxReactiveExecutor" class="org.apache.camel.reactive.vertx.VertXReactiveExecutor"/>
+----
+
+and then Camel should detect the bean and use the reactive executor.
\ No newline at end of file
diff --git a/core/camel-reactive-executor-vertx/src/main/java/org/apache/camel/reactive/vertx/VertXReactiveExecutor.java b/core/camel-reactive-executor-vertx/src/main/java/org/apache/camel/reactive/vertx/VertXReactiveExecutor.java
index 922b4b5..38a4262 100644
--- a/core/camel-reactive-executor-vertx/src/main/java/org/apache/camel/reactive/vertx/VertXReactiveExecutor.java
+++ b/core/camel-reactive-executor-vertx/src/main/java/org/apache/camel/reactive/vertx/VertXReactiveExecutor.java
@@ -35,6 +35,18 @@ public class VertXReactiveExecutor extends ServiceSupport implements ReactiveExe
private static final Logger LOG = LoggerFactory.getLogger(VertXReactiveExecutor.class);
private Vertx vertx;
+ private boolean shouldClose;
+
+ public Vertx getVertx() {
+ return vertx;
+ }
+
+ /**
+ * To use an existing instance of {@link Vertx} instead of creating a default instance.
+ */
+ public void setVertx(Vertx vertx) {
+ this.vertx = vertx;
+ }
@Override
public void schedule(Runnable runnable, String description) {
@@ -88,13 +100,18 @@ public class VertXReactiveExecutor extends ServiceSupport implements ReactiveExe
@Override
protected void doStart() throws Exception {
- LOG.debug("Starting VertX");
- vertx = Vertx.vertx();
+ if (vertx == null) {
+ LOG.debug("Starting VertX");
+ shouldClose = true;
+ vertx = Vertx.vertx();
+ }
}
@Override
protected void doStop() throws Exception {
- LOG.debug("Stopping VertX");
- vertx.close();
+ if (vertx != null && shouldClose) {
+ LOG.debug("Stopping VertX");
+ vertx.close();
+ }
}
}
diff --git a/examples/README.adoc b/examples/README.adoc
index fcb112d0..0edaf62 100644
--- a/examples/README.adoc
+++ b/examples/README.adoc
@@ -221,6 +221,8 @@ Number of Examples: 111 (0 deprecated)
| link:camel-example-kotlin/ReadMe.md[Kotlin] (camel-example-kotlin) | Other Languages | A Camel route using Kotlin
+| link:camel-example-reactive-executor-vertx/readme.adoc[Reactive Executor Vertx] (camel-example-reactive-executor-vertx) | Reactive | An example for showing using VertX as reactive executor with standalone Camel
+
| link:camel-example-reactive-streams/readme.adoc[Reactive Streams] (camel-example-reactive-streams) | Reactive | An example that shows how Camel can exchange data using reactive streams with Spring Boot reactor
diff --git a/examples/camel-example-main/pom.xml b/examples/camel-example-main/pom.xml
index d33e285..43d1ee8 100644
--- a/examples/camel-example-main/pom.xml
+++ b/examples/camel-example-main/pom.xml
@@ -51,10 +51,6 @@
<groupId>org.apache.camel</groupId>
<artifactId>camel-quartz2</artifactId>
</dependency>
- <dependency>
- <groupId>org.apache.camel</groupId>
- <artifactId>camel-reactive-executor-vertx</artifactId>
- </dependency>
<!-- logging -->
<dependency>
diff --git a/examples/camel-example-main/pom.xml b/examples/camel-example-reactive-executor-vertx/pom.xml
similarity index 89%
copy from examples/camel-example-main/pom.xml
copy to examples/camel-example-reactive-executor-vertx/pom.xml
index d33e285..ce4ecf4 100644
--- a/examples/camel-example-main/pom.xml
+++ b/examples/camel-example-reactive-executor-vertx/pom.xml
@@ -28,13 +28,13 @@
<version>3.0.0-SNAPSHOT</version>
</parent>
- <artifactId>camel-example-main</artifactId>
+ <artifactId>camel-example-reactive-executor-vertx</artifactId>
<packaging>jar</packaging>
- <name>Camel :: Example :: Main</name>
- <description>An example for showing standalone Camel</description>
+ <name>Camel :: Example :: Reactive Executor :: VertX</name>
+ <description>An example for showing using VertX as reactive executor with standalone Camel</description>
<properties>
- <category>Beginner</category>
+ <category>Reactive</category>
</properties>
<dependencies>
@@ -49,10 +49,6 @@
</dependency>
<dependency>
<groupId>org.apache.camel</groupId>
- <artifactId>camel-quartz2</artifactId>
- </dependency>
- <dependency>
- <groupId>org.apache.camel</groupId>
<artifactId>camel-reactive-executor-vertx</artifactId>
</dependency>
@@ -91,7 +87,6 @@
<mainClass>org.apache.camel.example.MyApplication</mainClass>
</configuration>
</plugin>
-
</plugins>
</build>
diff --git a/examples/camel-example-reactive-executor-vertx/readme.adoc b/examples/camel-example-reactive-executor-vertx/readme.adoc
new file mode 100644
index 0000000..49af783
--- /dev/null
+++ b/examples/camel-example-reactive-executor-vertx/readme.adoc
@@ -0,0 +1,15 @@
+== Camel Example Reactive Executor VertX
+
+This example uses VertX as the reactive executor for routing messages with Camel.
+By default Camel uses its own reactive engine for routing messages, but you can plugin
+different engines via a SPI interface. This example uses VertX as the engine.
+
+=== How to run
+
+You can run this example using
+
+ mvn camel:run
+
+=== More information
+
+You can find more information about Apache Camel at the website: http://camel.apache.org/
diff --git a/examples/camel-example-reactive-executor-vertx/src/main/java/org/apache/camel/example/MyApplication.java b/examples/camel-example-reactive-executor-vertx/src/main/java/org/apache/camel/example/MyApplication.java
new file mode 100644
index 0000000..8c1cc6a
--- /dev/null
+++ b/examples/camel-example-reactive-executor-vertx/src/main/java/org/apache/camel/example/MyApplication.java
@@ -0,0 +1,38 @@
+/*
+ * 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.example;
+
+import org.apache.camel.main.Main;
+
+/**
+ * Main class that boot the Camel application
+ */
+public final class MyApplication {
+
+ private MyApplication() {
+ }
+
+ public static void main(String[] args) throws Exception {
+ // use Camels Main class
+ Main main = new Main();
+ // and add the routes (you can specify multiple classes)
+ main.addRouteBuilder(MyRouteBuilder.class);
+ // now keep the application running until the JVM is terminated (ctrl + c or sigterm)
+ main.run(args);
+ }
+
+}
diff --git a/examples/camel-example-reactive-executor-vertx/src/main/java/org/apache/camel/example/MyRouteBuilder.java b/examples/camel-example-reactive-executor-vertx/src/main/java/org/apache/camel/example/MyRouteBuilder.java
new file mode 100644
index 0000000..003edb5
--- /dev/null
+++ b/examples/camel-example-reactive-executor-vertx/src/main/java/org/apache/camel/example/MyRouteBuilder.java
@@ -0,0 +1,30 @@
+/*
+ * 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.example;
+
+import org.apache.camel.builder.RouteBuilder;
+
+public class MyRouteBuilder extends RouteBuilder {
+
+ @Override
+ public void configure() throws Exception {
+ from("timer:foo?period=2s")
+ .setBody().constant("Hello World")
+ .delay(simple("${random(0,1000)}"))
+ .log("${body}");
+ }
+}
diff --git a/examples/camel-example-reactive-executor-vertx/src/main/resources/application.properties b/examples/camel-example-reactive-executor-vertx/src/main/resources/application.properties
new file mode 100644
index 0000000..0afb55c
--- /dev/null
+++ b/examples/camel-example-reactive-executor-vertx/src/main/resources/application.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.
+## ---------------------------------------------------------------------------
+
+# to configure camel main
+# here you can configure options on camel main (see MainConfigurationProperties class)
+camel.main.name = MyVertXCamel
+camel.main.jmx-enabled = false
+
+# you can also configure camel context directly
+# camel.context.shutdown-strategy.shutdown-now-on-timeout = false
+
+# application properties
+hi = Hello
+
diff --git a/examples/camel-example-reactive-executor-vertx/src/main/resources/log4j2.properties b/examples/camel-example-reactive-executor-vertx/src/main/resources/log4j2.properties
new file mode 100644
index 0000000..d406a9f
--- /dev/null
+++ b/examples/camel-example-reactive-executor-vertx/src/main/resources/log4j2.properties
@@ -0,0 +1,23 @@
+## ---------------------------------------------------------------------------
+## 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.out.type = Console
+appender.out.name = out
+appender.out.layout.type = PatternLayout
+appender.out.layout.pattern = %d [%-15.15t] %-5p %-30.30c{1} - %m%n
+rootLogger.level = INFO
+rootLogger.appenderRef.out.ref = out
diff --git a/examples/pom.xml b/examples/pom.xml
index 983a3d1..e81d72e 100644
--- a/examples/pom.xml
+++ b/examples/pom.xml
@@ -94,6 +94,7 @@
<module>camel-example-opentracing</module>
<module>camel-example-pojo-messaging</module>
<module>camel-example-rabbitmq</module>
+ <module>camel-example-reactive-executor-vertx</module>
<module>camel-example-reactive-streams</module>
<module>camel-example-rest-producer</module>
<module>camel-example-rest-swagger</module>