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/08/06 14:25:06 UTC

[camel] branch master updated (68f6c1a -> dac1392)

This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/camel.git.


    from 68f6c1a  Upgrade Hazelcast to version 3.12.2
     new 8ae074c  CAMEL-10910: A route with a single output should also use a pipeline so its the same behaviour as if the route has 2+ outputs.
     new d44fbda  CAMEL-13828: DefaultExchangeHolder - Do not propgate exchange id
     new 08f046c  Revert "CAMEL-13828: DefaultExchangeHolder - Do not propgate exchange id"
     new dac1392  CAMEL-13828: DefaultExchangeHolder - Do not propgate exchange id for camel-jms with transferExchange as its across JVMs etc.

The 4 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../cxf/jaxrs/CxfRsSpringConsumerTest.java         |   2 +-
 .../org/apache/camel/component/jms/JmsBinding.java |   2 +-
 .../camel/impl/engine/DefaultRouteContext.java     |   4 +-
 .../impl/cloud/ServiceCallConfigurationTest.java   |   6 ++
 .../test/java/org/apache/camel/TestSupport.java    |   4 +
 .../camel/language/XPathOutFunctionTest.java       | 114 ---------------------
 .../RandomLoadBalanceJavaDSLBuilderTest.java       |   4 +
 .../camel/processor/SagaPropagationTest.java       |   4 +-
 ...onTest.java => SimpleSingleOutputMockTest.java} |  16 ++-
 .../camel/support/DefaultExchangeHolder.java       |  46 ++++-----
 10 files changed, 53 insertions(+), 149 deletions(-)
 delete mode 100644 core/camel-core/src/test/java/org/apache/camel/language/XPathOutFunctionTest.java
 copy core/camel-core/src/test/java/org/apache/camel/processor/{TracerConfigurationTest.java => SimpleSingleOutputMockTest.java} (76%)


[camel] 03/04: Revert "CAMEL-13828: DefaultExchangeHolder - Do not propgate exchange id"

Posted by da...@apache.org.
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 08f046cf4d5e05e22a5cdf95028f28ffc4c2e2ff
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Tue Aug 6 16:14:55 2019 +0200

    Revert "CAMEL-13828: DefaultExchangeHolder - Do not propgate exchange id"
    
    This reverts commit d44fbda5
---
 .../test/java/org/apache/camel/impl/DefaultExchangeHolderTest.java   | 5 +++++
 .../main/java/org/apache/camel/support/DefaultExchangeHolder.java    | 3 +++
 2 files changed, 8 insertions(+)

