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/17 12:04:50 UTC
[camel] 15/20: CAMEL-13647: Allow to do autowrire by classpath.
Quick and dirty prototype.
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 00a2093d78b20c00af0a6424c910e7aab1c3da9a
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Mon Jun 17 11:13:10 2019 +0200
CAMEL-13647: Allow to do autowrire by classpath. Quick and dirty prototype.
---
.../apache/camel/component/jms/JmsComponent.java | 2 +-
.../camel/component/jms/JmsConfiguration.java | 6 ++-
.../component/jms/reply/QueueReplyManager.java | 2 +-
.../jms/reply/TemporaryQueueReplyManager.java | 2 +-
.../camel/support/PropertyBindingSupport.java | 7 +--
examples/camel-example-main-artemis/pom.xml | 2 +-
examples/camel-example-main-artemis/readme.adoc | 25 ++++++---
.../src/main/data/foo.properties | 18 -------
.../main/java/org/apache/camel/example/MyBean.java | 36 -------------
.../org/apache/camel/example/MyConfiguration.java | 25 +++++++--
.../org/apache/camel/example/MyRouteBuilder.java | 8 ++-
.../org/apache/camel/example/StandaloneCamel.java | 62 ----------------------
.../src/main/resources/application.properties | 34 ++++--------
.../src/main/resources/log4j2.properties | 2 +-
14 files changed, 62 insertions(+), 169 deletions(-)
diff --git a/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsComponent.java b/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsComponent.java
index d767111..bbd6ac8 100644
--- a/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsComponent.java
+++ b/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsComponent.java
@@ -1328,7 +1328,7 @@ public class JmsComponent extends HeaderFilterStrategyComponent implements Appli
String cfUsername = getAndRemoveParameter(parameters, "username", String.class, getConfiguration().getUsername());
String cfPassword = getAndRemoveParameter(parameters, "password", String.class, getConfiguration().getPassword());
if (cfUsername != null && cfPassword != null) {
- cf = endpoint.getConfiguration().getConnectionFactory();
+ cf = endpoint.getConfiguration().getOrCreateConnectionFactory();
ObjectHelper.notNull(cf, "ConnectionFactory");
log.debug("Wrapping existing ConnectionFactory with UserCredentialsConnectionFactoryAdapter using username: {} and password: ******", cfUsername);
UserCredentialsConnectionFactoryAdapter ucfa = new UserCredentialsConnectionFactoryAdapter();
diff --git a/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsConfiguration.java b/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsConfiguration.java
index de0a5d8..d394b9f 100644
--- a/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsConfiguration.java
+++ b/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsConfiguration.java
@@ -766,6 +766,10 @@ public class JmsConfiguration implements Cloneable {
}
public ConnectionFactory getConnectionFactory() {
+ return connectionFactory;
+ }
+
+ public ConnectionFactory getOrCreateConnectionFactory() {
if (connectionFactory == null) {
connectionFactory = createConnectionFactory();
}
@@ -1621,7 +1625,7 @@ public class JmsConfiguration implements Cloneable {
*/
protected PlatformTransactionManager createTransactionManager() {
JmsTransactionManager answer = new JmsTransactionManager();
- answer.setConnectionFactory(getConnectionFactory());
+ answer.setConnectionFactory(getOrCreateConnectionFactory());
return answer;
}
diff --git a/components/camel-jms/src/main/java/org/apache/camel/component/jms/reply/QueueReplyManager.java b/components/camel-jms/src/main/java/org/apache/camel/component/jms/reply/QueueReplyManager.java
index 52f4aa8..b4f5d2e 100644
--- a/components/camel-jms/src/main/java/org/apache/camel/component/jms/reply/QueueReplyManager.java
+++ b/components/camel-jms/src/main/java/org/apache/camel/component/jms/reply/QueueReplyManager.java
@@ -177,7 +177,7 @@ public class QueueReplyManager extends ReplyManagerSupport {
if (endpoint.getReplyToMaxConcurrentConsumers() > 0) {
answer.setMaxConcurrentConsumers(endpoint.getReplyToMaxConcurrentConsumers());
}
- answer.setConnectionFactory(endpoint.getConnectionFactory());
+ answer.setConnectionFactory(endpoint.getConfiguration().getOrCreateConnectionFactory());
String clientId = endpoint.getClientId();
if (clientId != null) {
clientId += ".CamelReplyManager";
diff --git a/components/camel-jms/src/main/java/org/apache/camel/component/jms/reply/TemporaryQueueReplyManager.java b/components/camel-jms/src/main/java/org/apache/camel/component/jms/reply/TemporaryQueueReplyManager.java
index 93983d9..5115315 100644
--- a/components/camel-jms/src/main/java/org/apache/camel/component/jms/reply/TemporaryQueueReplyManager.java
+++ b/components/camel-jms/src/main/java/org/apache/camel/component/jms/reply/TemporaryQueueReplyManager.java
@@ -111,7 +111,7 @@ public class TemporaryQueueReplyManager extends ReplyManagerSupport {
if (endpoint.getReplyToMaxConcurrentConsumers() > 0) {
answer.setMaxConcurrentConsumers(endpoint.getReplyToMaxConcurrentConsumers());
}
- answer.setConnectionFactory(endpoint.getConnectionFactory());
+ answer.setConnectionFactory(endpoint.getConfiguration().getOrCreateConnectionFactory());
// we use CACHE_CONSUMER by default to cling to the consumer as long as we can, since we can only consume
// msgs from the JMS Connection that created the temp destination in the first place
if (endpoint.getReplyToCacheLevelName() != null) {
diff --git a/core/camel-support/src/main/java/org/apache/camel/support/PropertyBindingSupport.java b/core/camel-support/src/main/java/org/apache/camel/support/PropertyBindingSupport.java
index 94a425e..fd20f95 100644
--- a/core/camel-support/src/main/java/org/apache/camel/support/PropertyBindingSupport.java
+++ b/core/camel-support/src/main/java/org/apache/camel/support/PropertyBindingSupport.java
@@ -595,12 +595,7 @@ public final class PropertyBindingSupport {
private static boolean isComplexUserType(Class type) {
// lets consider all non java, as complex types
- return type != null && !type.isPrimitive() && !type.getName().startsWith("java");
- }
-
- private static boolean isInterface(Class type) {
- // lets consider all non java, as complex types
- return type != null && type.isInterface();
+ return type != null && !type.isPrimitive() && !type.getName().startsWith("java.");
}
private static void setReferenceProperties(CamelContext context, Object target, Map<String, Object> parameters) {
diff --git a/examples/camel-example-main-artemis/pom.xml b/examples/camel-example-main-artemis/pom.xml
index 33afe33..cbc0485 100644
--- a/examples/camel-example-main-artemis/pom.xml
+++ b/examples/camel-example-main-artemis/pom.xml
@@ -34,7 +34,7 @@
<description>An example for showing standalone Camel with Artemis (autowiring JMS client via classpath scanning)</description>
<properties>
- <category>Beginner</category>
+ <category>Messaging</category>
</properties>
<dependencies>
diff --git a/examples/camel-example-main-artemis/readme.adoc b/examples/camel-example-main-artemis/readme.adoc
index ad5da44..f772448 100644
--- a/examples/camel-example-main-artemis/readme.adoc
+++ b/examples/camel-example-main-artemis/readme.adoc
@@ -1,22 +1,33 @@
-== Camel Example Main
+== Camel Example Main Artemis
This example shows how to run Camel standalone via the built-in Main class.
+The example requires a running Apache ActiveMQ Artemis broker running.
+
The example also demonstrates how you can configure the Camel application
via Camel built-in dependency-injection that supports binding via the
`@BindToRegistry`, `@BeanInject` and `@PropertyInject` annotations.
Also notice how you can configure Camel in the `application.properties` file.
-=== Alternative example
+The example also demonstrates how you can configure the ActiveMQ Artemis JMS `ConnectionFactory`
+via two different styles
-The class `StandaloneCamel` is an alternative example that uses a
-_public static void main_ class and where you manually setup Camel without
-any help from Camel's built-in Main class. However it shows how to do this
-in a _raw style_ without using any _magic_.
+- via `@BindToRegistry` from Java source code in the `MyConfiguration.java` source file
+- via `application.properties` and the `camel-main-maven-plugin`
+ that performs classpath scanning to auto-detect the JMS client and prepare for autowiring
+ by generating the `META-INF/services/org/apache/camel/autowire.properties` file.
=== How to run
-You can run this example using
+First install https://activemq.apache.org/components/artemis/[Apache ActiveMQ Artemis]
+and create a broker, such as `mybroker`, and create the admin user as `admin` as username
+and `admin` as password:
+
+ bin/artemis create mybroker
+ cd mybroker
+ bin/artemis run
+
+Then you can run this example using
mvn camel:run
diff --git a/examples/camel-example-main-artemis/src/main/data/foo.properties b/examples/camel-example-main-artemis/src/main/data/foo.properties
deleted file mode 100644
index b43e6bc..0000000
--- a/examples/camel-example-main-artemis/src/main/data/foo.properties
+++ /dev/null
@@ -1,18 +0,0 @@
-## ---------------------------------------------------------------------------
-## 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.
-## ---------------------------------------------------------------------------
-
-bye = Bye
\ No newline at end of file
diff --git a/examples/camel-example-main-artemis/src/main/java/org/apache/camel/example/MyBean.java b/examples/camel-example-main-artemis/src/main/java/org/apache/camel/example/MyBean.java
deleted file mode 100644
index 1e1bdb8..0000000
--- a/examples/camel-example-main-artemis/src/main/java/org/apache/camel/example/MyBean.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * 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;
-
-public class MyBean {
-
- private String hi;
- private String bye;
-
- public MyBean(String hi, String bye) {
- this.hi = hi;
- this.bye = bye;
- }
-
- public String hello() {
- return hi + " how are you?";
- }
-
- public String bye() {
- return bye + " World";
- }
-}
diff --git a/examples/camel-example-main-artemis/src/main/java/org/apache/camel/example/MyConfiguration.java b/examples/camel-example-main-artemis/src/main/java/org/apache/camel/example/MyConfiguration.java
index 9c26fdd..38c1e89 100644
--- a/examples/camel-example-main-artemis/src/main/java/org/apache/camel/example/MyConfiguration.java
+++ b/examples/camel-example-main-artemis/src/main/java/org/apache/camel/example/MyConfiguration.java
@@ -16,6 +16,10 @@
*/
package org.apache.camel.example;
+import javax.jms.ConnectionFactory;
+
+import org.apache.activemq.artemis.jms.client.ActiveMQConnectionFactory;
+import org.apache.activemq.artemis.jms.client.ActiveMQJMSConnectionFactory;
import org.apache.camel.BindToRegistry;
import org.apache.camel.PropertyInject;
@@ -24,11 +28,22 @@ import org.apache.camel.PropertyInject;
*/
public class MyConfiguration {
- @BindToRegistry
- public MyBean myBean(@PropertyInject("hi") String hi, @PropertyInject("bye") String bye) {
- // this will create an instance of this bean with the name of the method (eg myBean)
- return new MyBean(hi, bye);
- }
+ /**
+ * Creates the Artemis JMS ConnectionFactory and bind it to the Camel registry
+ * so we can do autowiring on the Camel JMS component.
+ * See more details in the application.properties file.
+ * <p/>
+ * Note: This autowiring is disabled in this example as we use camel-main-maven-plugin
+ * to do classpath scanning to detect the Artemis JMS Client and automatic create a autowire.properties
+ * file with some binding details, and then provide additional configuraions in the application.properties file.
+ */
+// @BindToRegistry
+// public ConnectionFactory myArtemisClient(@PropertyInject("artemisBroker") String brokerUrl) {
+// ActiveMQConnectionFactory cf = new ActiveMQJMSConnectionFactory(brokerUrl);
+// cf.setUser("admin");
+// cf.setPassword("admin");
+// return cf;
+// }
public void configure() {
// this method is optional and can be removed if no additional configuration is needed.
diff --git a/examples/camel-example-main-artemis/src/main/java/org/apache/camel/example/MyRouteBuilder.java b/examples/camel-example-main-artemis/src/main/java/org/apache/camel/example/MyRouteBuilder.java
index 09546c0..0fb4b4d 100644
--- a/examples/camel-example-main-artemis/src/main/java/org/apache/camel/example/MyRouteBuilder.java
+++ b/examples/camel-example-main-artemis/src/main/java/org/apache/camel/example/MyRouteBuilder.java
@@ -22,11 +22,9 @@ public class MyRouteBuilder extends RouteBuilder {
@Override
public void configure() throws Exception {
- from("quartz2:foo?cron={{myCron}}")
- .bean("myBean", "hello")
- .log("${body}")
- .bean("myBean", "bye")
- .log("${body}");
+ from("timer:foo?period=3s")
+ .transform(constant("Hello World"))
+ .to("jms:queue:cheese");
from("jms:queue:cheese").to("log:cheese");
}
diff --git a/examples/camel-example-main-artemis/src/main/java/org/apache/camel/example/StandaloneCamel.java b/examples/camel-example-main-artemis/src/main/java/org/apache/camel/example/StandaloneCamel.java
deleted file mode 100644
index f01c5b6..0000000
--- a/examples/camel-example-main-artemis/src/main/java/org/apache/camel/example/StandaloneCamel.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * 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.CamelContext;
-import org.apache.camel.impl.DefaultCamelContext;
-
-/**
- * This is an alternative example to show how you can use a public static void main class
- * to run Camel standalone (without help from its Main class). This is to demonstrate
- * what code you need to write to startup Camel without any help (or magic).
- * <p/>
- * Compare this example with {@link MyApplication} which uses Camel's main class to
- * run Camel standalone in a easier way.
- */
-public final class StandaloneCamel {
-
- private StandaloneCamel() {
- }
-
- public static void main(String[] args) throws Exception {
- // create a new CamelContext
- CamelContext camelContext = new DefaultCamelContext();
-
- // configure where to load properties file in the properties component
- camelContext.getPropertiesComponent().setLocation("classpath:application.properties");
- // resolve property placeholder
- String hello = camelContext.resolvePropertyPlaceholders("{{hi}}");
-
- // and create bean with the placeholder
- MyBean myBean = new MyBean(hello, "Bye");
- // register bean to Camel
- camelContext.getRegistry().bind("myBean", myBean);
-
- // add routes to Camel
- camelContext.addRoutes(new MyRouteBuilder());
-
- // start Camel
- camelContext.start();
-
- // just run for 10 seconds and stop
- System.out.println("Running for 10 seconds and then stopping");
- Thread.sleep(10000);
-
- // stop and shutdown Camel
- camelContext.stop();
- }
-}
diff --git a/examples/camel-example-main-artemis/src/main/resources/application.properties b/examples/camel-example-main-artemis/src/main/resources/application.properties
index ac6de98..fe60043 100644
--- a/examples/camel-example-main-artemis/src/main/resources/application.properties
+++ b/examples/camel-example-main-artemis/src/main/resources/application.properties
@@ -17,37 +17,23 @@
# to configure camel main
# here you can configure options on camel main (see MainConfigurationProperties class)
-camel.main.name = MyCoolCamel
+camel.main.name = MyCamelJmsClient
camel.main.jmx-enabled = false
-# you can also configure camel context directly
-# camel.context.shutdown-strategy.shutdown-now-on-timeout = false
-
-# load additional property placeholders from this folder
-camel.main.file-configurations=src/main/data/*.properties
-
-# to configure the camel quartz component
-# here we can configure the options on the component level (and we can use dash-naming-style)
-camel.component.quartz2.start-delayed-seconds = 3
-
-# to configure Hystrix EIP (global and you need to add camel-hystrix to the classpath)
-### camel.hystrix.group-key=myGroup
-### camel.hystrix.execution-timeout-in-milliseconds=5000
-
-# to configure Rest DSL (global and you need to add camel-undertow to the classpath)
-### camel.rest.component=undertow
-### camel.rest.port=8080
-### camel.rest.component-properties[host-options.buffer-size]=8192
-
# you can configure whether OS environment should override (=2 which is default) or as fallback (=1)
### camel.component.properties.environment-variable-mode=1
# setup JMS component with connection to ActiveMQ Artemis broker
+# see in pom.xml file how we use camel-main-maven-plugin to detect the Artemis JMS Client
+# and automatic generate META-INF/services/org/apache/camel/autowire.properties
+# which contains some additional autowires so we only need here to specify the URL to the broker
camel.component.jms.connectionFactory.brokerURL=tcp://localhost:61616
+camel.component.jms.connectionFactory.user=admin
+camel.component.jms.connectionFactory.password=admin
-# properties used in the route
-myCron = 0/2 * * * * ?
+# this is used if you enable the @BindToRegistry in MyConfiguration class to autowire
+# the Artemis JMS ConnectionFactory via Java source code
+# the url to the Artemis Broker
+### artemisBroker=tcp://localhost:61616
-# application properties
-hi = Hello
diff --git a/examples/camel-example-main-artemis/src/main/resources/log4j2.properties b/examples/camel-example-main-artemis/src/main/resources/log4j2.properties
index d050a4f..c63f861 100644
--- a/examples/camel-example-main-artemis/src/main/resources/log4j2.properties
+++ b/examples/camel-example-main-artemis/src/main/resources/log4j2.properties
@@ -23,4 +23,4 @@ rootLogger.level = INFO
rootLogger.appenderRef.out.ref = out
logger.camel-main.name = org.apache.camel.main
-logger.camel-main.level = DEBUG
+logger.camel-main.level = INFO