Author: davsclaus Date: Mon Apr 12 12:27:17 2010 New Revision: 933214 URL: http://svn.apache.org/viewvc?rev=933214&view=rev Log: CAMEL-2623: seda/vm now works better in async request/reply with request thread, which waits for the reply is being triggered at the right moment.
Added: camel/trunk/camel-core/src/main/java/org/apache/camel/spi/SynchronizationVetoable.java (with props) camel/trunk/camel-core/src/test/java/org/apache/camel/component/seda/SedaInOnlyChainedTest.java - copied, changed from r933163, camel/trunk/camel-core/src/test/java/org/apache/camel/component/seda/SedaInOutChainedTest.java camel/trunk/camel-core/src/test/java/org/apache/camel/component/seda/SedaInOutBigChainedTest.java - copied, changed from r933190, camel/trunk/camel-core/src/test/java/org/apache/camel/component/seda/SedaInOutChainedTest.java camel/trunk/camel-core/src/test/java/org/apache/camel/component/seda/SedaInOutChainedTimeoutTest.java (with props) camel/trunk/camel-core/src/test/java/org/apache/camel/component/seda/SedaInOutChainedWithOnCompletionTest.java - copied, changed from r933163, camel/trunk/camel-core/src/test/java/org/apache/camel/component/seda/SedaInOutChainedTest.java camel/trunk/camel-core/src/test/java/org/apache/camel/component/vm/VmInOnlyChainedTest.java (with props) camel/trunk/camel-core/src/test/java/org/apache/camel/component/vm/VmInOutChainedTest.java - copied, changed from r933163, camel/trunk/camel-core/src/test/java/org/apache/camel/component/seda/SedaInOutChainedTest.java camel/trunk/camel-core/src/test/java/org/apache/camel/component/vm/VmInOutChainedTimeoutTest.java (with props) camel/trunk/camel-core/src/test/java/org/apache/camel/component/vm/VmTimeoutIssueTest.java (with props) Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/component/seda/SedaProducer.java camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultUnitOfWork.java camel/trunk/camel-core/src/main/java/org/apache/camel/impl/SynchronizationAdapter.java camel/trunk/camel-core/src/test/java/org/apache/camel/processor/MulticastUnitOfWorkTest.java Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/component/seda/SedaProducer.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/component/seda/SedaProducer.java?rev=933214&r1=933213&r2=933214&view=diff ============================================================================== --- camel/trunk/camel-core/src/main/java/org/apache/camel/component/seda/SedaProducer.java (original) +++ camel/trunk/camel-core/src/main/java/org/apache/camel/component/seda/SedaProducer.java Mon Apr 12 12:27:17 2010 @@ -84,6 +84,13 @@ public class SedaProducer extends Collec } @Override + public boolean allowHandover() { + // do not allow handover as we want to seda producer to have its completion triggered + // at this point in the routing (at this leg), instead of at the very last (this ensure timeout is honored) + return false; + } + + @Override public String toString() { return "onDone at [" + endpoint.getEndpointUri() + "]"; } @@ -99,6 +106,8 @@ public class SedaProducer extends Collec boolean done = latch.await(timeout, TimeUnit.MILLISECONDS); if (!done) { exchange.setException(new ExchangeTimedOutException(exchange, timeout)); + // count down to indicate timeout + latch.countDown(); } } else { if (log.isTraceEnabled()) { Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultUnitOfWork.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultUnitOfWork.java?rev=933214&r1=933213&r2=933214&view=diff ============================================================================== --- camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultUnitOfWork.java (original) +++ camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultUnitOfWork.java Mon Apr 12 12:27:17 2010 @@ -18,6 +18,7 @@ package org.apache.camel.impl; import java.util.ArrayList; import java.util.Collections; +import java.util.Iterator; import java.util.LinkedHashSet; import java.util.List; import java.util.Set; @@ -28,6 +29,7 @@ import org.apache.camel.Message; import org.apache.camel.Service; import org.apache.camel.spi.RouteContext; import org.apache.camel.spi.Synchronization; +import org.apache.camel.spi.SynchronizationVetoable; import org.apache.camel.spi.TracedRouteNodes; import org.apache.camel.spi.UnitOfWork; import org.apache.camel.util.EventHelper; @@ -99,7 +101,6 @@ public class DefaultUnitOfWork implement if (synchronizations == null) { synchronizations = new ArrayList<Synchronization>(); } - // must add to top of list so we run last added first (FILO) if (LOG.isTraceEnabled()) { LOG.trace("Adding synchronization " + synchronization); } @@ -117,12 +118,29 @@ public class DefaultUnitOfWork implement return; } - for (Synchronization synchronization : synchronizations) { - target.addOnCompletion(synchronization); - } + Iterator<Synchronization> it = synchronizations.iterator(); + while (it.hasNext()) { + Synchronization synchronization = it.next(); + + boolean handover = true; + if (synchronization instanceof SynchronizationVetoable) { + SynchronizationVetoable veto = (SynchronizationVetoable) synchronization; + handover = veto.allowHandover(); + } - // clear this list as its handed over to the other exchange - this.synchronizations.clear(); + if (handover) { + if (LOG.isTraceEnabled()) { + LOG.trace("Handover synchronization " + synchronization + " to Exchange: " + target); + } + target.addOnCompletion(synchronization); + // remove it if its handed over + it.remove(); + } else { + if (LOG.isTraceEnabled()) { + LOG.trace("Handover not allow for synchronization " + synchronization); + } + } + } } public void done(Exchange exchange) { Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/impl/SynchronizationAdapter.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/SynchronizationAdapter.java?rev=933214&r1=933213&r2=933214&view=diff ============================================================================== --- camel/trunk/camel-core/src/main/java/org/apache/camel/impl/SynchronizationAdapter.java (original) +++ camel/trunk/camel-core/src/main/java/org/apache/camel/impl/SynchronizationAdapter.java Mon Apr 12 12:27:17 2010 @@ -18,6 +18,7 @@ package org.apache.camel.impl; import org.apache.camel.Exchange; import org.apache.camel.spi.Synchronization; +import org.apache.camel.spi.SynchronizationVetoable; /** * Simple {...@link Synchronization} adapter with empty methods for easier overriding @@ -25,7 +26,7 @@ import org.apache.camel.spi.Synchronizat * * @version $Revision$ */ -public class SynchronizationAdapter implements Synchronization { +public class SynchronizationAdapter implements SynchronizationVetoable { public void onComplete(Exchange exchange) { onDone(exchange); @@ -38,4 +39,10 @@ public class SynchronizationAdapter impl public void onDone(Exchange exchange) { // noop } + + public boolean allowHandover() { + // allow by default + return true; + } + } Added: camel/trunk/camel-core/src/main/java/org/apache/camel/spi/SynchronizationVetoable.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/spi/SynchronizationVetoable.java?rev=933214&view=auto ============================================================================== --- camel/trunk/camel-core/src/main/java/org/apache/camel/spi/SynchronizationVetoable.java (added) +++ camel/trunk/camel-core/src/main/java/org/apache/camel/spi/SynchronizationVetoable.java Mon Apr 12 12:27:17 2010 @@ -0,0 +1,44 @@ +/** + * 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.spi; + +/** + * A vetoable {...@link org.apache.camel.spi.Synchronization}. + * <p/> + * When using {...@link org.apache.camel.spi.Synchronization} they are normally executed + * when the {...@link org.apache.camel.Exchange} complete at the end. If the {...@link org.apache.camel.Exchange} + * is processed asynchronously the {...@link org.apache.camel.spi.Synchronization} will be handed + * over to the next thread. This ensures for example the file consumer will delete the processed file at the very + * end, when the {...@link org.apache.camel.Exchange} has been completed succesfully. + * <p/> + * However there may be situations where you do not want to handover certain {...@link org.apache.camel.spi.Synchronization} + * , such as when doing asynchronously request/reply over SEDA or VM endpoints. + * + * @version $Revision$ + */ +public interface SynchronizationVetoable extends Synchronization { + + /** + * Whether or not handover this synchronization is allowed. + * <p/> + * For example when an {...@link org.apache.camel.Exchange} is being routed + * from one thread to another thread, such as using toAsync etc. + * + * @return <tt>true</tt> to allow handover, <tt>false</tt> to deny. + */ + boolean allowHandover(); +} Propchange: camel/trunk/camel-core/src/main/java/org/apache/camel/spi/SynchronizationVetoable.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: camel/trunk/camel-core/src/main/java/org/apache/camel/spi/SynchronizationVetoable.java ------------------------------------------------------------------------------ svn:keywords = Rev Date Copied: camel/trunk/camel-core/src/test/java/org/apache/camel/component/seda/SedaInOnlyChainedTest.java (from r933163, camel/trunk/camel-core/src/test/java/org/apache/camel/component/seda/SedaInOutChainedTest.java) URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/component/seda/SedaInOnlyChainedTest.java?p2=camel/trunk/camel-core/src/test/java/org/apache/camel/component/seda/SedaInOnlyChainedTest.java&p1=camel/trunk/camel-core/src/test/java/org/apache/camel/component/seda/SedaInOutChainedTest.java&r1=933163&r2=933214&rev=933214&view=diff ============================================================================== --- camel/trunk/camel-core/src/test/java/org/apache/camel/component/seda/SedaInOutChainedTest.java (original) +++ camel/trunk/camel-core/src/test/java/org/apache/camel/component/seda/SedaInOnlyChainedTest.java Mon Apr 12 12:27:17 2010 @@ -24,15 +24,14 @@ import static org.apache.camel.language. /** * @version $Revision$ */ -public class SedaInOutChainedTest extends ContextTestSupport { +public class SedaInOnlyChainedTest extends ContextTestSupport { - public void testInOutSedaChained() throws Exception { + public void testInOnlySedaChained() throws Exception { getMockEndpoint("mock:a").expectedBodiesReceived("start"); getMockEndpoint("mock:b").expectedBodiesReceived("start-a"); getMockEndpoint("mock:c").expectedBodiesReceived("start-a-b"); - String reply = template.requestBody("seda:a", "start", String.class); - assertEquals("start-a-b-c", reply); + template.sendBody("seda:a", "start"); assertMockEndpointsSatisfied(); } @@ -42,12 +41,12 @@ public class SedaInOutChainedTest extend return new RouteBuilder() { @Override public void configure() throws Exception { - from("seda:a").to("mock:a").transform(simple("${body}-a")).to("seda:b"); + from("seda:a").to("mock:a").setBody(simple("${body}-a")).to("seda:b"); - from("seda:b").to("mock:b").transform(simple("${body}-b")).to("seda:c"); + from("seda:b").to("mock:b").setBody(simple("${body}-b")).to("seda:c"); - from("seda:c").to("mock:c").transform(simple("${body}-c")); + from("seda:c").to("mock:c").setBody(simple("${body}-c")); } }; } -} +} \ No newline at end of file Copied: camel/trunk/camel-core/src/test/java/org/apache/camel/component/seda/SedaInOutBigChainedTest.java (from r933190, camel/trunk/camel-core/src/test/java/org/apache/camel/component/seda/SedaInOutChainedTest.java) URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/component/seda/SedaInOutBigChainedTest.java?p2=camel/trunk/camel-core/src/test/java/org/apache/camel/component/seda/SedaInOutBigChainedTest.java&p1=camel/trunk/camel-core/src/test/java/org/apache/camel/component/seda/SedaInOutChainedTest.java&r1=933190&r2=933214&rev=933214&view=diff ============================================================================== --- camel/trunk/camel-core/src/test/java/org/apache/camel/component/seda/SedaInOutChainedTest.java (original) +++ camel/trunk/camel-core/src/test/java/org/apache/camel/component/seda/SedaInOutBigChainedTest.java Mon Apr 12 12:27:17 2010 @@ -24,15 +24,20 @@ import static org.apache.camel.language. /** * @version $Revision$ */ -public class SedaInOutChainedTest extends ContextTestSupport { +public class SedaInOutBigChainedTest extends ContextTestSupport { - public void testInOutSedaChained() throws Exception { + public void testInOutBigSedaChained() throws Exception { getMockEndpoint("mock:a").expectedBodiesReceived("start"); getMockEndpoint("mock:b").expectedBodiesReceived("start-a"); getMockEndpoint("mock:c").expectedBodiesReceived("start-a-b"); + getMockEndpoint("mock:d").expectedBodiesReceived("start-a-b-c"); + getMockEndpoint("mock:e").expectedBodiesReceived("start-a-b-c-d"); + getMockEndpoint("mock:f").expectedBodiesReceived("start-a-b-c-d-e"); + getMockEndpoint("mock:g").expectedBodiesReceived("start-a-b-c-d-e-f"); + getMockEndpoint("mock:h").expectedBodiesReceived("start-a-b-c-d-e-f-g"); String reply = template.requestBody("seda:a", "start", String.class); - assertEquals("start-a-b-c", reply); + assertEquals("start-a-b-c-d-e-f-g-h", reply); assertMockEndpointsSatisfied(); } @@ -46,8 +51,18 @@ public class SedaInOutChainedTest extend from("seda:b").to("mock:b").transform(simple("${body}-b")).to("seda:c"); - from("seda:c").to("mock:c").transform(simple("${body}-c")); + from("seda:c").to("mock:c").transform(simple("${body}-c")).to("seda:d"); + + from("seda:d").to("mock:d").transform(simple("${body}-d")).to("seda:e"); + + from("seda:e").to("mock:e").transform(simple("${body}-e")).to("seda:f"); + + from("seda:f").to("mock:f").transform(simple("${body}-f")).to("seda:g"); + + from("seda:g").to("mock:g").transform(simple("${body}-g")).to("seda:h"); + + from("seda:h").to("mock:h").transform(simple("${body}-h")); } }; } -} +} \ No newline at end of file Added: camel/trunk/camel-core/src/test/java/org/apache/camel/component/seda/SedaInOutChainedTimeoutTest.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/component/seda/SedaInOutChainedTimeoutTest.java?rev=933214&view=auto ============================================================================== --- camel/trunk/camel-core/src/test/java/org/apache/camel/component/seda/SedaInOutChainedTimeoutTest.java (added) +++ camel/trunk/camel-core/src/test/java/org/apache/camel/component/seda/SedaInOutChainedTimeoutTest.java Mon Apr 12 12:27:17 2010 @@ -0,0 +1,65 @@ +/** + * 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.component.seda; + +import org.apache.camel.CamelExecutionException; +import org.apache.camel.ContextTestSupport; +import org.apache.camel.ExchangeTimedOutException; +import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.util.StopWatch; + +/** + * @version $Revision$ + */ +public class SedaInOutChainedTimeoutTest extends ContextTestSupport { + + public void testSedaInOutChainedTimeout() throws Exception { + // time timeout after 2 sec should trigger a immediately reply + StopWatch watch = new StopWatch(); + try { + template.requestBody("seda:a?timeout=5000", "Hello World"); + fail("Should have thrown an exception"); + } catch (CamelExecutionException e) { + ExchangeTimedOutException cause = assertIsInstanceOf(ExchangeTimedOutException.class, e.getCause()); + assertEquals(2000, cause.getTimeout()); + } + long delta = watch.stop(); + + assertTrue("Should be faster than 3000 millis, was: " + delta, delta < 3000); + } + + @Override + protected RouteBuilder createRouteBuilder() throws Exception { + return new RouteBuilder() { + @Override + public void configure() throws Exception { + errorHandler(noErrorHandler()); + + from("seda:a") + .to("mock:a") + // this timeout will trigger an exception to occur + .to("seda:b?timeout=2000") + .to("mock:a2"); + + from("seda:b") + .to("mock:b") + .delay(3000) + .transform().constant("Bye World"); + } + }; + } +} Propchange: camel/trunk/camel-core/src/test/java/org/apache/camel/component/seda/SedaInOutChainedTimeoutTest.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: camel/trunk/camel-core/src/test/java/org/apache/camel/component/seda/SedaInOutChainedTimeoutTest.java ------------------------------------------------------------------------------ svn:keywords = Rev Date Copied: camel/trunk/camel-core/src/test/java/org/apache/camel/component/seda/SedaInOutChainedWithOnCompletionTest.java (from r933163, camel/trunk/camel-core/src/test/java/org/apache/camel/component/seda/SedaInOutChainedTest.java) URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/component/seda/SedaInOutChainedWithOnCompletionTest.java?p2=camel/trunk/camel-core/src/test/java/org/apache/camel/component/seda/SedaInOutChainedWithOnCompletionTest.java&p1=camel/trunk/camel-core/src/test/java/org/apache/camel/component/seda/SedaInOutChainedTest.java&r1=933163&r2=933214&rev=933214&view=diff ============================================================================== --- camel/trunk/camel-core/src/test/java/org/apache/camel/component/seda/SedaInOutChainedTest.java (original) +++ camel/trunk/camel-core/src/test/java/org/apache/camel/component/seda/SedaInOutChainedWithOnCompletionTest.java Mon Apr 12 12:27:17 2010 @@ -17,19 +17,23 @@ package org.apache.camel.component.seda; 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.impl.SynchronizationAdapter; import static org.apache.camel.language.simple.SimpleLanguage.simple; /** * @version $Revision$ */ -public class SedaInOutChainedTest extends ContextTestSupport { +public class SedaInOutChainedWithOnCompletionTest extends ContextTestSupport { - public void testInOutSedaChained() throws Exception { + public void testInOutSedaChainedWithCustomOnCompletion() throws Exception { getMockEndpoint("mock:a").expectedBodiesReceived("start"); getMockEndpoint("mock:b").expectedBodiesReceived("start-a"); - getMockEndpoint("mock:c").expectedBodiesReceived("start-a-b"); + // the onCustomCompletion should be send very last (as it will be handed over) + getMockEndpoint("mock:c").expectedBodiesReceived("start-a-b", "onCustomCompletion"); String reply = template.requestBody("seda:a", "start", String.class); assertEquals("start-a-b-c", reply); @@ -42,7 +46,17 @@ public class SedaInOutChainedTest extend return new RouteBuilder() { @Override public void configure() throws Exception { - from("seda:a").to("mock:a").transform(simple("${body}-a")).to("seda:b"); + from("seda:a").process(new Processor() { + public void process(Exchange exchange) throws Exception { + // should come in last + exchange.addOnCompletion(new SynchronizationAdapter() { + @Override + public void onDone(Exchange exchange) { + template.sendBody("mock:c", "onCustomCompletion"); + } + }); + } + }).to("mock:a").transform(simple("${body}-a")).to("seda:b"); from("seda:b").to("mock:b").transform(simple("${body}-b")).to("seda:c"); @@ -50,4 +64,4 @@ public class SedaInOutChainedTest extend } }; } -} +} \ No newline at end of file Added: camel/trunk/camel-core/src/test/java/org/apache/camel/component/vm/VmInOnlyChainedTest.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/component/vm/VmInOnlyChainedTest.java?rev=933214&view=auto ============================================================================== --- camel/trunk/camel-core/src/test/java/org/apache/camel/component/vm/VmInOnlyChainedTest.java (added) +++ camel/trunk/camel-core/src/test/java/org/apache/camel/component/vm/VmInOnlyChainedTest.java Mon Apr 12 12:27:17 2010 @@ -0,0 +1,52 @@ +/** + * 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.component.vm; + +import org.apache.camel.ContextTestSupport; +import org.apache.camel.builder.RouteBuilder; + +import static org.apache.camel.language.simple.SimpleLanguage.simple; + +/** + * @version $Revision$ + */ +public class VmInOnlyChainedTest extends ContextTestSupport { + + public void testInOnlyVmChained() throws Exception { + getMockEndpoint("mock:a").expectedBodiesReceived("start"); + getMockEndpoint("mock:b").expectedBodiesReceived("start-a"); + getMockEndpoint("mock:c").expectedBodiesReceived("start-a-b"); + + template.sendBody("vm:a", "start"); + + assertMockEndpointsSatisfied(); + } + + @Override + protected RouteBuilder createRouteBuilder() throws Exception { + return new RouteBuilder() { + @Override + public void configure() throws Exception { + from("vm:a").to("mock:a").setBody(simple("${body}-a")).to("vm:b"); + + from("vm:b").to("mock:b").setBody(simple("${body}-b")).to("vm:c"); + + from("vm:c").to("mock:c").setBody(simple("${body}-c")); + } + }; + } +} \ No newline at end of file Propchange: camel/trunk/camel-core/src/test/java/org/apache/camel/component/vm/VmInOnlyChainedTest.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: camel/trunk/camel-core/src/test/java/org/apache/camel/component/vm/VmInOnlyChainedTest.java ------------------------------------------------------------------------------ svn:keywords = Rev Date Copied: camel/trunk/camel-core/src/test/java/org/apache/camel/component/vm/VmInOutChainedTest.java (from r933163, camel/trunk/camel-core/src/test/java/org/apache/camel/component/seda/SedaInOutChainedTest.java) URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/component/vm/VmInOutChainedTest.java?p2=camel/trunk/camel-core/src/test/java/org/apache/camel/component/vm/VmInOutChainedTest.java&p1=camel/trunk/camel-core/src/test/java/org/apache/camel/component/seda/SedaInOutChainedTest.java&r1=933163&r2=933214&rev=933214&view=diff ============================================================================== --- camel/trunk/camel-core/src/test/java/org/apache/camel/component/seda/SedaInOutChainedTest.java (original) +++ camel/trunk/camel-core/src/test/java/org/apache/camel/component/vm/VmInOutChainedTest.java Mon Apr 12 12:27:17 2010 @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.camel.component.seda; +package org.apache.camel.component.vm; import org.apache.camel.ContextTestSupport; import org.apache.camel.builder.RouteBuilder; @@ -24,14 +24,14 @@ import static org.apache.camel.language. /** * @version $Revision$ */ -public class SedaInOutChainedTest extends ContextTestSupport { +public class VmInOutChainedTest extends ContextTestSupport { - public void testInOutSedaChained() throws Exception { + public void testInOutVmChained() throws Exception { getMockEndpoint("mock:a").expectedBodiesReceived("start"); getMockEndpoint("mock:b").expectedBodiesReceived("start-a"); getMockEndpoint("mock:c").expectedBodiesReceived("start-a-b"); - String reply = template.requestBody("seda:a", "start", String.class); + String reply = template.requestBody("vm:a", "start", String.class); assertEquals("start-a-b-c", reply); assertMockEndpointsSatisfied(); @@ -42,12 +42,12 @@ public class SedaInOutChainedTest extend return new RouteBuilder() { @Override public void configure() throws Exception { - from("seda:a").to("mock:a").transform(simple("${body}-a")).to("seda:b"); + from("vm:a").to("mock:a").transform(simple("${body}-a")).to("vm:b"); - from("seda:b").to("mock:b").transform(simple("${body}-b")).to("seda:c"); + from("vm:b").to("mock:b").transform(simple("${body}-b")).to("vm:c"); - from("seda:c").to("mock:c").transform(simple("${body}-c")); + from("vm:c").to("mock:c").transform(simple("${body}-c")); } }; } -} +} \ No newline at end of file Added: camel/trunk/camel-core/src/test/java/org/apache/camel/component/vm/VmInOutChainedTimeoutTest.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/component/vm/VmInOutChainedTimeoutTest.java?rev=933214&view=auto ============================================================================== --- camel/trunk/camel-core/src/test/java/org/apache/camel/component/vm/VmInOutChainedTimeoutTest.java (added) +++ camel/trunk/camel-core/src/test/java/org/apache/camel/component/vm/VmInOutChainedTimeoutTest.java Mon Apr 12 12:27:17 2010 @@ -0,0 +1,67 @@ +/** + * 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.component.vm; + +import org.apache.camel.CamelExecutionException; +import org.apache.camel.ContextTestSupport; +import org.apache.camel.ExchangeTimedOutException; +import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.util.StopWatch; + +/** + * @version $Revision$ + */ +public class VmInOutChainedTimeoutTest extends ContextTestSupport { + + public void testVmInOutChainedTimeout() throws Exception { + // time timeout after 2 sec should trigger a immediately reply + StopWatch watch = new StopWatch(); + try { + template.requestBody("vm:a?timeout=5000", "Hello World"); + fail("Should have thrown an exception"); + } catch (CamelExecutionException e) { + ExchangeTimedOutException cause = assertIsInstanceOf(ExchangeTimedOutException.class, e.getCause()); + assertEquals(2000, cause.getTimeout()); + } + long delta = watch.stop(); + + assertTrue("Should be faster than 3000 millis, was: " + delta, delta < 3000); + + Thread.sleep(2000); + } + + @Override + protected RouteBuilder createRouteBuilder() throws Exception { + return new RouteBuilder() { + @Override + public void configure() throws Exception { + errorHandler(noErrorHandler()); + + from("vm:a") + .to("mock:a") + // this timeout will trigger an exception to occur + .to("vm:b?timeout=2000") + .to("mock:a2"); + + from("vm:b") + .to("mock:b") + .delay(3000) + .transform().constant("Bye World"); + } + }; + } +} \ No newline at end of file Propchange: camel/trunk/camel-core/src/test/java/org/apache/camel/component/vm/VmInOutChainedTimeoutTest.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: camel/trunk/camel-core/src/test/java/org/apache/camel/component/vm/VmInOutChainedTimeoutTest.java ------------------------------------------------------------------------------ svn:keywords = Rev Date Added: camel/trunk/camel-core/src/test/java/org/apache/camel/component/vm/VmTimeoutIssueTest.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/component/vm/VmTimeoutIssueTest.java?rev=933214&view=auto ============================================================================== --- camel/trunk/camel-core/src/test/java/org/apache/camel/component/vm/VmTimeoutIssueTest.java (added) +++ camel/trunk/camel-core/src/test/java/org/apache/camel/component/vm/VmTimeoutIssueTest.java Mon Apr 12 12:27:17 2010 @@ -0,0 +1,79 @@ +/** + * 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.component.vm; + +import org.apache.camel.CamelExecutionException; +import org.apache.camel.ContextTestSupport; +import org.apache.camel.Exchange; +import org.apache.camel.ExchangeTimedOutException; +import org.apache.camel.Processor; +import org.apache.camel.builder.RouteBuilder; + +/** + * @version $Revision$ + */ +public class VmTimeoutIssueTest extends ContextTestSupport { + + public void testVmTimeoutWithAnotherVm() throws Exception { + try { + template.requestBody("vm:start1?timeout=4000", "Hello"); + fail("Should have thrown an exception"); + } catch (CamelExecutionException e) { + ExchangeTimedOutException cause = assertIsInstanceOf(ExchangeTimedOutException.class, e.getCause()); + assertEquals(2000, cause.getTimeout()); + } + } + + public void testVmTimeoutWithProcessor() throws Exception { + try { + template.requestBody("vm:start2?timeout=4000", "Hello"); + fail("Should have thrown an exception"); + } catch (CamelExecutionException e) { + ExchangeTimedOutException cause = assertIsInstanceOf(ExchangeTimedOutException.class, e.getCause()); + assertEquals(2000, cause.getTimeout()); + } + } + + @Override + protected RouteBuilder createRouteBuilder() throws Exception { + return new RouteBuilder() { + @Override + public void configure() throws Exception { + errorHandler(noErrorHandler()); + + from("vm:start1?timeout=4000") + .to("log:AFTER_START1") + .to("vm:end?timeout=2000") + .to("log:AFTER_END"); + + from("vm:start2?timeout=4000") + .to("log:AFTER_START2") + .process(new Processor() { + public void process(Exchange exchange) throws Exception { + // this exception will trigger to stop asap + throw new ExchangeTimedOutException(exchange, 2000); + } + }) + .to("log:AFTER_PROCESSOR"); + + from("vm:end") + .delay(3000).transform().constant("Bye World"); + } + }; + } + +} Propchange: camel/trunk/camel-core/src/test/java/org/apache/camel/component/vm/VmTimeoutIssueTest.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: camel/trunk/camel-core/src/test/java/org/apache/camel/component/vm/VmTimeoutIssueTest.java ------------------------------------------------------------------------------ svn:keywords = Rev Date Modified: camel/trunk/camel-core/src/test/java/org/apache/camel/processor/MulticastUnitOfWorkTest.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/processor/MulticastUnitOfWorkTest.java?rev=933214&r1=933213&r2=933214&view=diff ============================================================================== --- camel/trunk/camel-core/src/test/java/org/apache/camel/processor/MulticastUnitOfWorkTest.java (original) +++ camel/trunk/camel-core/src/test/java/org/apache/camel/processor/MulticastUnitOfWorkTest.java Mon Apr 12 12:27:17 2010 @@ -41,10 +41,9 @@ public class MulticastUnitOfWorkTest ext assertMockEndpointsSatisfied(); - // the UoW is shared for multicast with direct - // so B should be the last - assertEquals("onCompleteB", sync); - assertEquals("onCompleteB", lastOne); + // will run B and then A, where A will be the last one + assertEquals("onCompleteA", sync); + assertEquals("onCompleteA", lastOne); } @Override