diff --git a/core/camel-core/src/test/java/org/apache/camel/impl/DefaultExchangeHolderTest.java b/core/camel-core/src/test/java/org/apache/camel/impl/DefaultExchangeHolderTest.java
index 2b99d77..e7524e1 100644
--- a/core/camel-core/src/test/java/org/apache/camel/impl/DefaultExchangeHolderTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/impl/DefaultExchangeHolderTest.java
@@ -31,6 +31,8 @@ import org.junit.Test;
 
 public class DefaultExchangeHolderTest extends ContextTestSupport {
 
+    private String id;
+
     @Test
     public void testMarshal() throws Exception {
         DefaultExchangeHolder holder = createHolder(true);
@@ -54,6 +56,7 @@ public class DefaultExchangeHolderTest extends ContextTestSupport {
 
     @Test
     public void testUnmarshal() throws Exception {
+        id = null;
         Exchange exchange = new DefaultExchange(context);
 
         DefaultExchangeHolder.unmarshal(exchange, createHolder(true));
@@ -63,6 +66,7 @@ public class DefaultExchangeHolderTest extends ContextTestSupport {
         assertEquals("Hi Camel", exchange.getIn().getHeader("CamelFoo"));
         assertEquals(444, exchange.getProperty("bar"));
         assertEquals(555, exchange.getProperty("CamelBar"));
+        assertEquals(id, exchange.getExchangeId());
     }
 
     @Test
@@ -170,6 +174,7 @@ public class DefaultExchangeHolderTest extends ContextTestSupport {
 
     private DefaultExchangeHolder createHolder(boolean includeProperties) {
         Exchange exchange = new DefaultExchange(context);
+        id = exchange.getExchangeId();
         exchange.getIn().setBody("Hello World");
         exchange.getIn().setHeader("foo", 123);
         exchange.getIn().setHeader("CamelFoo", "Hi Camel");
diff --git a/core/camel-support/src/main/java/org/apache/camel/support/DefaultExchangeHolder.java b/core/camel-support/src/main/java/org/apache/camel/support/DefaultExchangeHolder.java
index f8300de..ad37459 100644
--- a/core/camel-support/src/main/java/org/apache/camel/support/DefaultExchangeHolder.java
+++ b/core/camel-support/src/main/java/org/apache/camel/support/DefaultExchangeHolder.java
@@ -103,6 +103,7 @@ public class DefaultExchangeHolder implements Serializable {
 
         DefaultExchangeHolder payload = new DefaultExchangeHolder();
 
+        payload.exchangeId = exchange.getExchangeId();
         payload.inBody = checkSerializableBody("in body", exchange, exchange.getIn().getBody());
         payload.safeSetInHeaders(exchange, false);
         if (exchange.hasOut()) {
@@ -136,6 +137,7 @@ public class DefaultExchangeHolder implements Serializable {
 
         DefaultExchangeHolder payload = new DefaultExchangeHolder();
 
+        payload.exchangeId = exchange.getExchangeId();
         payload.inBody = checkSerializableBody("in body", exchange, exchange.getIn().getBody());
         payload.safeSetInHeaders(exchange, allowSerializedHeaders);
         if (exchange.hasOut()) {
@@ -160,6 +162,7 @@ public class DefaultExchangeHolder implements Serializable {
         ObjectHelper.notNull(exchange, "exchange");
         ObjectHelper.notNull(payload, "payload");
 
+        exchange.setExchangeId(payload.exchangeId);
         exchange.getIn().setBody(payload.inBody);
         if (payload.inHeaders != null) {
             exchange.getIn().setHeaders(payload.inHeaders);


[camel] 02/04: CAMEL-13828: DefaultExchangeHolder - Do not propgate exchange id

Posted by da...@apache.org.
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 d44fbda5edc887deb64288f27aa5354c001441ef
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Tue Aug 6 14:47:03 2019 +0200

    CAMEL-13828: DefaultExchangeHolder - Do not propgate exchange id
---
 .../JmsInOutTransferExchangeInflightRepositoryFlushTest.java | 12 ++++++++----
 .../org/apache/camel/impl/DefaultExchangeHolderTest.java     |  5 -----
 .../java/org/apache/camel/support/DefaultExchangeHolder.java |  3 ---
 3 files changed, 8 insertions(+), 12 deletions(-)

diff --git a/components/camel-jms/src/test/java/org/apache/camel/component/jms/issues/JmsInOutTransferExchangeInflightRepositoryFlushTest.java b/components/camel-jms/src/test/java/org/apache/camel/component/jms/issues/JmsInOutTransferExchangeInflightRepositoryFlushTest.java
index 2b59fb8..0c83e9a 100644
--- a/components/camel-jms/src/test/java/org/apache/camel/component/jms/issues/JmsInOutTransferExchangeInflightRepositoryFlushTest.java
+++ b/components/camel-jms/src/test/java/org/apache/camel/component/jms/issues/JmsInOutTransferExchangeInflightRepositoryFlushTest.java
@@ -65,17 +65,21 @@ public class JmsInOutTransferExchangeInflightRepositoryFlushTest extends CamelTe
         return new RouteBuilder() {
             public void configure() {
                 from("direct:start")
-                        .inOut("activemq:responseGenerator?transferExchange=true&requestTimeout=5000")
-                        .to("mock:result");
+                        .log("A ${exchangeId}")
+                        .inOut("activemq:responseGenerator?transferExchange=true&requestTimeout=20000")
+                        .log("A ${exchangeId}")
+                        .to("log:result", "mock:result");
 
                 from("activemq:responseGenerator?transferExchange=true")
+                        .log("B ${exchangeId}")
                         .process(new Processor() {
                             public void process(Exchange exchange) throws Exception {
                                 // there are 2 inflight (one for both routes)
                                 assertEquals(2, exchange.getContext().getInflightRepository().size());
-                                exchange.getIn().setBody(new SerializableResponseDto(true));
+                                exchange.getMessage().setBody(new SerializableResponseDto(true));
                             }
-                        });
+                        }).to("log:reply")
+                        .log("B ${exchangeId}");
             }
         };
     }
diff --git a/core/camel-core/src/test/java/org/apache/camel/impl/DefaultExchangeHolderTest.java b/core/camel-core/src/test/java/org/apache/camel/impl/DefaultExchangeHolderTest.java
index e7524e1..2b99d77 100644
--- a/core/camel-core/src/test/java/org/apache/camel/impl/DefaultExchangeHolderTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/impl/DefaultExchangeHolderTest.java
@@ -31,8 +31,6 @@ import org.junit.Test;
 
 public class DefaultExchangeHolderTest extends ContextTestSupport {
 
-    private String id;
-
     @Test
     public void testMarshal() throws Exception {
         DefaultExchangeHolder holder = createHolder(true);
@@ -56,7 +54,6 @@ public class DefaultExchangeHolderTest extends ContextTestSupport {
 
     @Test
     public void testUnmarshal() throws Exception {
-        id = null;
         Exchange exchange = new DefaultExchange(context);
 
         DefaultExchangeHolder.unmarshal(exchange, createHolder(true));
@@ -66,7 +63,6 @@ public class DefaultExchangeHolderTest extends ContextTestSupport {
         assertEquals("Hi Camel", exchange.getIn().getHeader("CamelFoo"));
         assertEquals(444, exchange.getProperty("bar"));
         assertEquals(555, exchange.getProperty("CamelBar"));
-        assertEquals(id, exchange.getExchangeId());
     }
 
     @Test
@@ -174,7 +170,6 @@ public class DefaultExchangeHolderTest extends ContextTestSupport {
 
     private DefaultExchangeHolder createHolder(boolean includeProperties) {
         Exchange exchange = new DefaultExchange(context);
-        id = exchange.getExchangeId();
         exchange.getIn().setBody("Hello World");
         exchange.getIn().setHeader("foo", 123);
         exchange.getIn().setHeader("CamelFoo", "Hi Camel");
diff --git a/core/camel-support/src/main/java/org/apache/camel/support/DefaultExchangeHolder.java b/core/camel-support/src/main/java/org/apache/camel/support/DefaultExchangeHolder.java
index ad37459..f8300de 100644
--- a/core/camel-support/src/main/java/org/apache/camel/support/DefaultExchangeHolder.java
+++ b/core/camel-support/src/main/java/org/apache/camel/support/DefaultExchangeHolder.java
@@ -103,7 +103,6 @@ public class DefaultExchangeHolder implements Serializable {
 
         DefaultExchangeHolder payload = new DefaultExchangeHolder();
 
-        payload.exchangeId = exchange.getExchangeId();
         payload.inBody = checkSerializableBody("in body", exchange, exchange.getIn().getBody());
         payload.safeSetInHeaders(exchange, false);
         if (exchange.hasOut()) {
@@ -137,7 +136,6 @@ public class DefaultExchangeHolder implements Serializable {
 
         DefaultExchangeHolder payload = new DefaultExchangeHolder();
 
-        payload.exchangeId = exchange.getExchangeId();
         payload.inBody = checkSerializableBody("in body", exchange, exchange.getIn().getBody());
         payload.safeSetInHeaders(exchange, allowSerializedHeaders);
         if (exchange.hasOut()) {
@@ -162,7 +160,6 @@ public class DefaultExchangeHolder implements Serializable {
         ObjectHelper.notNull(exchange, "exchange");
         ObjectHelper.notNull(payload, "payload");
 
-        exchange.setExchangeId(payload.exchangeId);
         exchange.getIn().setBody(payload.inBody);
         if (payload.inHeaders != null) {
             exchange.getIn().setHeaders(payload.inHeaders);


[camel] 04/04: CAMEL-13828: DefaultExchangeHolder - Do not propgate exchange id for camel-jms with transferExchange as its across JVMs etc.

Posted by da...@apache.org.
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 dac13922d47b0e07de1cec50ebfe569f096f3948
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Tue Aug 6 16:23:24 2019 +0200

    CAMEL-13828: DefaultExchangeHolder - Do not propgate exchange id for camel-jms with transferExchange as its across JVMs etc.
---
 .../org/apache/camel/component/jms/JmsBinding.java |  2 +-
 ...ransferExchangeInflightRepositoryFlushTest.java | 12 ++----
 .../camel/support/DefaultExchangeHolder.java       | 46 ++++++++++------------
 3 files changed, 26 insertions(+), 34 deletions(-)

diff --git a/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsBinding.java b/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsBinding.java
index fcfacd6..7f02f0a 100644
--- a/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsBinding.java
+++ b/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsBinding.java
@@ -519,7 +519,7 @@ public class JmsBinding {
         // special for transferExchange
         if (endpoint != null && endpoint.isTransferExchange()) {
             LOG.trace("Option transferExchange=true so we use JmsMessageType: Object");
-            Serializable holder = DefaultExchangeHolder.marshal(exchange, true, endpoint.isAllowSerializedHeaders());
+            Serializable holder = DefaultExchangeHolder.marshal(exchange, true, endpoint.isAllowSerializedHeaders(), false);
             Message answer = session.createObjectMessage(holder);
             // ensure default delivery mode is used by default
             answer.setJMSDeliveryMode(Message.DEFAULT_DELIVERY_MODE);
diff --git a/components/camel-jms/src/test/java/org/apache/camel/component/jms/issues/JmsInOutTransferExchangeInflightRepositoryFlushTest.java b/components/camel-jms/src/test/java/org/apache/camel/component/jms/issues/JmsInOutTransferExchangeInflightRepositoryFlushTest.java
index 0c83e9a..2b59fb8 100644
--- a/components/camel-jms/src/test/java/org/apache/camel/component/jms/issues/JmsInOutTransferExchangeInflightRepositoryFlushTest.java
+++ b/components/camel-jms/src/test/java/org/apache/camel/component/jms/issues/JmsInOutTransferExchangeInflightRepositoryFlushTest.java
@@ -65,21 +65,17 @@ public class JmsInOutTransferExchangeInflightRepositoryFlushTest extends CamelTe
         return new RouteBuilder() {
             public void configure() {
                 from("direct:start")
-                        .log("A ${exchangeId}")
-                        .inOut("activemq:responseGenerator?transferExchange=true&requestTimeout=20000")
-                        .log("A ${exchangeId}")
-                        .to("log:result", "mock:result");
+                        .inOut("activemq:responseGenerator?transferExchange=true&requestTimeout=5000")
+                        .to("mock:result");
 
                 from("activemq:responseGenerator?transferExchange=true")
-                        .log("B ${exchangeId}")
                         .process(new Processor() {
                             public void process(Exchange exchange) throws Exception {
                                 // there are 2 inflight (one for both routes)
                                 assertEquals(2, exchange.getContext().getInflightRepository().size());
-                                exchange.getMessage().setBody(new SerializableResponseDto(true));
+                                exchange.getIn().setBody(new SerializableResponseDto(true));
                             }
-                        }).to("log:reply")
-                        .log("B ${exchangeId}");
+                        });
             }
         };
     }
diff --git a/core/camel-support/src/main/java/org/apache/camel/support/DefaultExchangeHolder.java b/core/camel-support/src/main/java/org/apache/camel/support/DefaultExchangeHolder.java
index ad37459..5ed075c 100644
--- a/core/camel-support/src/main/java/org/apache/camel/support/DefaultExchangeHolder.java
+++ b/core/camel-support/src/main/java/org/apache/camel/support/DefaultExchangeHolder.java
@@ -93,29 +93,7 @@ public class DefaultExchangeHolder implements Serializable {
      * @return the holder object with information copied form the exchange
      */
     public static DefaultExchangeHolder marshal(Exchange exchange, boolean includeProperties) {
-        ObjectHelper.notNull(exchange, "exchange");
-
-        // we do not support files
-        Object body = exchange.getIn().getBody();
-        if (body instanceof WrappedFile || body instanceof File) {
-            throw new RuntimeExchangeException("Message body of type " + body.getClass().getCanonicalName() + " is not supported by this marshaller.", exchange);
-        }
-
-        DefaultExchangeHolder payload = new DefaultExchangeHolder();
-
-        payload.exchangeId = exchange.getExchangeId();
-        payload.inBody = checkSerializableBody("in body", exchange, exchange.getIn().getBody());
-        payload.safeSetInHeaders(exchange, false);
-        if (exchange.hasOut()) {
-            payload.outBody = checkSerializableBody("out body", exchange, exchange.getOut().getBody());
-            payload.safeSetOutHeaders(exchange, false);
-        }
-        if (includeProperties) {
-            payload.safeSetProperties(exchange, false);
-        }
-        payload.exception = exchange.getException();
-
-        return payload;
+        return marshal(exchange, includeProperties, false, true);
     }
     
     /**
@@ -127,6 +105,20 @@ public class DefaultExchangeHolder implements Serializable {
      * @return the holder object with information copied form the exchange
      */
     public static DefaultExchangeHolder marshal(Exchange exchange, boolean includeProperties, boolean allowSerializedHeaders) {
+        return marshal(exchange, includeProperties, allowSerializedHeaders, true);
+    }
+
+    /**
+     * Creates a payload object with the information from the given exchange.
+     *
+     * @param exchange the exchange, must <b>not</b> be <tt>null</tt>
+     * @param includeProperties whether or not to include exchange properties
+     * @param allowSerializedHeaders whether or not to include serialized headers
+     * @param preserveExchangeId whether to preserve exchange id
+     * @return the holder object with information copied form the exchange
+     */
+    public static DefaultExchangeHolder marshal(Exchange exchange, boolean includeProperties,
+                                                boolean allowSerializedHeaders, boolean preserveExchangeId) {
         ObjectHelper.notNull(exchange, "exchange");
 
         // we do not support files
@@ -137,7 +129,9 @@ public class DefaultExchangeHolder implements Serializable {
 
         DefaultExchangeHolder payload = new DefaultExchangeHolder();
 
-        payload.exchangeId = exchange.getExchangeId();
+        if (preserveExchangeId) {
+            payload.exchangeId = exchange.getExchangeId();
+        }
         payload.inBody = checkSerializableBody("in body", exchange, exchange.getIn().getBody());
         payload.safeSetInHeaders(exchange, allowSerializedHeaders);
         if (exchange.hasOut()) {
@@ -162,7 +156,9 @@ public class DefaultExchangeHolder implements Serializable {
         ObjectHelper.notNull(exchange, "exchange");
         ObjectHelper.notNull(payload, "payload");
 
-        exchange.setExchangeId(payload.exchangeId);
+        if (payload.exchangeId != null) {
+            exchange.setExchangeId(payload.exchangeId);
+        }
         exchange.getIn().setBody(payload.inBody);
         if (payload.inHeaders != null) {
             exchange.getIn().setHeaders(payload.inHeaders);


[camel] 01/04: CAMEL-10910: A route with a single output should also use a pipeline so its the same behaviour as if the route has 2+ outputs.

Posted by da...@apache.org.
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 8ae074c51f2ce43141a9fc5fe40ca7bd88e24426
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Tue Aug 6 13:12:28 2019 +0200

    CAMEL-10910: A route with a single output should also use a pipeline so its the same behaviour as if the route has 2+ outputs.
---
 .../cxf/jaxrs/CxfRsSpringConsumerTest.java         |   2 +-
 .../camel/impl/engine/DefaultRouteContext.java     |   4 +-
 .../impl/cloud/ServiceCallConfigurationTest.java   |   6 ++
 .../test/java/org/apache/camel/TestSupport.java    |   4 +
 .../camel/language/XPathOutFunctionTest.java       | 114 ---------------------
 .../RandomLoadBalanceJavaDSLBuilderTest.java       |   4 +
 .../camel/processor/SagaPropagationTest.java       |   4 +-
 .../processor/SimpleSingleOutputMockTest.java      |  51 +++++++++
 8 files changed, 71 insertions(+), 118 deletions(-)

diff --git a/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/jaxrs/CxfRsSpringConsumerTest.java b/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/jaxrs/CxfRsSpringConsumerTest.java
index b52b221..9748268 100644
--- a/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/jaxrs/CxfRsSpringConsumerTest.java
+++ b/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/jaxrs/CxfRsSpringConsumerTest.java
@@ -49,7 +49,7 @@ public class CxfRsSpringConsumerTest extends CamelSpringTestSupport {
             public void process(Exchange exchange) throws Exception {
                 // do something else with the request properties as usual
                 // do something else with the response
-                exchange.getOut().getBody(Customer.class).setId(246);
+                exchange.getMessage().getBody(Customer.class).setId(246);
             }  
         };
         return new RouteBuilder() {
diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultRouteContext.java b/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultRouteContext.java
index be269db..282fbd5 100644
--- a/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultRouteContext.java
+++ b/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultRouteContext.java
@@ -171,7 +171,9 @@ public class DefaultRouteContext implements RouteContext {
     public Route commit() {
         // now lets turn all of the event driven consumer processors into a single route
         if (!eventDrivenProcessors.isEmpty()) {
-            Processor target = Pipeline.newInstance(getCamelContext(), eventDrivenProcessors);
+            // always use an pipeline even if there are only 1 processor as the pipeline
+            // handles preparing the response from the exchange in regard to IN vs OUT messages etc
+            Processor target = new Pipeline(getCamelContext(), eventDrivenProcessors);
 
             // and wrap it in a unit of work so the UoW is on the top, so the entire route will be in the same UoW
             CamelInternalProcessor internal = new CamelInternalProcessor(target);
diff --git a/core/camel-cloud/src/test/java/org/apache/camel/impl/cloud/ServiceCallConfigurationTest.java b/core/camel-cloud/src/test/java/org/apache/camel/impl/cloud/ServiceCallConfigurationTest.java
index ecd8832..8644bb9 100644
--- a/core/camel-cloud/src/test/java/org/apache/camel/impl/cloud/ServiceCallConfigurationTest.java
+++ b/core/camel-cloud/src/test/java/org/apache/camel/impl/cloud/ServiceCallConfigurationTest.java
@@ -30,6 +30,8 @@ import org.apache.camel.model.cloud.ServiceCallConfigurationDefinition;
 import org.apache.camel.model.cloud.ServiceCallDefinitionConstants;
 import org.apache.camel.model.cloud.ServiceCallExpressionConfiguration;
 import org.apache.camel.model.language.SimpleExpression;
+import org.apache.camel.processor.Pipeline;
+import org.apache.camel.processor.channel.DefaultChannel;
 import org.junit.Assert;
 import org.junit.Test;
 
@@ -441,7 +443,11 @@ public class ServiceCallConfigurationTest {
     // **********************************************
 
     private DefaultServiceCallProcessor findServiceCallProcessor(Route route) {
+
         for (Processor processor : route.navigate().next()) {
+            if (processor instanceof DefaultChannel) {
+                processor = ((DefaultChannel) processor).getNextProcessor();
+            }
             if (processor instanceof DefaultServiceCallProcessor) {
                 return (DefaultServiceCallProcessor)processor;
             }
diff --git a/core/camel-core/src/test/java/org/apache/camel/TestSupport.java b/core/camel-core/src/test/java/org/apache/camel/TestSupport.java
index 2ec15e3..d2dd5b4 100644
--- a/core/camel-core/src/test/java/org/apache/camel/TestSupport.java
+++ b/core/camel-core/src/test/java/org/apache/camel/TestSupport.java
@@ -25,6 +25,7 @@ import org.apache.camel.builder.Builder;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.builder.ValueBuilder;
 import org.apache.camel.impl.DefaultCamelContext;
+import org.apache.camel.processor.Pipeline;
 import org.apache.camel.processor.errorhandler.ErrorHandlerSupport;
 import org.apache.camel.support.DefaultExchange;
 import org.apache.camel.support.PredicateAssertHelper;
@@ -378,6 +379,9 @@ public abstract class TestSupport extends Assert {
      */
     public static Channel unwrapChannel(Processor processor) {
         while (true) {
+            if (processor instanceof Pipeline) {
+                processor = ((Pipeline) processor).getProcessors().get(0);
+            }
             if (processor instanceof Channel) {
                 return (Channel) processor;
             } else if (processor instanceof DelegateProcessor) {
diff --git a/core/camel-core/src/test/java/org/apache/camel/language/XPathOutFunctionTest.java b/core/camel-core/src/test/java/org/apache/camel/language/XPathOutFunctionTest.java
deleted file mode 100644
index 35b4692..0000000
--- a/core/camel-core/src/test/java/org/apache/camel/language/XPathOutFunctionTest.java
+++ /dev/null
@@ -1,114 +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.language;
-import org.w3c.dom.NodeList;
-
-import org.apache.camel.ContextTestSupport;
-import org.apache.camel.Exchange;
-import org.apache.camel.Processor;
-import org.apache.camel.builder.RouteBuilder;
-import org.apache.camel.component.mock.MockEndpoint;
-import org.junit.Before;
-import org.junit.Test;
-
-import static org.apache.camel.component.mock.MockEndpoint.expectsMessageCount;
-
-public class XPathOutFunctionTest extends ContextTestSupport {
-
-    protected MockEndpoint x;
-    protected MockEndpoint y;
-    protected MockEndpoint z;
-    protected MockEndpoint end;
-
-    @Test
-    public void testCheckHeader() throws Exception {
-        String body = "<one/>";
-        x.expectedBodiesReceived(body);
-        expectsMessageCount(0, y, z);
-
-        sendMessage("bar", body);
-
-        assertMockEndpointsSatisfied();
-    }
-
-    @Test
-    public void testCheckBody() throws Exception {
-        String body = "<two/>";
-        y.expectedBodiesReceived(body);
-        expectsMessageCount(0, x, z);
-
-        sendMessage("cheese", body);
-
-        assertMockEndpointsSatisfied();
-    }
-
-    @Test
-    public void testSetXpathProperty() throws Exception {
-        String body = "<soapenv:Body xmlns:ns=\"http://myNamesapce\" xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\">"
-            + "<ns:Addresses> <Address>address1</Address>"
-            + " <Address>address2</Address> <Address>address3</Address>"
-            + " <Address>address4</Address> </ns:Addresses> </soapenv:Body>";
-        end.reset();
-        end.expectedMessageCount(1);
-        template.sendBody("direct:setProperty", body);
-        assertMockEndpointsSatisfied();
-        Exchange exchange = end.getExchanges().get(0);
-        NodeList nodeList = exchange.getProperty("Addresses", NodeList.class);
-        assertNotNull("The node list should not be null", nodeList);
-    }
-
-    protected void sendMessage(final Object headerValue, final Object body) throws Exception {
-        template.send("direct:start", new Processor() {
-            public void process(Exchange exchange) throws Exception {
-                // use OUT to test the OUT namespaces
-                exchange.getOut().setBody(body);
-                exchange.getOut().setHeader("foo", headerValue);
-            }
-        });
-    }
-
-    @Override
-    @Before
-    public void setUp() throws Exception {
-        super.setUp();
-
-        x = getMockEndpoint("mock:x");
-        y = getMockEndpoint("mock:y");
-        z = getMockEndpoint("mock:z");
-        end = getMockEndpoint("mock:end");
-    }
-
-    @Override
-    protected RouteBuilder createRouteBuilder() {
-        return new RouteBuilder() {
-            public void configure() {
-
-                // START SNIPPET: ex
-                from("direct:start").choice()
-                  .when().xpath("out:header('foo') = 'bar'").to("mock:foo").to("mock:x")
-                  .when().xpath("out:body() = '<two/>'").to("mock:foo").to("mock:y")
-                  .otherwise().to("mock:foo").to("mock:z");
-                // END SNIPPET: ex
-
-                from("direct:setProperty")
-                    .setProperty("Addresses").xpath("//Address", NodeList.class)
-                    .to("mock:end");
-            }
-        };
-    }
-
-}
\ No newline at end of file
diff --git a/core/camel-core/src/test/java/org/apache/camel/processor/RandomLoadBalanceJavaDSLBuilderTest.java b/core/camel-core/src/test/java/org/apache/camel/processor/RandomLoadBalanceJavaDSLBuilderTest.java
index c3bd4b1..d0e2426 100644
--- a/core/camel-core/src/test/java/org/apache/camel/processor/RandomLoadBalanceJavaDSLBuilderTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/processor/RandomLoadBalanceJavaDSLBuilderTest.java
@@ -73,6 +73,10 @@ public class RandomLoadBalanceJavaDSLBuilderTest extends RandomLoadBalanceTest {
     }
 
     private void navigateRoute(Navigate<Processor> nav, StringBuilder sb) {
+        if (nav instanceof Pipeline) {
+            nav = (Navigate<Processor>) ((Pipeline) nav).getProcessors().get(0);
+        }
+
         if (!nav.hasNext()) {
             return;
         }
diff --git a/core/camel-core/src/test/java/org/apache/camel/processor/SagaPropagationTest.java b/core/camel-core/src/test/java/org/apache/camel/processor/SagaPropagationTest.java
index 333d987..122fd58 100644
--- a/core/camel-core/src/test/java/org/apache/camel/processor/SagaPropagationTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/processor/SagaPropagationTest.java
@@ -67,7 +67,7 @@ public class SagaPropagationTest extends ContextTestSupport {
         context.createFluentProducerTemplate().to("direct:supports").request();
 
         assertListSize(sagaIds, 2);
-        assertNonNullSagaIds(1);
+        assertNonNullSagaIds(2);
     }
 
     @Test
@@ -184,7 +184,7 @@ public class SagaPropagationTest extends ContextTestSupport {
     }
 
     private Processor addSagaIdToList() {
-        return ex -> sagaIds.add(ex.getIn().getHeader(Exchange.SAGA_LONG_RUNNING_ACTION, String.class));
+        return ex -> sagaIds.add(ex.getMessage().getHeader(Exchange.SAGA_LONG_RUNNING_ACTION, String.class));
     }
 
     private void assertUniqueNonNullSagaIds(int num) {
diff --git a/core/camel-core/src/test/java/org/apache/camel/processor/SimpleSingleOutputMockTest.java b/core/camel-core/src/test/java/org/apache/camel/processor/SimpleSingleOutputMockTest.java
new file mode 100644
index 0000000..6323e43
--- /dev/null
+++ b/core/camel-core/src/test/java/org/apache/camel/processor/SimpleSingleOutputMockTest.java
@@ -0,0 +1,51 @@
+/*
+ * 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.processor;
+
+import org.apache.camel.ContextTestSupport;
+import org.apache.camel.Exchange;
+import org.apache.camel.ExchangePattern;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.junit.Test;
+
+public class SimpleSingleOutputMockTest extends ContextTestSupport {
+
+    @Test
+    public void testSimple() throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:result");
+        mock.expectedBodiesReceived("Hello World");
+
+        Exchange out = template.request("direct:start", e -> e.getMessage().setBody("Hello World"));
+        assertNotNull(out);
+        assertEquals(ExchangePattern.InOut, out.getPattern());
+        assertTrue(out.hasOut());
+
+        assertMockEndpointsSatisfied();
+    }
+
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("direct:start").to("mock:result");
+            }
+        };
+    }
+}