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/11/21 09:08:09 UTC

[camel] 01/02: CAMEL-14190: JMSComponent tries to use applicationContext before it is initialised. Change this kind of logic to be more Camel like.

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 2aac4d79e42a7d45736473a1480d3f505f49ed59
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Thu Nov 21 09:53:22 2019 +0100

    CAMEL-14190: JMSComponent tries to use applicationContext before it is initialised. Change this kind of logic to be more Camel like.
---
 .../apache/camel/component/jms/JmsComponent.java   | 66 +++++++++-------------
 1 file changed, 26 insertions(+), 40 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 7b04588..6b50499 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
@@ -17,8 +17,8 @@
 package org.apache.camel.component.jms;
 
 import java.util.Map;
+import java.util.Set;
 import java.util.concurrent.ExecutorService;
-
 import javax.jms.ConnectionFactory;
 import javax.jms.ExceptionListener;
 import javax.jms.Message;
@@ -31,9 +31,6 @@ import org.apache.camel.spi.Metadata;
 import org.apache.camel.spi.annotations.Component;
 import org.apache.camel.support.HeaderFilterStrategyComponent;
 import org.apache.camel.util.ObjectHelper;
-import org.springframework.beans.BeansException;
-import org.springframework.context.ApplicationContext;
-import org.springframework.context.ApplicationContextAware;
 import org.springframework.core.task.TaskExecutor;
 import org.springframework.jms.connection.JmsTransactionManager;
 import org.springframework.jms.connection.UserCredentialsConnectionFactoryAdapter;
@@ -46,15 +43,14 @@ import org.springframework.util.ErrorHandler;
 import static org.apache.camel.util.StringHelper.removeStartingCharacters;
 
 /**
- * A <a href="http://activemq.apache.org/jms.html">JMS Component</a>
+ * JMS component which uses Spring JMS.
  */
 @Component("jms")
-public class JmsComponent extends HeaderFilterStrategyComponent implements ApplicationContextAware {
+public class JmsComponent extends HeaderFilterStrategyComponent {
 
     private static final String KEY_FORMAT_STRATEGY_PARAM = "jmsKeyFormatStrategy";
 
     private ExecutorService asyncStartStopExecutorService;
-    private ApplicationContext applicationContext;
 
     @Metadata(label = "advanced", description = "To use a shared JMS configuration")
     private JmsConfiguration configuration;
@@ -65,14 +61,15 @@ public class JmsComponent extends HeaderFilterStrategyComponent implements Appli
     private MessageCreatedStrategy messageCreatedStrategy;
 
     public JmsComponent() {
+        this.configuration = createConfiguration();
     }
 
     public JmsComponent(CamelContext context) {
         super(context);
+        this.configuration = createConfiguration();
     }
 
     public JmsComponent(JmsConfiguration configuration) {
-        this();
         this.configuration = configuration;
     }
 
@@ -133,29 +130,6 @@ public class JmsComponent extends HeaderFilterStrategyComponent implements Appli
     // -------------------------------------------------------------------------
 
     public JmsConfiguration getConfiguration() {
-        if (configuration == null) {
-            configuration = createConfiguration();
-
-            // If we are being configured with spring...
-            if (applicationContext != null) {
-
-                if (isAllowAutoWiredConnectionFactory()) {
-                    Map<String, ConnectionFactory> beansOfTypeConnectionFactory = applicationContext.getBeansOfType(ConnectionFactory.class);
-                    if (!beansOfTypeConnectionFactory.isEmpty()) {
-                        ConnectionFactory cf = beansOfTypeConnectionFactory.values().iterator().next();
-                        configuration.setConnectionFactory(cf);
-                    }
-                }
-
-                if (isAllowAutoWiredDestinationResolver()) {
-                    Map<String, DestinationResolver> beansOfTypeDestinationResolver = applicationContext.getBeansOfType(DestinationResolver.class);
-                    if (!beansOfTypeDestinationResolver.isEmpty()) {
-                        DestinationResolver destinationResolver = beansOfTypeDestinationResolver.values().iterator().next();
-                        configuration.setDestinationResolver(destinationResolver);
-                    }
-                }
-            }
-        }
         return configuration;
     }
 
@@ -1055,14 +1029,6 @@ public class JmsComponent extends HeaderFilterStrategyComponent implements Appli
         getConfiguration().setAllowAdditionalHeaders(allowAdditionalHeaders);
     }
 
-    /**
-     * Sets the Spring ApplicationContext to use
-     */
-    @Override
-    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
-        this.applicationContext = applicationContext;
-    }
-
     public QueueBrowseStrategy getQueueBrowseStrategy() {
         if (queueBrowseStrategy == null) {
             queueBrowseStrategy = new DefaultQueueBrowseStrategy();
@@ -1256,8 +1222,28 @@ public class JmsComponent extends HeaderFilterStrategyComponent implements Appli
 
     @Override
     protected void doStart() throws Exception {
+        if (configuration.getConnectionFactory() == null && isAllowAutoWiredConnectionFactory()) {
+            Set<ConnectionFactory> beans = getCamelContext().getRegistry().findByType(ConnectionFactory.class);
+            if (beans.size() == 1) {
+                ConnectionFactory cf = beans.iterator().next();
+                configuration.setConnectionFactory(cf);
+            } else if (beans.size() > 1) {
+                log.debug("Cannot autowire ConnectionFactory as " + beans.size() + " instances found in registry.");
+            }
+        }
+
+        if (configuration.getDestinationResolver() == null && isAllowAutoWiredDestinationResolver()) {
+            Set<DestinationResolver> beans = getCamelContext().getRegistry().findByType(DestinationResolver.class);
+            if (beans.size() == 1) {
+                DestinationResolver destinationResolver = beans.iterator().next();
+                configuration.setDestinationResolver(destinationResolver);
+            } else if (beans.size() > 1) {
+                log.debug("Cannot autowire ConnectionFactory as " + beans.size() + " instances found in registry.");
+            }
+        }
+
         if (getHeaderFilterStrategy() == null) {
-            setHeaderFilterStrategy(new JmsHeaderFilterStrategy(getConfiguration().isIncludeAllJMSXProperties()));
+            setHeaderFilterStrategy(new JmsHeaderFilterStrategy(configuration.isIncludeAllJMSXProperties()));
         }
     }