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/02/28 10:31:59 UTC

[camel] branch master updated: CAMEL-13243: Main class should be more easier to use, so lets drop the confusing multiple CamelContext stuff that was not really intended/working.

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


The following commit(s) were added to refs/heads/master by this push:
     new bfe9fc4  CAMEL-13243: Main class should be more easier to use, so lets drop the confusing multiple CamelContext stuff that was not really intended/working.
bfe9fc4 is described below

commit bfe9fc4ab9a187c674db2e7f5a0972c6b7eb52e7
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Thu Feb 28 10:28:01 2019 +0100

    CAMEL-13243: Main class should be more easier to use, so lets drop the confusing multiple CamelContext stuff that was not really intended/working.
---
 MIGRATION.md                                       |   4 +
 .../src/main/java/org/apache/camel/cdi/Main.java   |  29 +-
 .../boot/CamelSpringBootApplicationController.java |   6 +-
 .../main/java/org/apache/camel/spring/Main.java    |  40 ++-
 .../java/org/apache/camel/spring/MainTest.java     |   5 +-
 components/camel-test-blueprint/pom.xml            | 333 +++++++++++----------
 .../java/org/apache/camel/test/blueprint/Main.java |  41 ++-
 .../apache/camel/test/blueprint/MyMainAppTest.java |  15 +-
 .../src/main/java/org/apache/camel/main/Main.java  |  43 +--
 .../java/org/apache/camel/main/MainSupport.java    |  24 +-
 .../org/apache/camel/impl/MainSupportTest.java     |   6 +-
 .../test/java/org/apache/camel/main/MainTest.java  |  24 +-
 12 files changed, 259 insertions(+), 311 deletions(-)

