You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by as...@apache.org on 2016/04/04 14:12:45 UTC

[1/4] camel git commit: CAMEL-9798: Add support for injecting default ProducerTemplate in Camel CDI

Repository: camel
Updated Branches:
  refs/heads/camel-2.17.x ff198f23a -> fbb0b8c7e


CAMEL-9798: Add support for injecting default ProducerTemplate in Camel CDI


Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/eab03dd9
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/eab03dd9
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/eab03dd9

Branch: refs/heads/camel-2.17.x
Commit: eab03dd9df300feb7b7e3e115297ca8e99389f08
Parents: ff198f2
Author: Antonin Stefanutti <an...@stefanutti.fr>
Authored: Mon Apr 4 10:24:52 2016 +0200
Committer: Antonin Stefanutti <an...@stefanutti.fr>
Committed: Mon Apr 4 14:10:44 2016 +0200

----------------------------------------------------------------------
 .../org/apache/camel/cdi/CdiCamelFactory.java   |  25 +++-
 .../cdi/test/DefaultProducerTemplateTest.java   |  68 +++++++++
 .../test/MultiContextProducerTemplateTest.java  | 137 +++++++++++++++++++
 3 files changed, 227 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/eab03dd9/components/camel-cdi/src/main/java/org/apache/camel/cdi/CdiCamelFactory.java
----------------------------------------------------------------------
diff --git a/components/camel-cdi/src/main/java/org/apache/camel/cdi/CdiCamelFactory.java b/components/camel-cdi/src/main/java/org/apache/camel/cdi/CdiCamelFactory.java
index cdb2336..ecd309c 100755
--- a/components/camel-cdi/src/main/java/org/apache/camel/cdi/CdiCamelFactory.java
+++ b/components/camel-cdi/src/main/java/org/apache/camel/cdi/CdiCamelFactory.java
@@ -28,6 +28,7 @@ import java.util.Iterator;
 import java.util.Set;
 import javax.enterprise.event.Event;
 import javax.enterprise.inject.Any;
+import javax.enterprise.inject.Default;
 import javax.enterprise.inject.InjectionException;
 import javax.enterprise.inject.Instance;
 import javax.enterprise.inject.Produces;
@@ -49,15 +50,24 @@ final class CdiCamelFactory {
         return selectContext(ip, instance, extension).getTypeConverter();
     }
 
-    @Uri("")
     @Produces
