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 2010/05/27 08:09:18 UTC
svn commit: r948683 - in /camel/trunk:
camel-core/src/main/java/org/apache/camel/model/
camel-core/src/main/java/org/apache/camel/processor/
camel-core/src/test/java/org/apache/camel/processor/
components/camel-spring/src/test/java/org/apache/camel/spr...
Author: davsclaus
Date: Thu May 27 06:09:18 2010
New Revision: 948683
URL: http://svn.apache.org/viewvc?rev=948683&view=rev
Log:
CAMEL-2758: Fixed onCompletion to pass OUT as IN. Added option useOriginalBody to it as well.
Added:
camel/trunk/camel-core/src/test/java/org/apache/camel/processor/OnCompletionAsyncTest.java (contents, props changed)
- copied, changed from r948330, camel/trunk/camel-core/src/test/java/org/apache/camel/processor/OnCompletionGlobalTest.java
camel/trunk/camel-core/src/test/java/org/apache/camel/processor/OnCompletionUseOriginalBodyTest.java (with props)
camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringOnCompletionUseOriginalBodyTest.java
- copied, changed from r948665, camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringOnCompletionGlobalTest.java
camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/SpringOnCompletionUseOriginalBodyTest.xml
- copied, changed from r948665, camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/SpringOnCompletionGlobalTest.xml
Modified:
camel/trunk/camel-core/src/main/java/org/apache/camel/model/OnCompletionDefinition.java
camel/trunk/camel-core/src/main/java/org/apache/camel/processor/OnCompletionProcessor.java
Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/model/OnCompletionDefinition.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/model/OnCompletionDefinition.java?rev=948683&r1=948682&r2=948683&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/model/OnCompletionDefinition.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/model/OnCompletionDefinition.java Thu May 27 06:09:18 2010
@@ -57,6 +57,8 @@ public class OnCompletionDefinition exte
private ExecutorService executorService;
@XmlAttribute(required = false)
private String executorServiceRef;
+ @XmlAttribute(name = "useOriginalMessage", required = false)
+ private Boolean useOriginalMessagePolicy = Boolean.FALSE;
public OnCompletionDefinition() {
}
@@ -101,8 +103,8 @@ public class OnCompletionDefinition exte
if (executorService == null) {
executorService = routeContext.getCamelContext().getExecutorServiceStrategy().newDefaultThreadPool(this, "OnCompletion");
}
- OnCompletionProcessor answer = new OnCompletionProcessor(routeContext.getCamelContext(), childProcessor, executorService,
- onCompleteOnly, onFailureOnly, when);
+ OnCompletionProcessor answer = new OnCompletionProcessor(routeContext.getCamelContext(), childProcessor,
+ executorService, onCompleteOnly, onFailureOnly, when, useOriginalMessagePolicy);
return answer;
}
@@ -185,7 +187,19 @@ public class OnCompletionDefinition exte
onWhen.setExpression(clause);
return clause;
}
-
+
+ /**
+ * Will use the original input body when an {@link org.apache.camel.Exchange} for this on completion.
+ * <p/>
+ * By default this feature is off.
+ *
+ * @return the builder
+ */
+ public OnCompletionDefinition useOriginalBody() {
+ setUseOriginalMessagePolicy(Boolean.TRUE);
+ return this;
+ }
+
public OnCompletionDefinition executorService(ExecutorService executorService) {
setExecutorService(executorService);
return this;
@@ -243,4 +257,13 @@ public class OnCompletionDefinition exte
public void setExecutorServiceRef(String executorServiceRef) {
this.executorServiceRef = executorServiceRef;
}
+
+ public Boolean getUseOriginalMessagePolicy() {
+ return useOriginalMessagePolicy;
+ }
+
+ public void setUseOriginalMessagePolicy(Boolean useOriginalMessagePolicy) {
+ this.useOriginalMessagePolicy = useOriginalMessagePolicy;
+ }
+
}
Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/processor/OnCompletionProcessor.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/OnCompletionProcessor.java?rev=948683&r1=948682&r2=948683&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/processor/OnCompletionProcessor.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/processor/OnCompletionProcessor.java Thu May 27 06:09:18 2010
@@ -22,6 +22,7 @@ import java.util.concurrent.ExecutorServ
import org.apache.camel.CamelContext;
import org.apache.camel.Exchange;
import org.apache.camel.ExchangePattern;
+import org.apache.camel.Message;
import org.apache.camel.Predicate;
import org.apache.camel.Processor;
import org.apache.camel.impl.ServiceSupport;
@@ -42,15 +43,15 @@ public class OnCompletionProcessor exten
private final CamelContext camelContext;
private final Processor processor;
private final ExecutorService executorService;
- private boolean onCompleteOnly;
- private boolean onFailureOnly;
- private Predicate onWhen;
+ private final boolean onCompleteOnly;
+ private final boolean onFailureOnly;
+ private final Predicate onWhen;
+ private final boolean useOriginalBody;
public OnCompletionProcessor(CamelContext camelContext, Processor processor, ExecutorService executorService,
- boolean onCompleteOnly, boolean onFailureOnly, Predicate onWhen) {
+ boolean onCompleteOnly, boolean onFailureOnly, Predicate onWhen, boolean useOriginalBody) {
notNull(camelContext, "camelContext");
notNull(processor, "processor");
- notNull(executorService, "executorService");
this.camelContext = camelContext;
// wrap processor in UnitOfWork so what we send out runs in a UoW
this.processor = new UnitOfWorkProcessor(processor);
@@ -58,6 +59,7 @@ public class OnCompletionProcessor exten
this.onCompleteOnly = onCompleteOnly;
this.onFailureOnly = onFailureOnly;
this.onWhen = onWhen;
+ this.useOriginalBody = useOriginalBody;
}
protected void doStart() throws Exception {
@@ -81,7 +83,7 @@ public class OnCompletionProcessor exten
// register callback
exchange.getUnitOfWork().addSynchronization(new SynchronizationAdapter() {
@Override
- public void onComplete(Exchange exchange) {
+ public void onComplete(final Exchange exchange) {
if (onFailureOnly) {
return;
}
@@ -105,7 +107,7 @@ public class OnCompletionProcessor exten
});
}
- public void onFailure(Exchange exchange) {
+ public void onFailure(final Exchange exchange) {
if (onCompleteOnly) {
return;
}
@@ -127,7 +129,7 @@ public class OnCompletionProcessor exten
LOG.debug("Processing onFailure: " + copy);
}
doProcess(processor, copy);
- return copy;
+ return null;
}
});
}
@@ -159,7 +161,6 @@ public class OnCompletionProcessor exten
}
}
-
/**
* Prepares the {@link Exchange} to send as onCompletion.
*
@@ -167,13 +168,33 @@ public class OnCompletionProcessor exten
* @return the exchange to be routed in onComplete
*/
protected Exchange prepareExchange(Exchange exchange) {
- // must use a copy as we dont want it to cause side effects of the original exchange
- final Exchange copy = ExchangeHelper.createCorrelatedCopy(exchange, false);
+ Exchange answer;
+
+ // for asynchronous routing we must use a copy as we dont want it
+ // to cause side effects of the original exchange
+ // (the original thread will run in parallel)
+ answer = ExchangeHelper.createCorrelatedCopy(exchange, false);
+ if (answer.hasOut()) {
+ // move OUT to IN (pipes and filters)
+ answer.setIn(answer.getOut());
+ answer.setOut(null);
+ }
// set MEP to InOnly as this wire tap is a fire and forget
- copy.setPattern(ExchangePattern.InOnly);
+ answer.setPattern(ExchangePattern.InOnly);
+
+ if (useOriginalBody) {
+ if (LOG.isTraceEnabled()) {
+ LOG.trace("Using the original IN message instead of current");
+ }
+
+ Message original = exchange.getUnitOfWork().getOriginalInMessage();
+ answer.setIn(original);
+ }
+
// add a header flag to indicate its a on completion exchange
- copy.setProperty(Exchange.ON_COMPLETION, Boolean.TRUE);
- return copy;
+ answer.setProperty(Exchange.ON_COMPLETION, Boolean.TRUE);
+
+ return answer;
}
@Override
Copied: camel/trunk/camel-core/src/test/java/org/apache/camel/processor/OnCompletionAsyncTest.java (from r948330, camel/trunk/camel-core/src/test/java/org/apache/camel/processor/OnCompletionGlobalTest.java)
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/processor/OnCompletionAsyncTest.java?p2=camel/trunk/camel-core/src/test/java/org/apache/camel/processor/OnCompletionAsyncTest.java&p1=camel/trunk/camel-core/src/test/java/org/apache/camel/processor/OnCompletionGlobalTest.java&r1=948330&r2=948683&rev=948683&view=diff
==============================================================================
--- camel/trunk/camel-core/src/test/java/org/apache/camel/processor/OnCompletionGlobalTest.java (original)
+++ camel/trunk/camel-core/src/test/java/org/apache/camel/processor/OnCompletionAsyncTest.java Thu May 27 06:09:18 2010
@@ -23,32 +23,74 @@ import org.apache.camel.Processor;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.component.mock.MockEndpoint;
+import static org.apache.camel.language.simple.SimpleLanguage.simple;
+
/**
* @version $Revision$
*/
-public class OnCompletionGlobalTest extends ContextTestSupport {
+public class OnCompletionAsyncTest extends ContextTestSupport {
- public void testSynchronizeComplete() throws Exception {
- getMockEndpoint("mock:sync").expectedBodiesReceived("Bye World");
- getMockEndpoint("mock:sync").expectedPropertyReceived(Exchange.ON_COMPLETION, true);
+ @Override
+ public boolean isUseRouteBuilder() {
+ return false;
+ }
+
+ public void testAsyncComplete() throws Exception {
+ context.addRoutes(new RouteBuilder() {
+ @Override
+ public void configure() throws Exception {
+ onCompletion()
+ .to("mock:before")
+ .delay(1000)
+ .setBody(simple("OnComplete:${body}"))
+ .to("mock:after");
+
+ from("direct:start")
+ .process(new MyProcessor())
+ .to("mock:result");
+ }
+ });
+ context.start();
+
+ getMockEndpoint("mock:before").expectedBodiesReceived("Bye World");
+ getMockEndpoint("mock:before").expectedPropertyReceived(Exchange.ON_COMPLETION, true);
+ getMockEndpoint("mock:after").expectedBodiesReceived("OnComplete:Bye World");
MockEndpoint mock = getMockEndpoint("mock:result");
mock.expectedBodiesReceived("Bye World");
- template.sendBody("direct:start", "Hello World");
+ String out = template.requestBody("direct:start", "Hello World", String.class);
+ assertEquals("Bye World", out);
assertMockEndpointsSatisfied();
}
- public void testSynchronizeFailure() throws Exception {
- getMockEndpoint("mock:sync").expectedMessageCount(1);
- getMockEndpoint("mock:sync").expectedPropertyReceived(Exchange.ON_COMPLETION, true);
+ public void testAsyncFailure() throws Exception {
+ context.addRoutes(new RouteBuilder() {
+ @Override
+ public void configure() throws Exception {
+ onCompletion()
+ .to("mock:before")
+ .delay(1000)
+ .setBody(simple("OnComplete:${body}"))
+ .to("mock:after");
+
+ from("direct:start")
+ .process(new MyProcessor())
+ .to("mock:result");
+ }
+ });
+ context.start();
+
+ getMockEndpoint("mock:before").expectedBodiesReceived("Kabom");
+ getMockEndpoint("mock:before").expectedPropertyReceived(Exchange.ON_COMPLETION, true);
+ getMockEndpoint("mock:after").expectedBodiesReceived("OnComplete:Kabom");
MockEndpoint mock = getMockEndpoint("mock:result");
mock.expectedMessageCount(0);
try {
- template.sendBody("direct:start", "Kabom");
+ template.requestBody("direct:start", "Kabom");
fail("Should throw exception");
} catch (CamelExecutionException e) {
assertEquals("Kabom", e.getCause().getMessage());
@@ -57,21 +99,101 @@ public class OnCompletionGlobalTest exte
assertMockEndpointsSatisfied();
}
- @Override
- protected RouteBuilder createRouteBuilder() throws Exception {
- return new RouteBuilder() {
+ public void testAsyncCompleteUseOriginalBody() throws Exception {
+ context.addRoutes(new RouteBuilder() {
@Override
public void configure() throws Exception {
- // START SNIPPET: e1
- // define a global on completion that is invoked when the exchange is complete
- onCompletion().to("log:global").to("mock:sync");
+ onCompletion().useOriginalBody()
+ .to("mock:before")
+ .delay(1000)
+ .setBody(simple("OnComplete:${body}"))
+ .to("mock:after");
from("direct:start")
.process(new MyProcessor())
.to("mock:result");
- // END SNIPPET: e1
}
- };
+ });
+ context.start();
+
+ getMockEndpoint("mock:before").expectedBodiesReceived("Hello World");
+ getMockEndpoint("mock:before").expectedPropertyReceived(Exchange.ON_COMPLETION, true);
+ getMockEndpoint("mock:after").expectedBodiesReceived("OnComplete:Hello World");
+
+ MockEndpoint mock = getMockEndpoint("mock:result");
+ mock.expectedBodiesReceived("Bye World");
+
+ String out = template.requestBody("direct:start", "Hello World", String.class);
+ assertEquals("Bye World", out);
+
+ assertMockEndpointsSatisfied();
+ }
+
+ public void testAsyncFailureUseOriginalBody() throws Exception {
+ context.addRoutes(new RouteBuilder() {
+ @Override
+ public void configure() throws Exception {
+ onCompletion().useOriginalBody()
+ .to("mock:before")
+ .delay(1000)
+ .setBody(simple("OnComplete:${body}"))
+ .to("mock:after");
+
+ from("direct:start")
+ .transform(body().prepend("Before:${body}"))
+ .process(new MyProcessor())
+ .to("mock:result");
+ }
+ });
+ context.start();
+
+ getMockEndpoint("mock:before").expectedBodiesReceived("Kabom");
+ getMockEndpoint("mock:before").expectedPropertyReceived(Exchange.ON_COMPLETION, true);
+ getMockEndpoint("mock:after").expectedBodiesReceived("OnComplete:Kabom");
+
+ MockEndpoint mock = getMockEndpoint("mock:result");
+ mock.expectedMessageCount(0);
+
+ try {
+ template.requestBody("direct:start", "Kabom");
+ fail("Should throw exception");
+ } catch (CamelExecutionException e) {
+ assertEquals("Kabom", e.getCause().getMessage());
+ }
+
+ assertMockEndpointsSatisfied();
+ }
+
+ public void testAsyncCompleteOnCompleteFail() throws Exception {
+ context.addRoutes(new RouteBuilder() {
+ @Override
+ public void configure() throws Exception {
+ onCompletion()
+ .to("mock:before")
+ .delay(1000)
+ .setBody(simple("OnComplete:${body}"))
+ // this exception does not cause any side effect as we are in async mode
+ .throwException(new IllegalAccessException("From onComplete"))
+ .to("mock:after");
+
+ from("direct:start")
+ .process(new MyProcessor())
+ .to("mock:result");
+ }
+ });
+ context.start();
+
+ getMockEndpoint("mock:before").expectedBodiesReceived("Bye World");
+ getMockEndpoint("mock:before").expectedPropertyReceived(Exchange.ON_COMPLETION, true);
+ getMockEndpoint("mock:after").expectedMessageCount(0);
+
+ MockEndpoint mock = getMockEndpoint("mock:result");
+ mock.expectedBodiesReceived("Bye World");
+
+ String out = template.requestBody("direct:start", "Hello World", String.class);
+ assertEquals("Bye World", out);
+
+ assertMockEndpointsSatisfied();
}
public static class MyProcessor implements Processor {
@@ -80,10 +202,11 @@ public class OnCompletionGlobalTest exte
}
public void process(Exchange exchange) throws Exception {
- if ("Kabom".equals(exchange.getIn().getBody())) {
+ if (exchange.getIn().getBody(String.class).contains("Kabom")) {
throw new IllegalArgumentException("Kabom");
}
exchange.getIn().setBody("Bye World");
}
}
+
}
\ No newline at end of file
Propchange: camel/trunk/camel-core/src/test/java/org/apache/camel/processor/OnCompletionAsyncTest.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: camel/trunk/camel-core/src/test/java/org/apache/camel/processor/OnCompletionAsyncTest.java
------------------------------------------------------------------------------
svn:keywords = Rev Date
Added: camel/trunk/camel-core/src/test/java/org/apache/camel/processor/OnCompletionUseOriginalBodyTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/processor/OnCompletionUseOriginalBodyTest.java?rev=948683&view=auto
==============================================================================
--- camel/trunk/camel-core/src/test/java/org/apache/camel/processor/OnCompletionUseOriginalBodyTest.java (added)
+++ camel/trunk/camel-core/src/test/java/org/apache/camel/processor/OnCompletionUseOriginalBodyTest.java Thu May 27 06:09:18 2010
@@ -0,0 +1,77 @@
+/**
+ * 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.Processor;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.mock.MockEndpoint;
+
+import static org.apache.camel.language.simple.SimpleLanguage.simple;
+
+/**
+ * @version $Revision$
+ */
+public class OnCompletionUseOriginalBodyTest extends ContextTestSupport {
+
+ public void testOnCompletionUseOriginalBody() throws Exception {
+ getMockEndpoint("mock:before").expectedBodiesReceived("Hello World");
+ getMockEndpoint("mock:before").expectedPropertyReceived(Exchange.ON_COMPLETION, true);
+ getMockEndpoint("mock:after").expectedBodiesReceived("OnComplete:Hello World");
+
+ MockEndpoint mock = getMockEndpoint("mock:result");
+ mock.expectedBodiesReceived("Bye World");
+
+ String out = template.requestBody("direct:start", "Hello World", String.class);
+ assertEquals("Bye World", out);
+
+ assertMockEndpointsSatisfied();
+ }
+
+ @Override
+ protected RouteBuilder createRouteBuilder() throws Exception {
+ return new RouteBuilder() {
+ @Override
+ public void configure() throws Exception {
+ onCompletion().useOriginalBody()
+ .to("mock:before")
+ .delay(1000)
+ .setBody(simple("OnComplete:${body}"))
+ .to("mock:after");
+
+ from("direct:start")
+ .process(new MyProcessor())
+ .to("mock:result");
+ }
+ };
+ }
+
+ public static class MyProcessor implements Processor {
+
+ public MyProcessor() {
+ }
+
+ public void process(Exchange exchange) throws Exception {
+ if (exchange.getIn().getBody(String.class).contains("Kabom")) {
+ throw new IllegalArgumentException("Kabom");
+ }
+ exchange.getIn().setBody("Bye World");
+ }
+ }
+
+}
\ No newline at end of file
Propchange: camel/trunk/camel-core/src/test/java/org/apache/camel/processor/OnCompletionUseOriginalBodyTest.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: camel/trunk/camel-core/src/test/java/org/apache/camel/processor/OnCompletionUseOriginalBodyTest.java
------------------------------------------------------------------------------
svn:keywords = Rev Date
Copied: camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringOnCompletionUseOriginalBodyTest.java (from r948665, camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringOnCompletionGlobalTest.java)
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringOnCompletionUseOriginalBodyTest.java?p2=camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringOnCompletionUseOriginalBodyTest.java&p1=camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringOnCompletionGlobalTest.java&r1=948665&r2=948683&rev=948683&view=diff
==============================================================================
--- camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringOnCompletionGlobalTest.java (original)
+++ camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringOnCompletionUseOriginalBodyTest.java Thu May 27 06:09:18 2010
@@ -17,16 +17,17 @@
package org.apache.camel.spring.processor;
import org.apache.camel.CamelContext;
-import org.apache.camel.processor.OnCompletionTest;
+import org.apache.camel.processor.OnCompletionUseOriginalBodyTest;
+
import static org.apache.camel.spring.processor.SpringTestHelper.createSpringCamelContext;
/**
* @version $Revision$
*/
-public class SpringOnCompletionGlobalTest extends OnCompletionTest {
+public class SpringOnCompletionUseOriginalBodyTest extends OnCompletionUseOriginalBodyTest {
protected CamelContext createCamelContext() throws Exception {
- return createSpringCamelContext(this, "org/apache/camel/spring/processor/SpringOnCompletionGlobalTest.xml");
+ return createSpringCamelContext(this, "org/apache/camel/spring/processor/SpringOnCompletionUseOriginalBodyTest.xml");
}
}
\ No newline at end of file
Copied: camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/SpringOnCompletionUseOriginalBodyTest.xml (from r948665, camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/SpringOnCompletionGlobalTest.xml)
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/SpringOnCompletionUseOriginalBodyTest.xml?p2=camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/SpringOnCompletionUseOriginalBodyTest.xml&p1=camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/SpringOnCompletionGlobalTest.xml&r1=948665&r2=948683&rev=948683&view=diff
==============================================================================
--- camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/SpringOnCompletionGlobalTest.xml (original)
+++ camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/SpringOnCompletionUseOriginalBodyTest.xml Thu May 27 06:09:18 2010
@@ -22,15 +22,18 @@
http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd
">
- <bean id="myProcessor" class="org.apache.camel.processor.OnCompletionTest$MyProcessor"/>
+ <bean id="myProcessor" class="org.apache.camel.processor.OnCompletionUseOriginalBodyTest$MyProcessor"/>
<camelContext id="camel" xmlns="http://camel.apache.org/schema/spring">
- <!-- START SNIPPET: e1 -->
- <!-- this is a global onCompletion route that is invoke when any exchange is complete
- as a kind of after callback -->
- <onCompletion>
- <to uri="log:global"/>
- <to uri="mock:sync"/>
+ <onCompletion useOriginalMessage="true">
+ <to uri="mock:before"/>
+ <delay>
+ <constant>1000</constant>
+ </delay>
+ <setBody>
+ <simple>OnComplete:${body}</simple>
+ </setBody>
+ <to uri="mock:after"/>
</onCompletion>
<route>
@@ -38,6 +41,6 @@
<process ref="myProcessor"/>
<to uri="mock:result"/>
</route>
- <!-- END SNIPPET: e1 -->
</camelContext>
+
</beans>