diff --git a/MIGRATION.md b/MIGRATION.md
index 0c1bff5..001c310 100644
--- a/MIGRATION.md
+++ b/MIGRATION.md
@@ -126,6 +126,10 @@ In Camel 2.x we have deprecated `getProperties` on `CamelContext` in favour of `
     </globalOptions>
 
 
+### Main class
+
+The `Main` class from `camel-core`, `camel-spring` and `camel-cdi` has been modified to only support a single `CamelContext` which was really its intention, but there was some old crufy code for multiple Camels. The method `getCamelContextMap` has been removed, and there is just a `getCamelContext` method now.
+
 ### Moved APIs
 
 The following API changes may affect your existing Camel applications, which needs to be migrated.
diff --git a/components/camel-cdi/src/main/java/org/apache/camel/cdi/Main.java b/components/camel-cdi/src/main/java/org/apache/camel/cdi/Main.java
index aeabac3..8b14ebc 100644
--- a/components/camel-cdi/src/main/java/org/apache/camel/cdi/Main.java
+++ b/components/camel-cdi/src/main/java/org/apache/camel/cdi/Main.java
@@ -18,11 +18,6 @@ package org.apache.camel.cdi;
 
 import java.util.Map;
 import java.util.Set;
-
-import static java.util.function.Function.identity;
-import static java.util.stream.Collectors.toMap;
-
-import javax.enterprise.inject.UnsatisfiedResolutionException;
 import javax.enterprise.inject.spi.Bean;
 import javax.enterprise.inject.spi.BeanManager;
 
@@ -33,9 +28,10 @@ import org.apache.deltaspike.cdise.api.CdiContainer;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import static java.util.function.Function.identity;
+import static java.util.stream.Collectors.toMap;
 import static org.apache.camel.cdi.AnyLiteral.ANY;
 import static org.apache.camel.cdi.BeanManagerHelper.getReference;
-import static org.apache.camel.cdi.BeanManagerHelper.getReferenceByType;
 import static org.apache.deltaspike.cdise.api.CdiContainerLoader.getCdiContainer;
 
 /**
@@ -75,19 +71,24 @@ public class Main extends MainSupport {
 
     @Override
     protected ProducerTemplate findOrCreateCamelTemplate() {
-        return getReferenceByType(cdiContainer.getBeanManager(), CamelContext.class)
-            .orElseThrow(
-                () -> new UnsatisfiedResolutionException("No default Camel context is deployed, "
-                    + "cannot create default ProducerTemplate!"))
-            .createProducerTemplate();
+        if (getCamelContext() == null) {
+            throw new IllegalArgumentException("No CamelContext are available so cannot create a ProducerTemplate!");
+        }
+        return getCamelContext().createProducerTemplate();
     }
 
     @Override
-    protected Map<String, CamelContext> getCamelContextMap() {
+    protected CamelContext createCamelContext() {
         BeanManager manager = cdiContainer.getBeanManager();
-        return manager.getBeans(CamelContext.class, ANY).stream()
+        Map<String, CamelContext> camels = manager.getBeans(CamelContext.class, ANY).stream()
             .map(bean -> getReference(manager, CamelContext.class, bean))
             .collect(toMap(CamelContext::getName, identity()));
+        if (camels.size() > 1) {
+            throw new IllegalArgumentException("Multiple CamelContext detected. This Main class only supports single CamelContext");
+        } else if (camels.size() == 1) {
+            return camels.values().iterator().next();
+        }
+        return null;
     }
 
     @Override
@@ -98,7 +99,7 @@ public class Main extends MainSupport {
         container.getContextControl().startContexts();
         cdiContainer = container;
         super.doStart();
-        postProcessContext();
+        initCamelContext();
         warnIfNoCamelFound();
     }
 
diff --git a/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/CamelSpringBootApplicationController.java b/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/CamelSpringBootApplicationController.java
index f4d71ac..9d51657 100644
--- a/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/CamelSpringBootApplicationController.java
+++ b/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/CamelSpringBootApplicationController.java
@@ -16,8 +16,6 @@
  */
 package org.apache.camel.spring.boot;
 
-import java.util.Collections;
-import java.util.Map;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.atomic.AtomicBoolean;
 import javax.annotation.PreDestroy;
@@ -45,8 +43,8 @@ public class CamelSpringBootApplicationController {
             }
 
             @Override
-            protected Map<String, CamelContext> getCamelContextMap() {
-                return Collections.singletonMap("camelContext", camelContext);
+            protected CamelContext createCamelContext() {
+                return camelContext;
             }
 
             @Override
diff --git a/components/camel-spring/src/main/java/org/apache/camel/spring/Main.java b/components/camel-spring/src/main/java/org/apache/camel/spring/Main.java
index de747a0..b0a1631 100644
--- a/components/camel-spring/src/main/java/org/apache/camel/spring/Main.java
+++ b/components/camel-spring/src/main/java/org/apache/camel/spring/Main.java
@@ -22,7 +22,6 @@ import java.io.InputStreamReader;
 import java.net.URL;
 import java.nio.charset.Charset;
 import java.util.Enumeration;
-import java.util.HashMap;
 import java.util.LinkedHashSet;
 import java.util.LinkedList;
 import java.util.Map;
@@ -145,6 +144,17 @@ public class Main extends org.apache.camel.main.MainSupport {
     // -------------------------------------------------------------------------
 
     @Override
+    protected CamelContext createCamelContext() {
+        Map<String, SpringCamelContext> camels = applicationContext.getBeansOfType(SpringCamelContext.class);
+        if (camels.size() > 1) {
+            throw new IllegalArgumentException("Multiple CamelContext detected. This Main class only supports single CamelContext");
+        } else if (camels.size() == 1) {
+            return camels.values().iterator().next();
+        }
+        return null;
+    }
+
+    @Override
     protected void doStart() throws Exception {
         try {
             super.doStart();
@@ -164,13 +174,11 @@ public class Main extends org.apache.camel.main.MainSupport {
             LOG.debug("Starting Spring ApplicationContext: {}", applicationContext.getId());
             applicationContext.start();
 
-            postProcessContext();
+            initCamelContext();
         } finally {
-            if (camelContexts != null && !camelContexts.isEmpty()) {
-                // if we were veto started then mark as completed
-                if (getCamelContexts().get(0).isVetoStarted()) {
-                    completed();
-                }
+            // if we were veto started then mark as completed
+            if (getCamelContext() != null && getCamelContext().isVetoStarted()) {
+                completed();
             }
         }
     }
@@ -192,10 +200,10 @@ public class Main extends org.apache.camel.main.MainSupport {
         if (names != null && names.length > 0) {
             return getApplicationContext().getBean(names[0], ProducerTemplate.class);
         }
-        if (getCamelContexts().isEmpty()) {
-            throw new IllegalArgumentException("No CamelContexts are available so cannot create a ProducerTemplate!");
+        if (getCamelContext() == null) {
+            throw new IllegalArgumentException("No CamelContext are available so cannot create a ProducerTemplate!");
         }
-        return getCamelContexts().get(0).createProducerTemplate();
+        return getCamelContext().createProducerTemplate();
     }
 
     protected AbstractApplicationContext createDefaultApplicationContext() throws IOException {
@@ -221,18 +229,6 @@ public class Main extends org.apache.camel.main.MainSupport {
         }
     }
 
-    protected Map<String, CamelContext> getCamelContextMap() {
-        Map<String, SpringCamelContext> map = applicationContext.getBeansOfType(SpringCamelContext.class);
-        Set<Map.Entry<String, SpringCamelContext>> entries = map.entrySet();
-        Map<String, CamelContext> answer = new HashMap<>();
-        for (Map.Entry<String, SpringCamelContext> entry : entries) {
-            String name = entry.getKey();
-            CamelContext camelContext = entry.getValue();
-            answer.put(name, camelContext);
-        }
-        return answer;
-    }
-
     protected AbstractApplicationContext createAdditionalLocationsFromClasspath() throws IOException {
         Set<String> locations = new LinkedHashSet<>();
         findLocations(locations, Main.class.getClassLoader());
diff --git a/components/camel-spring/src/test/java/org/apache/camel/spring/MainTest.java b/components/camel-spring/src/test/java/org/apache/camel/spring/MainTest.java
index 25bbe3b..429dbb1 100644
--- a/components/camel-spring/src/test/java/org/apache/camel/spring/MainTest.java
+++ b/components/camel-spring/src/test/java/org/apache/camel/spring/MainTest.java
@@ -43,10 +43,7 @@ public class MainTest extends Assert {
         });
         main.start();
 
-        List<CamelContext> contextList = main.getCamelContexts();
-        assertNotNull(contextList);
-        assertEquals("size", 1, contextList.size());
-        CamelContext camelContext = contextList.get(0);
+        CamelContext camelContext = main.getCamelContext();
 
         MockEndpoint endpoint = camelContext.getEndpoint("mock:results", MockEndpoint.class);
         // in case we add more files in src/test/data
diff --git a/components/camel-test-blueprint/pom.xml b/components/camel-test-blueprint/pom.xml
index 249ffa7..ecdec58 100644
--- a/components/camel-test-blueprint/pom.xml
+++ b/components/camel-test-blueprint/pom.xml
@@ -17,179 +17,180 @@
     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>
+<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>3.0.0-SNAPSHOT</version>
-    </parent>
+  <parent>
+    <groupId>org.apache.camel</groupId>
+    <artifactId>components</artifactId>
+    <version>3.0.0-SNAPSHOT</version>
+  </parent>
 
-    <artifactId>camel-test-blueprint</artifactId>
-    <packaging>jar</packaging>
-    <name>Camel :: Test :: Blueprint</name>
-    <description>Camel unit testing with OSGi Blueprint</description>
+  <artifactId>camel-test-blueprint</artifactId>
+  <packaging>jar</packaging>
+  <name>Camel :: Test :: Blueprint</name>
+  <description>Camel unit testing with OSGi Blueprint</description>
 
-    <properties>
-        <firstVersion>2.10.0</firstVersion>
-        <label>testing,java,osgi</label>
+  <properties>
+    <firstVersion>2.10.0</firstVersion>
+    <label>testing,java,osgi</label>
 
-    </properties>
+  </properties>
 
-    <dependencies>
-        <dependency>
-            <groupId>org.apache.camel</groupId>
-            <artifactId>camel-test</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.camel</groupId>
-            <artifactId>camel-core</artifactId>
-            <type>test-jar</type>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.camel</groupId>
-            <artifactId>camel-blueprint</artifactId>
-            <!-- exclude aries blueprint as we add these dependencies explicit -->
-            <exclusions>
-                <exclusion>
-                    <groupId>org.apache.aries.blueprint</groupId>
-                    <artifactId>org.apache.aries.blueprint.core</artifactId>
-                </exclusion>
-            </exclusions>
-        </dependency>
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.camel</groupId>
+      <artifactId>camel-test</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.camel</groupId>
+      <artifactId>camel-core</artifactId>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.camel</groupId>
+      <artifactId>camel-blueprint</artifactId>
+      <!-- exclude aries blueprint as we add these dependencies explicit -->
+      <exclusions>
+        <exclusion>
+          <groupId>org.apache.aries.blueprint</groupId>
+          <artifactId>org.apache.aries.blueprint.core</artifactId>
+        </exclusion>
+      </exclusions>
+    </dependency>
 
-        <!-- the ordering of the dependencies can matter as we load the dependencies from the classpath
-             with felix-connect, and you may get a weird error if wrong order -->
-        <dependency>
-            <groupId>org.apache.aries.proxy</groupId>
-            <artifactId>org.apache.aries.proxy</artifactId>
-            <version>${aries-blueprint-proxy-version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.aries.blueprint</groupId>
-            <artifactId>org.apache.aries.blueprint.api</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.aries.blueprint</groupId>
-            <artifactId>org.apache.aries.blueprint.core</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.aries.blueprint</groupId>
-            <artifactId>org.apache.aries.blueprint.cm</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.aries</groupId>
-            <artifactId>org.apache.aries.util</artifactId>
-            <version>${aries-util-version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.felix</groupId>
-            <artifactId>org.apache.felix.connect</artifactId>
-            <version>${felix-connect-version}</version>
-            <exclusions>
-                <!-- felix-connect includes osgi.core and osgi.compendium version 5.0.0 -->
-                <exclusion>
-                    <groupId>org.osgi</groupId>
-                    <artifactId>osgi.core</artifactId>
-                </exclusion>
-                <exclusion>
-                    <groupId>org.osgi</groupId>
-                    <artifactId>osgi.cmpn</artifactId>
-                </exclusion>
-            </exclusions>
-        </dependency>
-        <dependency>
-            <groupId>org.ops4j.pax.swissbox</groupId>
-            <artifactId>pax-swissbox-tinybundles</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>commons-logging</groupId>
-            <artifactId>commons-logging</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>junit</groupId>
-            <artifactId>junit</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.felix</groupId>
-            <artifactId>org.apache.felix.configadmin</artifactId>
-                <!-- exclude the following dependency which otherwise would pop up a lot of compilation
-                     errors both by this and the camel-maven-plugin modules under eclipse. -->
-                <exclusions>
-                    <exclusion>
-                        <groupId>org.apache.felix</groupId>
-                        <artifactId>org.osgi.foundation</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>org.apache.felix</groupId>
-                        <artifactId>osgi.core</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>org.apache.felix</groupId>
-                        <artifactId>osgi.cmpn</artifactId>
-                    </exclusion>
-                </exclusions>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.felix</groupId>
-            <artifactId>org.apache.felix.fileinstall</artifactId>
-            <version>${felix-fileinstall-version}</version>
-                <!-- exclude the following dependency which otherwise would pop up a lot of compilation
-                     errors both by this and the camel-maven-plugin modules under eclipse. -->
-                <exclusions>
-                    <exclusion>
-                        <groupId>org.apache.felix</groupId>
-                        <artifactId>org.osgi.foundation</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>org.apache.felix</groupId>
-                        <artifactId>osgi.core</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>org.apache.felix</groupId>
-                        <artifactId>osgi.cmpn</artifactId>
-                    </exclusion>
-                </exclusions>
-        </dependency>
+    <!-- the ordering of the dependencies can matter as we load the dependencies from the classpath
+         with felix-connect, and you may get a weird error if wrong order -->
+    <dependency>
+      <groupId>org.apache.aries.proxy</groupId>
+      <artifactId>org.apache.aries.proxy</artifactId>
+      <version>${aries-blueprint-proxy-version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.aries.blueprint</groupId>
+      <artifactId>org.apache.aries.blueprint.api</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.aries.blueprint</groupId>
+      <artifactId>org.apache.aries.blueprint.core</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.aries.blueprint</groupId>
+      <artifactId>org.apache.aries.blueprint.cm</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.aries</groupId>
+      <artifactId>org.apache.aries.util</artifactId>
+      <version>${aries-util-version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.felix</groupId>
+      <artifactId>org.apache.felix.connect</artifactId>
+      <version>${felix-connect-version}</version>
+      <exclusions>
+        <!-- felix-connect includes osgi.core and osgi.compendium version 5.0.0 -->
+        <exclusion>
+          <groupId>org.osgi</groupId>
+          <artifactId>osgi.core</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.osgi</groupId>
+          <artifactId>osgi.cmpn</artifactId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+    <dependency>
+      <groupId>org.ops4j.pax.swissbox</groupId>
+      <artifactId>pax-swissbox-tinybundles</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>commons-logging</groupId>
+      <artifactId>commons-logging</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.felix</groupId>
+      <artifactId>org.apache.felix.configadmin</artifactId>
+      <!-- exclude the following dependency which otherwise would pop up a lot of compilation
+           errors both by this and the camel-maven-plugin modules under eclipse. -->
+      <exclusions>
+        <exclusion>
+          <groupId>org.apache.felix</groupId>
+          <artifactId>org.osgi.foundation</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.apache.felix</groupId>
+          <artifactId>osgi.core</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.apache.felix</groupId>
+          <artifactId>osgi.cmpn</artifactId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.felix</groupId>
+      <artifactId>org.apache.felix.fileinstall</artifactId>
+      <version>${felix-fileinstall-version}</version>
+      <!-- exclude the following dependency which otherwise would pop up a lot of compilation
+           errors both by this and the camel-maven-plugin modules under eclipse. -->
+      <exclusions>
+        <exclusion>
+          <groupId>org.apache.felix</groupId>
+          <artifactId>org.osgi.foundation</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.apache.felix</groupId>
+          <artifactId>osgi.core</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.apache.felix</groupId>
+          <artifactId>osgi.cmpn</artifactId>
+        </exclusion>
+      </exclusions>
+    </dependency>
 
-        <!-- optional dependencies for running tests -->
-          
-        <dependency>
-            <groupId>org.apache.logging.log4j</groupId>
-            <artifactId>log4j-api</artifactId>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.logging.log4j</groupId>
-            <artifactId>log4j-core</artifactId>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.logging.log4j</groupId>
-            <artifactId>log4j-slf4j-impl</artifactId>
-            <scope>test</scope>
-        </dependency>
+    <!-- optional dependencies for running tests -->
 
-    </dependencies>
+    <dependency>
+      <groupId>org.apache.logging.log4j</groupId>
+      <artifactId>log4j-api</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.logging.log4j</groupId>
+      <artifactId>log4j-core</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.logging.log4j</groupId>
+      <artifactId>log4j-slf4j-impl</artifactId>
+      <scope>test</scope>
+    </dependency>
 
-    <profiles>
-        <profile>
-            <id>jdk9+-build</id>
-            <activation>
-                <jdk>[9,)</jdk>
-            </activation>
-            <build>
-                <plugins>
-                    <plugin>
-                        <artifactId>maven-surefire-plugin</artifactId>
-                        <configuration>
-                            <argLine>--add-modules java.xml.bind,java.xml.ws --add-opens java.base/java.lang=ALL-UNNAMED</argLine>
-                        </configuration>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-    </profiles>
+  </dependencies>
+
+  <profiles>
+    <profile>
+      <id>jdk9+-build</id>
+      <activation>
+        <jdk>[9,)</jdk>
+      </activation>
+      <build>
+        <plugins>
+          <plugin>
+            <artifactId>maven-surefire-plugin</artifactId>
+            <configuration>
+              <argLine>--add-modules java.xml.bind,java.xml.ws --add-opens java.base/java.lang=ALL-UNNAMED</argLine>
+            </configuration>
+          </plugin>
+        </plugins>
+      </build>
+    </profile>
+  </profiles>
 </project>
diff --git a/components/camel-test-blueprint/src/main/java/org/apache/camel/test/blueprint/Main.java b/components/camel-test-blueprint/src/main/java/org/apache/camel/test/blueprint/Main.java
index 7a190ea..a837083 100644
--- a/components/camel-test-blueprint/src/main/java/org/apache/camel/test/blueprint/Main.java
+++ b/components/camel-test-blueprint/src/main/java/org/apache/camel/test/blueprint/Main.java
@@ -16,9 +16,8 @@
  */
 package org.apache.camel.test.blueprint;
 
-import java.util.HashMap;
 import java.util.LinkedList;
-import java.util.Map;
+
 import org.apache.camel.CamelContext;
 import org.apache.camel.ProducerTemplate;
 import org.apache.camel.main.MainSupport;
@@ -32,7 +31,6 @@ public class Main extends MainSupport {
     protected static Main instance;
     private BundleContext bundleContext;
     private String descriptors = "OSGI-INF/blueprint/*.xml";
-    private CamelContext camelContext;
     private String bundleName = "MyBundle";
     private boolean includeSelfAsBundle;
     private String configAdminPid;
@@ -88,8 +86,12 @@ public class Main extends MainSupport {
     }
 
     @Override
+    protected CamelContext createCamelContext() {
+        return CamelBlueprintHelper.getOsgiService(bundleContext, CamelContext.class);
+    }
+
+    @Override
     protected void doStart() throws Exception {
-        super.doStart();
         if (bundleContext == null) {
             String descriptors = getDescriptors();
             if (descriptors == null) {
@@ -102,10 +104,14 @@ public class Main extends MainSupport {
             } else {
                 bundleContext = createBundleContext(bundleName);
             }
-
-            camelContext = CamelBlueprintHelper.getOsgiService(bundleContext, CamelContext.class);
-            if (camelContext == null) {
-                throw new IllegalArgumentException("Cannot find CamelContext in blueprint XML file: " + descriptors);
+        }
+        try {
+            super.doStart();
+            initCamelContext();
+        } finally {
+            // if we were veto started then mark as completed
+            if (getCamelContext() != null && getCamelContext().isVetoStarted()) {
+                completed();
             }
         }
     }
@@ -113,11 +119,11 @@ public class Main extends MainSupport {
     @Override
     protected void doStop() throws Exception {
         // stop camel context
-        if (camelContext != null) {
-            camelContext.stop();
+        if (getCamelContext() != null) {
+            getCamelContext().stop();
         }
         // and then stop blueprint
-        LOG.debug("Stopping Blueprint XML file: " + descriptors);
+        LOG.debug("Stopping Blueprint XML file: {}", descriptors);
         CamelBlueprintHelper.disposeBundleContext(bundleContext);
         // call completed to properly stop as we count down the waiting latch
         completed();
@@ -125,8 +131,8 @@ public class Main extends MainSupport {
 
     @Override
     protected ProducerTemplate findOrCreateCamelTemplate() {
-        if (camelContext != null) {
-            return camelContext.createProducerTemplate();
+        if (getCamelContext() != null) {
+            return getCamelContext().createProducerTemplate();
         } else {
             return null;
         }
@@ -146,15 +152,6 @@ public class Main extends MainSupport {
                 loader, configAdminPidFiles);
     }
 
-    @Override
-    protected Map<String, CamelContext> getCamelContextMap() {
-        Map<String, CamelContext> map = new HashMap<>(1);
-        if (camelContext != null) {
-            map.put(camelContext.getName(), camelContext);
-        }
-        return map;
-    }
-
     public String getDescriptors() {
         return descriptors;
     }
diff --git a/components/camel-test-blueprint/src/test/java/org/apache/camel/test/blueprint/MyMainAppTest.java b/components/camel-test-blueprint/src/test/java/org/apache/camel/test/blueprint/MyMainAppTest.java
index 3576ae0..8624575 100644
--- a/components/camel-test-blueprint/src/test/java/org/apache/camel/test/blueprint/MyMainAppTest.java
+++ b/components/camel-test-blueprint/src/test/java/org/apache/camel/test/blueprint/MyMainAppTest.java
@@ -16,15 +16,10 @@
  */
 package org.apache.camel.test.blueprint;
 
-
-
-import java.util.Map;
-
 import org.apache.camel.CamelContext;
 import org.junit.Test;
 
-import static org.junit.Assert.assertTrue;
-
+import static org.junit.Assert.assertNotNull;
 
 public class MyMainAppTest {
 
@@ -38,15 +33,11 @@ public class MyMainAppTest {
         Main main = new Main();
         run(main);
         
-        Map<String, CamelContext> contexts = main.getCamelContextMap();
-        // we should get at least one CamelContext
-        assertTrue("We should get at least one camelcontext", contexts.size() >= 1);
-        
-        
+        CamelContext camelContext = main.getCamelContext();
+        assertNotNull(camelContext);
     }
 
     public void run(Main main) throws Exception {
-        
         main.setBundleName("MyMainBundle");
         // as we run this test without packing ourselves as bundle, then include ourselves
         main.setIncludeSelfAsBundle(true);
diff --git a/core/camel-core/src/main/java/org/apache/camel/main/Main.java b/core/camel-core/src/main/java/org/apache/camel/main/Main.java
index 5c03beb..184be9c 100644
--- a/core/camel-core/src/main/java/org/apache/camel/main/Main.java
+++ b/core/camel-core/src/main/java/org/apache/camel/main/Main.java
@@ -16,7 +16,6 @@
  */
 package org.apache.camel.main;
 
-import java.util.HashMap;
 import java.util.Map;
 
 import org.apache.camel.CamelContext;
@@ -96,35 +95,19 @@ public class Main extends MainSupport {
         return registry.findByTypeWithName(type);
     }
 
-    /**
-     * Gets or creates the {@link org.apache.camel.CamelContext} this main class is using.
-     * 
-     * It just create a new CamelContextMap per call, please don't use it to access the camel context that will be ran by main.
-     * If you want to setup the CamelContext please use MainListener to get the new created camel context.
-     */
-    public CamelContext getOrCreateCamelContext() {
-        // force init
-        Map<String, CamelContext> map = getCamelContextMap();
-        if (map.size() >= 1) {
-            return map.values().iterator().next();
-        } else {
-            throw new IllegalStateException("Error creating CamelContext");
-        }
-    }
-
     // Implementation methods
     // -------------------------------------------------------------------------
 
     @Override
     protected void doStart() throws Exception {
         super.doStart();
-        postProcessContext();
-        if (getCamelContexts().size() > 0) {
+        initCamelContext();
+        if (getCamelContext() != null) {
             try {
-                getCamelContexts().get(0).start();
                 // if we were veto started then mark as completed
+                getCamelContext().start();
             } finally {
-                if (getCamelContexts().get(0).isVetoStarted()) {
+                if (getCamelContext().isVetoStarted()) {
                     completed();
                 }
             }
@@ -133,28 +116,20 @@ public class Main extends MainSupport {
 
     protected void doStop() throws Exception {
         super.doStop();
-        if (getCamelContexts().size() > 0) {
-            getCamelContexts().get(0).stop();
+        if (getCamelContext() != null) {
+            getCamelContext().stop();
         }
     }
 
     protected ProducerTemplate findOrCreateCamelTemplate() {
-        if (getCamelContexts().size() > 0) {
-            return getCamelContexts().get(0).createProducerTemplate();
+        if (getCamelContext() != null) {
+            return getCamelContext().createProducerTemplate();
         } else {
             return null;
         }
     }
 
-    protected Map<String, CamelContext> getCamelContextMap() {
-        Map<String, CamelContext> answer = new HashMap<>();
-
-        CamelContext camelContext = createContext();
-        answer.put("camel-1", camelContext);
-        return answer;
-    }
-
-    protected CamelContext createContext() {
+    protected CamelContext createCamelContext() {
         return new DefaultCamelContext(registry);
     }
 
diff --git a/core/camel-core/src/main/java/org/apache/camel/main/MainSupport.java b/core/camel-core/src/main/java/org/apache/camel/main/MainSupport.java
index 32a9306..0ff50ac 100644
--- a/core/camel-core/src/main/java/org/apache/camel/main/MainSupport.java
+++ b/core/camel-core/src/main/java/org/apache/camel/main/MainSupport.java
@@ -20,8 +20,6 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.LinkedList;
 import java.util.List;
-import java.util.Map;
-import java.util.Set;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicBoolean;
@@ -61,11 +59,12 @@ public abstract class MainSupport extends ServiceSupport {
     protected int durationMaxMessages;
     protected TimeUnit timeUnit = TimeUnit.SECONDS;
     protected boolean trace;
+
+    protected CamelContext camelContext;
     protected List<RouteBuilder> routeBuilders = new ArrayList<>();
     protected String routeBuilderClasses;
     protected String fileWatchDirectory;
     protected boolean fileWatchDirectoryRecursively;
-    protected final List<CamelContext> camelContexts = new ArrayList<>();
     protected ProducerTemplate camelTemplate;
     protected boolean hangupInterceptorEnabled = true;
     protected int durationHitExitCode = DEFAULT_EXIT_CODE;
@@ -520,8 +519,8 @@ public abstract class MainSupport extends ServiceSupport {
         System.out.println();
     }
 
-    public List<CamelContext> getCamelContexts() {
-        return camelContexts;
+    public CamelContext getCamelContext() {
+        return camelContext;
     }
 
     public List<RouteBuilder> getRouteBuilders() {
@@ -534,7 +533,7 @@ public abstract class MainSupport extends ServiceSupport {
 
     public List<RouteDefinition> getRouteDefinitions() {
         List<RouteDefinition> answer = new ArrayList<>();
-        for (CamelContext camelContext : camelContexts) {
+        if (camelContext != null) {
             answer.addAll(camelContext.adapt(ModelCamelContext.class).getRouteDefinitions());
         }
         return answer;
@@ -549,16 +548,11 @@ public abstract class MainSupport extends ServiceSupport {
 
     protected abstract ProducerTemplate findOrCreateCamelTemplate();
 
-    protected abstract Map<String, CamelContext> getCamelContextMap();
+    protected abstract CamelContext createCamelContext();
 
-    protected void postProcessContext() throws Exception {
-        Map<String, CamelContext> map = getCamelContextMap();
-        Set<Map.Entry<String, CamelContext>> entries = map.entrySet();
-        for (Map.Entry<String, CamelContext> entry : entries) {
-            CamelContext camelContext = entry.getValue();
-            camelContexts.add(camelContext);
-            postProcessCamelContext(camelContext);
-        }
+    protected void initCamelContext() throws Exception {
+        camelContext = createCamelContext();
+        postProcessCamelContext(camelContext);
     }
 
     public ModelJAXBContextFactory getModelJAXBContextFactory() {
diff --git a/core/camel-core/src/test/java/org/apache/camel/impl/MainSupportTest.java b/core/camel-core/src/test/java/org/apache/camel/impl/MainSupportTest.java
index 4bc3644..c6a6e2c 100644
--- a/core/camel-core/src/test/java/org/apache/camel/impl/MainSupportTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/impl/MainSupportTest.java
@@ -16,8 +16,6 @@
  */
 package org.apache.camel.impl;
 
-import java.util.Map;
-
 import org.apache.camel.CamelContext;
 import org.apache.camel.ContextTestSupport;
 import org.apache.camel.ProducerTemplate;
@@ -28,11 +26,13 @@ public class MainSupportTest extends ContextTestSupport {
 
     private class MyMainSupport extends MainSupport {
 
+        @Override
         protected ProducerTemplate findOrCreateCamelTemplate() {
             return context.createProducerTemplate();
         }
 
-        protected Map<String, CamelContext> getCamelContextMap() {
+        @Override
+        protected CamelContext createCamelContext() {
             return null;
         }
     }
diff --git a/core/camel-core/src/test/java/org/apache/camel/main/MainTest.java b/core/camel-core/src/test/java/org/apache/camel/main/MainTest.java
index 4fad442..799914a 100644
--- a/core/camel-core/src/test/java/org/apache/camel/main/MainTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/main/MainTest.java
@@ -32,13 +32,12 @@ public class MainTest extends Assert {
         Main main = new Main();
         main.addRouteBuilder(new MyRouteBuilder());
         main.enableTrace();
-        main.bind("foo", new Integer(31));
+        main.bind("foo", 31);
         main.start();
 
-        List<CamelContext> contextList = main.getCamelContexts();
-        assertNotNull(contextList);
-        assertEquals("Did not get the expected count of Camel contexts", 1, contextList.size());
-        CamelContext camelContext = contextList.get(0);
+        CamelContext camelContext = main.getCamelContext();
+
+        assertNotNull(camelContext);
         assertEquals("Could not find the registry bound object", 31, camelContext.getRegistry().lookupByName("foo"));
 
         MockEndpoint endpoint = camelContext.getEndpoint("mock:results", MockEndpoint.class);
@@ -58,13 +57,11 @@ public class MainTest extends Assert {
         main.addRouteBuilder(new MyRouteBuilder());
         main.disableHangupSupport();
         main.enableTrace();
-        main.bind("foo", new Integer(31));
+        main.bind("foo", 31);
         main.start();
 
-        List<CamelContext> contextList = main.getCamelContexts();
-        assertNotNull(contextList);
-        assertEquals("Did not get the expected count of Camel contexts", 1, contextList.size());
-        CamelContext camelContext = contextList.get(0);
+        CamelContext camelContext = main.getCamelContext();
+
         assertEquals("Could not find the registry bound object", 31, camelContext.getRegistry().lookupByName("foo"));
 
         MockEndpoint endpoint = camelContext.getEndpoint("mock:results", MockEndpoint.class);
@@ -84,11 +81,8 @@ public class MainTest extends Assert {
         main.parseArguments(new String[]{"-r", "org.apache.camel.main.MainTest$MyRouteBuilder"});
         main.start();
 
-        List<CamelContext> contextList = main.getCamelContexts();
-        assertNotNull(contextList);
-        assertEquals("Did not get the expected count of Camel contexts", 1, contextList.size());
-        CamelContext camelContext = contextList.get(0);
-        
+        CamelContext camelContext = main.getCamelContext();
+
         MockEndpoint endpoint = camelContext.getEndpoint("mock:results", MockEndpoint.class);
         endpoint.expectedMinimumMessageCount(1);