+    @Default @Uri("")
     // Qualifiers are dynamically added in CdiCamelExtension
     private static ProducerTemplate producerTemplate(InjectionPoint ip, @Any Instance<CamelContext> instance, CdiCamelExtension extension) {
         Uri uri = CdiSpiHelper.getQualifierByType(ip, Uri.class);
+        if (uri != null) {
+            return producerTemplateFromUri(ip, instance, extension, uri);
+        } else {
+            return defaultProducerTemplate(ip, instance, extension);
+        }
+    }
+
+    private static ProducerTemplate producerTemplateFromUri(InjectionPoint ip, @Any Instance<CamelContext> instance, CdiCamelExtension extension, Uri uri) {
         try {
-            CamelContext context = uri.context().isEmpty() ? selectContext(ip, instance, extension) : selectContext(uri.context(), instance);
+            CamelContext context = uri.context().isEmpty()
+                ? selectContext(ip, instance, extension)
+                : selectContext(uri.context(), instance);
             ProducerTemplate producerTemplate = context.createProducerTemplate();
-            // FIXME: avoid NPE caused by missing @Uri qualifier when injection point is @ContextName qualified
             Endpoint endpoint = context.getEndpoint(uri.value(), Endpoint.class);
             producerTemplate.setDefaultEndpoint(endpoint);
             return producerTemplate;
@@ -66,6 +76,15 @@ final class CdiCamelFactory {
         }
     }
 
+    private static ProducerTemplate defaultProducerTemplate(InjectionPoint ip, @Any Instance<CamelContext> instance, CdiCamelExtension extension) {
+        try {
+            CamelContext context = selectContext(ip, instance, extension);
+            return context.createProducerTemplate();
+        } catch (Exception cause) {
+            throw new InjectionException("Error injecting producer template into " + ip, cause);
+        }
+    }
+
     @Produces
     @Typed(MockEndpoint.class)
     // Qualifiers are dynamically added in CdiCamelExtension

http://git-wip-us.apache.org/repos/asf/camel/blob/eab03dd9/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/DefaultProducerTemplateTest.java
----------------------------------------------------------------------
diff --git a/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/DefaultProducerTemplateTest.java b/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/DefaultProducerTemplateTest.java
new file mode 100644
index 0000000..6191b8d
--- /dev/null
+++ b/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/DefaultProducerTemplateTest.java
@@ -0,0 +1,68 @@
+/**
+ * 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.cdi.test;
+
+import java.util.concurrent.TimeUnit;
+import javax.inject.Inject;
+
+import org.apache.camel.ProducerTemplate;
+import org.apache.camel.cdi.CdiCamelExtension;
+import org.apache.camel.cdi.Uri;
+import org.apache.camel.cdi.bean.UriEndpointRoute;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.jboss.arquillian.container.test.api.Deployment;
+import org.jboss.arquillian.junit.Arquillian;
+import org.jboss.shrinkwrap.api.Archive;
+import org.jboss.shrinkwrap.api.ShrinkWrap;
+import org.jboss.shrinkwrap.api.asset.EmptyAsset;
+import org.jboss.shrinkwrap.api.spec.JavaArchive;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import static org.apache.camel.component.mock.MockEndpoint.assertIsSatisfied;
+
+@RunWith(Arquillian.class)
+public class DefaultProducerTemplateTest {
+
+    @Inject
+    private ProducerTemplate producer;
+
+    @Inject
+    @Uri("mock:outbound")
+    private MockEndpoint out;
+
+    @Deployment
+    public static Archive<?> deployment() {
+        return ShrinkWrap.create(JavaArchive.class)
+            // Camel CDI
+            .addPackage(CdiCamelExtension.class.getPackage())
+            // Test class
+            .addClass(UriEndpointRoute.class)
+            // Bean archive deployment descriptor
+            .addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml");
+    }
+
+    @Test
+    public void sendMessageToInbound() throws InterruptedException {
+        out.expectedMessageCount(1);
+        out.expectedBodiesReceived("test");
+        
+        producer.sendBody("direct:inbound", "test");
+
+        assertIsSatisfied(2L, TimeUnit.SECONDS, out);
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/eab03dd9/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/MultiContextProducerTemplateTest.java
----------------------------------------------------------------------
diff --git a/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/MultiContextProducerTemplateTest.java b/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/MultiContextProducerTemplateTest.java
new file mode 100644
index 0000000..03550fc
--- /dev/null
+++ b/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/MultiContextProducerTemplateTest.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.cdi.test;
+
+import java.util.concurrent.TimeUnit;
+import javax.inject.Inject;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.ProducerTemplate;
+import org.apache.camel.cdi.CdiCamelExtension;
+import org.apache.camel.cdi.ContextName;
+import org.apache.camel.cdi.Uri;
+import org.apache.camel.cdi.bean.DefaultCamelContextBean;
+import org.apache.camel.cdi.bean.EndpointInjectRoute;
+import org.apache.camel.cdi.bean.FirstCamelContextBean;
+import org.apache.camel.cdi.bean.FirstCamelContextEndpointInjectRoute;
+import org.apache.camel.cdi.bean.SecondCamelContextBean;
+import org.apache.camel.cdi.bean.SecondCamelContextEndpointInjectRoute;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.jboss.arquillian.container.test.api.Deployment;
+import org.jboss.arquillian.junit.Arquillian;
+import org.jboss.arquillian.junit.InSequence;
+import org.jboss.shrinkwrap.api.Archive;
+import org.jboss.shrinkwrap.api.ShrinkWrap;
+import org.jboss.shrinkwrap.api.asset.EmptyAsset;
+import org.jboss.shrinkwrap.api.spec.JavaArchive;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import static org.apache.camel.cdi.expression.ExchangeExpression.fromCamelContext;
+import static org.apache.camel.component.mock.MockEndpoint.assertIsSatisfied;
+
+@RunWith(Arquillian.class)
+public class MultiContextProducerTemplateTest {
+
+    @Inject
+    private CamelContext defaultCamelContext;
+
+    @Inject
+    private ProducerTemplate defaultInbound;
+
+    @Inject @Uri("mock:outbound")
+    private MockEndpoint defaultOutbound;
+
+    @Inject @ContextName("first")
+    private CamelContext firstCamelContext;
+
+    @Inject @ContextName("first")
+    private ProducerTemplate firstInbound;
+
+    @Inject @ContextName("first") @Uri("mock:outbound")
+    private MockEndpoint firstOutbound;
+
+    @Inject @ContextName("second")
+    private CamelContext secondCamelContext;
+
+    @Inject @ContextName("second")
+    private ProducerTemplate secondInbound;
+
+    @Inject @ContextName("second") @Uri("mock:outbound")
+    private MockEndpoint secondOutbound;
+
+    @Deployment
+    public static Archive<?> deployment() {
+        return ShrinkWrap.create(JavaArchive.class)
+            // Camel CDI
+            .addPackage(CdiCamelExtension.class.getPackage())
+            // Test classes
+            .addClasses(
+                DefaultCamelContextBean.class,
+                EndpointInjectRoute.class,
+                FirstCamelContextBean.class,
+                FirstCamelContextEndpointInjectRoute.class,
+                SecondCamelContextBean.class,
+                SecondCamelContextEndpointInjectRoute.class)
+            // Bean archive deployment descriptor
+            .addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml");
+    }
+
+    @Test
+    @InSequence(1)
+    public void configureCamelContexts() throws Exception {
+        secondCamelContext.startAllRoutes();
+    }
+
+    @Test
+    @InSequence(2)
+    public void sendMessageToDefaultCamelContextInbound() throws InterruptedException {
+        defaultOutbound.expectedMessageCount(1);
+        defaultOutbound.expectedBodiesReceived("test-default");
+        defaultOutbound.message(0).exchange().matches(fromCamelContext("camel-cdi"));
+
+        defaultInbound.sendBody("direct:inbound", "test-default");
+
+        assertIsSatisfied(2L, TimeUnit.SECONDS, defaultOutbound);
+    }
+
+    @Test
+    @InSequence(3)
+    public void sendMessageToFirstCamelContextInbound() throws InterruptedException {
+        firstOutbound.expectedMessageCount(1);
+        firstOutbound.expectedBodiesReceived("test-first");
+        firstOutbound.expectedHeaderReceived("context", "first");
+        firstOutbound.message(0).exchange().matches(fromCamelContext("first"));
+
+        firstInbound.sendBody("direct:inbound", "test-first");
+
+        assertIsSatisfied(2L, TimeUnit.SECONDS, firstOutbound);
+    }
+
+    @Test
+    @InSequence(4)
+    public void sendMessageToSecondCamelContextInbound() throws InterruptedException {
+        secondOutbound.expectedMessageCount(1);
+        secondOutbound.expectedBodiesReceived("test-second");
+        secondOutbound.expectedHeaderReceived("context", "second");
+        secondOutbound.message(0).exchange().matches(fromCamelContext("second"));
+
+        secondInbound.sendBody("direct:inbound", "test-second");
+
+        assertIsSatisfied(2L, TimeUnit.SECONDS, secondOutbound);
+    }
+}


[3/4] camel git commit: Polish formatting in CdiCamelFactory

Posted by as...@apache.org.
Polish formatting in CdiCamelFactory


Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/ca202198
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/ca202198
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/ca202198

Branch: refs/heads/camel-2.17.x
Commit: ca202198472c20236efd3bb4f9c9ac933183719f
Parents: 1d28792
Author: Antonin Stefanutti <an...@stefanutti.fr>
Authored: Mon Apr 4 10:38:34 2016 +0200
Committer: Antonin Stefanutti <an...@stefanutti.fr>
Committed: Mon Apr 4 14:11:12 2016 +0200

----------------------------------------------------------------------
 .../main/java/org/apache/camel/cdi/CdiCamelFactory.java | 12 +++++++++---
 1 file changed, 9 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/ca202198/components/camel-cdi/src/main/java/org/apache/camel/cdi/CdiCamelFactory.java
----------------------------------------------------------------------
diff --git a/components/camel-cdi/src/main/java/org/apache/camel/cdi/CdiCamelFactory.java b/components/camel-cdi/src/main/java/org/apache/camel/cdi/CdiCamelFactory.java
index 29e9227..9ee9f84 100755
--- a/components/camel-cdi/src/main/java/org/apache/camel/cdi/CdiCamelFactory.java
+++ b/components/camel-cdi/src/main/java/org/apache/camel/cdi/CdiCamelFactory.java
@@ -104,7 +104,9 @@ final class CdiCamelFactory {
     private static MockEndpoint mockEndpointFromUri(InjectionPoint ip, @Any Instance<CamelContext> instance, CdiCamelExtension extension) {
         Uri uri = CdiSpiHelper.getQualifierByType(ip, Uri.class);
         try {
-            CamelContext context = uri.context().isEmpty() ? selectContext(ip, instance, extension) : selectContext(uri.context(), instance);
+            CamelContext context = uri.context().isEmpty()
+                ? selectContext(ip, instance, extension)
+                : selectContext(uri.context(), instance);
             return context.getEndpoint(uri.value(), MockEndpoint.class);
         } catch (Exception cause) {
             throw new InjectionException("Error injecting mock endpoint annotated with " + uri
@@ -121,7 +123,9 @@ final class CdiCamelFactory {
     private static MockEndpoint createMockEndpoint(InjectionPoint ip, @Any Instance<CamelContext> instance, CdiCamelExtension extension) {
         Mock mock = CdiSpiHelper.getQualifierByType(ip, Mock.class);
         try {
-            CamelContext context = mock.context().isEmpty() ? selectContext(ip, instance, extension) : selectContext(mock.context(), instance);
+            CamelContext context = mock.context().isEmpty()
+                ? selectContext(ip, instance, extension)
+                : selectContext(mock.context(), instance);
             return context.getEndpoint(mock.value(), MockEndpoint.class);
         } catch (Exception cause) {
             throw new InjectionException("Error injecting mock endpoint annotated with " + mock + " into " + ip, cause);
@@ -134,7 +138,9 @@ final class CdiCamelFactory {
     private static Endpoint endpoint(InjectionPoint ip, @Any Instance<CamelContext> instance, CdiCamelExtension extension) {
         Uri uri = CdiSpiHelper.getQualifierByType(ip, Uri.class);
         try {
-            CamelContext context = uri.context().isEmpty() ? selectContext(ip, instance, extension) : selectContext(uri.context(), instance);
+            CamelContext context = uri.context().isEmpty()
+                ? selectContext(ip, instance, extension)
+                : selectContext(uri.context(), instance);
             return context.getEndpoint(uri.value(), Endpoint.class);
         } catch (Exception cause) {
             throw new InjectionException("Error injecting endpoint annotated with " + uri + " into " + ip, cause);


[2/4] camel git commit: Remove redundant default parameter value

Posted by as...@apache.org.
Remove redundant default parameter value


Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/1d28792a
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/1d28792a
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/1d28792a

Branch: refs/heads/camel-2.17.x
Commit: 1d28792a86b1af3ed1df2881f9910e2bfd9a10da
Parents: eab03dd
Author: Antonin Stefanutti <an...@stefanutti.fr>
Authored: Mon Apr 4 10:34:50 2016 +0200
Committer: Antonin Stefanutti <an...@stefanutti.fr>
Committed: Mon Apr 4 14:11:00 2016 +0200

----------------------------------------------------------------------
 .../src/main/java/org/apache/camel/cdi/CdiCamelFactory.java        | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/1d28792a/components/camel-cdi/src/main/java/org/apache/camel/cdi/CdiCamelFactory.java
----------------------------------------------------------------------
diff --git a/components/camel-cdi/src/main/java/org/apache/camel/cdi/CdiCamelFactory.java b/components/camel-cdi/src/main/java/org/apache/camel/cdi/CdiCamelFactory.java
index ecd309c..29e9227 100755
--- a/components/camel-cdi/src/main/java/org/apache/camel/cdi/CdiCamelFactory.java
+++ b/components/camel-cdi/src/main/java/org/apache/camel/cdi/CdiCamelFactory.java
@@ -114,7 +114,7 @@ final class CdiCamelFactory {
 
     // Maintained for backward compatibility reason though this is redundant with @Uri
     // see https://issues.apache.org/jira/browse/CAMEL-5553?focusedCommentId=13445936&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-13445936
-    @Mock("")
+    @Mock
     @Produces
     @Typed(MockEndpoint.class)
     // Qualifiers are dynamically added in CdiCamelExtension


[4/4] camel git commit: CAMEL-9811: Add support for consumer template injection

Posted by as...@apache.org.
CAMEL-9811: Add support for consumer template injection


Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/fbb0b8c7
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/fbb0b8c7
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/fbb0b8c7

Branch: refs/heads/camel-2.17.x
Commit: fbb0b8c7e05d065b0ad818c476895cb5c9ebda60
Parents: ca20219
Author: Antonin Stefanutti <an...@stefanutti.fr>
Authored: Mon Apr 4 14:05:24 2016 +0200
Committer: Antonin Stefanutti <an...@stefanutti.fr>
Committed: Mon Apr 4 14:11:24 2016 +0200

----------------------------------------------------------------------
 .../org/apache/camel/cdi/CdiCamelExtension.java |  13 +-
 .../org/apache/camel/cdi/CdiCamelFactory.java   |   7 ++
 .../camel/cdi/test/ConsumerTemplateTest.java    |  64 ++++++++++
 .../test/MultiContextConsumerTemplateTest.java  | 123 +++++++++++++++++++
 4 files changed, 205 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/fbb0b8c7/components/camel-cdi/src/main/java/org/apache/camel/cdi/CdiCamelExtension.java
----------------------------------------------------------------------
diff --git a/components/camel-cdi/src/main/java/org/apache/camel/cdi/CdiCamelExtension.java b/components/camel-cdi/src/main/java/org/apache/camel/cdi/CdiCamelExtension.java
index 5d79f46..19e3eba 100755
--- a/components/camel-cdi/src/main/java/org/apache/camel/cdi/CdiCamelExtension.java
+++ b/components/camel-cdi/src/main/java/org/apache/camel/cdi/CdiCamelExtension.java
@@ -55,6 +55,7 @@ import org.apache.camel.BeanInject;
 import org.apache.camel.CamelContext;
 import org.apache.camel.CamelContextAware;
 import org.apache.camel.Consume;
+import org.apache.camel.ConsumerTemplate;
 import org.apache.camel.Converter;
 import org.apache.camel.Endpoint;
 import org.apache.camel.EndpointInject;
@@ -157,6 +158,10 @@ public class CdiCamelExtension implements Extension {
         producerBeans.put(ppm.getAnnotatedProducerMethod().getJavaMember(), ppm.getBean());
     }
 
+    private void consumerTemplateBeans(@Observes ProcessProducerMethod<ConsumerTemplate, CdiCamelFactory> ppm) {
+        producerBeans.put(ppm.getAnnotatedProducerMethod().getJavaMember(), ppm.getBean());
+    }
+
     private void producerTemplateBeans(@Observes ProcessProducerMethod<ProducerTemplate, CdiCamelFactory> ppm) {
         producerBeans.put(ppm.getAnnotatedProducerMethod().getJavaMember(), ppm.getBean());
     }
@@ -169,7 +174,9 @@ public class CdiCamelExtension implements Extension {
                 continue;
             }
             Class<?> type = CdiSpiHelper.getRawType(am.getBaseType());
-            if (Endpoint.class.isAssignableFrom(type) || ProducerTemplate.class.equals(type)) {
+            if (Endpoint.class.isAssignableFrom(type)
+                || ConsumerTemplate.class.equals(type)
+                || ProducerTemplate.class.equals(type)) {
                 Set<Annotation> qualifiers = CdiSpiHelper.getQualifiers(am, manager);
                 producerQualifiers.put(am.getJavaMember(), qualifiers);
                 Set<Annotation> annotations = new HashSet<>(am.getAnnotations());
@@ -237,7 +244,9 @@ public class CdiCamelExtension implements Extension {
                     qualifiers.addAll(ip.getQualifiers());
                 }
             } else {
-                if (Endpoint.class.isAssignableFrom(type) || ProducerTemplate.class.isAssignableFrom(type)) {
+                if (Endpoint.class.isAssignableFrom(type)
+                    || ConsumerTemplate.class.equals(type)
+                    || ProducerTemplate.class.equals(type)) {
                     qualifiers.addAll(CdiSpiHelper.excludeElementOfTypes(contextQualifiers, Default.class, Named.class));
                 }
             }

http://git-wip-us.apache.org/repos/asf/camel/blob/fbb0b8c7/components/camel-cdi/src/main/java/org/apache/camel/cdi/CdiCamelFactory.java
----------------------------------------------------------------------
diff --git a/components/camel-cdi/src/main/java/org/apache/camel/cdi/CdiCamelFactory.java b/components/camel-cdi/src/main/java/org/apache/camel/cdi/CdiCamelFactory.java
index 9ee9f84..965da41 100755
--- a/components/camel-cdi/src/main/java/org/apache/camel/cdi/CdiCamelFactory.java
+++ b/components/camel-cdi/src/main/java/org/apache/camel/cdi/CdiCamelFactory.java
@@ -38,6 +38,7 @@ import javax.enterprise.inject.spi.InjectionPoint;
 import javax.enterprise.util.TypeLiteral;
 
 import org.apache.camel.CamelContext;
+import org.apache.camel.ConsumerTemplate;
 import org.apache.camel.Endpoint;
 import org.apache.camel.ProducerTemplate;
 import org.apache.camel.TypeConverter;
@@ -51,6 +52,12 @@ final class CdiCamelFactory {
     }
 
     @Produces
+    // Qualifiers are dynamically added in CdiCamelExtension
+    private static ConsumerTemplate consumerTemplate(InjectionPoint ip, @Any Instance<CamelContext> instance, CdiCamelExtension extension) {
+        return selectContext(ip, instance, extension).createConsumerTemplate();
+    }
+
+    @Produces
     @Default @Uri("")
     // Qualifiers are dynamically added in CdiCamelExtension
     private static ProducerTemplate producerTemplate(InjectionPoint ip, @Any Instance<CamelContext> instance, CdiCamelExtension extension) {

http://git-wip-us.apache.org/repos/asf/camel/blob/fbb0b8c7/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/ConsumerTemplateTest.java
----------------------------------------------------------------------
diff --git a/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/ConsumerTemplateTest.java b/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/ConsumerTemplateTest.java
new file mode 100644
index 0000000..98e0c10
--- /dev/null
+++ b/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/ConsumerTemplateTest.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.cdi.test;
+
+import java.util.concurrent.TimeUnit;
+import javax.inject.Inject;
+
+import org.apache.camel.ConsumerTemplate;
+import org.apache.camel.ProducerTemplate;
+import org.apache.camel.cdi.CdiCamelExtension;
+import org.jboss.arquillian.container.test.api.Deployment;
+import org.jboss.arquillian.junit.Arquillian;
+import org.jboss.shrinkwrap.api.Archive;
+import org.jboss.shrinkwrap.api.ShrinkWrap;
+import org.jboss.shrinkwrap.api.asset.EmptyAsset;
+import org.jboss.shrinkwrap.api.spec.JavaArchive;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import static org.hamcrest.Matchers.equalTo;
+import static org.hamcrest.Matchers.is;
+import static org.junit.Assert.assertThat;
+
+@RunWith(Arquillian.class)
+public class ConsumerTemplateTest {
+
+    @Inject
+    private ProducerTemplate producer;
+
+    @Inject
+    private ConsumerTemplate consumer;
+
+    @Deployment
+    public static Archive<?> deployment() {
+        return ShrinkWrap.create(JavaArchive.class)
+            // Camel CDI
+            .addPackage(CdiCamelExtension.class.getPackage())
+            // Bean archive deployment descriptor
+            .addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml");
+    }
+
+    @Test
+    public void sendThenReceiveBody() {
+        producer.sendBody("seda:foo", "test");
+
+        String body = consumer.receiveBody("seda:foo", TimeUnit.SECONDS.toMillis(1L), String.class);
+
+        assertThat("Body is incorrect!", body, is(equalTo("test")));
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/fbb0b8c7/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/MultiContextConsumerTemplateTest.java
----------------------------------------------------------------------
diff --git a/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/MultiContextConsumerTemplateTest.java b/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/MultiContextConsumerTemplateTest.java
new file mode 100644
index 0000000..e5940ea
--- /dev/null
+++ b/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/MultiContextConsumerTemplateTest.java
@@ -0,0 +1,123 @@
+/**
+ * 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.cdi.test;
+
+import java.util.concurrent.TimeUnit;
+import javax.inject.Inject;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.ConsumerTemplate;
+import org.apache.camel.ProducerTemplate;
+import org.apache.camel.cdi.CdiCamelExtension;
+import org.apache.camel.cdi.ContextName;
+import org.apache.camel.cdi.bean.DefaultCamelContextBean;
+import org.apache.camel.cdi.bean.FirstCamelContextBean;
+import org.apache.camel.cdi.bean.SecondCamelContextBean;
+import org.jboss.arquillian.container.test.api.Deployment;
+import org.jboss.arquillian.junit.Arquillian;
+import org.jboss.arquillian.junit.InSequence;
+import org.jboss.shrinkwrap.api.Archive;
+import org.jboss.shrinkwrap.api.ShrinkWrap;
+import org.jboss.shrinkwrap.api.asset.EmptyAsset;
+import org.jboss.shrinkwrap.api.spec.JavaArchive;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import static org.hamcrest.Matchers.equalTo;
+import static org.hamcrest.Matchers.is;
+import static org.junit.Assert.assertThat;
+
+@RunWith(Arquillian.class)
+public class MultiContextConsumerTemplateTest {
+
+    @Inject
+    private CamelContext defaultCamelContext;
+
+    @Inject
+    private ConsumerTemplate defaultConsumer;
+
+    @Inject
+    private ProducerTemplate defaultProducer;
+
+    @Inject @ContextName("first")
+    private CamelContext firstCamelContext;
+
+    @Inject @ContextName("first")
+    private ConsumerTemplate firstConsumer;
+
+    @Inject @ContextName("first")
+    private ProducerTemplate firstProducer;
+
+    @Inject @ContextName("second")
+    private CamelContext secondCamelContext;
+
+    @Inject @ContextName("second")
+    private ConsumerTemplate secondConsumer;
+
+    @Inject @ContextName("second")
+    private ProducerTemplate secondProducer;
+
+    @Deployment
+    public static Archive<?> deployment() {
+        return ShrinkWrap.create(JavaArchive.class)
+            // Camel CDI
+            .addPackage(CdiCamelExtension.class.getPackage())
+            // Test classes
+            .addClasses(
+                DefaultCamelContextBean.class,
+                FirstCamelContextBean.class,
+                SecondCamelContextBean.class)
+            // Bean archive deployment descriptor
+            .addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml");
+    }
+
+    @Test
+    @InSequence(1)
+    public void configureCamelContexts() throws Exception {
+        secondCamelContext.startAllRoutes();
+    }
+
+    @Test
+    @InSequence(2)
+    public void receiveBodyFromDefaultCamelContext() {
+        defaultProducer.sendBody("seda:foo", "foo");
+
+        String body = defaultConsumer.receiveBody("seda:foo", TimeUnit.SECONDS.toMillis(1L), String.class);
+
+        assertThat("Body is incorrect!", body, is(equalTo("foo")));
+    }
+
+    @Test
+    @InSequence(3)
+    public void receiveBodyFromFirstCamelContext() {
+        firstProducer.sendBody("seda:bar", "bar");
+
+        String body = firstConsumer.receiveBody("seda:bar", TimeUnit.SECONDS.toMillis(1L), String.class);
+
+        assertThat("Body is incorrect!", body, is(equalTo("bar")));
+    }
+
+    @Test
+    @InSequence(4)
+    public void receiveBodyFromSecondCamelContext() {
+        secondProducer.sendBody("seda:baz", "baz");
+
+        String body = secondConsumer.receiveBody("seda:baz", TimeUnit.SECONDS.toMillis(1L), String.class);
+
+        assertThat("Body is incorrect!", body, is(equalTo("baz")));
+    }
+}