Author: davsclaus Date: Fri Jun 15 11:57:10 2012 New Revision: 1350589 URL: http://svn.apache.org/viewvc?rev=1350589&view=rev Log: CAMEL-5370: Added direct-vm component to act as synchronous direct calls between multiple camel contexts in the same JVM (eg like direct + vm together). Can be used to support transactions spanning multiple camel contextes / bundles.
Added: camel/trunk/camel-core/src/main/java/org/apache/camel/component/directvm/ camel/trunk/camel-core/src/main/java/org/apache/camel/component/directvm/DirectVmComponent.java camel/trunk/camel-core/src/main/java/org/apache/camel/component/directvm/DirectVmConsumer.java camel/trunk/camel-core/src/main/java/org/apache/camel/component/directvm/DirectVmEndpoint.java camel/trunk/camel-core/src/main/java/org/apache/camel/component/directvm/DirectVmProcessor.java camel/trunk/camel-core/src/main/java/org/apache/camel/component/directvm/DirectVmProducer.java camel/trunk/camel-core/src/main/java/org/apache/camel/component/directvm/package.html - copied, changed from r1350519, camel/trunk/camel-core/src/main/java/org/apache/camel/component/direct/package.html camel/trunk/camel-core/src/main/resources/META-INF/services/org/apache/camel/component/direct-vm - copied, changed from r1350519, camel/trunk/camel-core/src/main/resources/META-INF/services/org/apache/camel/component/direct camel/trunk/camel-core/src/test/java/org/apache/camel/component/directvm/ camel/trunk/camel-core/src/test/java/org/apache/camel/component/directvm/AbstractDirectVmTestSupport.java camel/trunk/camel-core/src/test/java/org/apache/camel/component/directvm/DirectVmShouldUseSameThreadTest.java camel/trunk/camel-core/src/test/java/org/apache/camel/component/directvm/DirectVmTwoCamelContextDuplicateConsumerTest.java camel/trunk/camel-core/src/test/java/org/apache/camel/component/directvm/DirectVmTwoCamelContextTest.java Added: camel/trunk/camel-core/src/main/java/org/apache/camel/component/directvm/DirectVmComponent.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/component/directvm/DirectVmComponent.java?rev=1350589&view=auto ============================================================================== --- camel/trunk/camel-core/src/main/java/org/apache/camel/component/directvm/DirectVmComponent.java (added) +++ camel/trunk/camel-core/src/main/java/org/apache/camel/component/directvm/DirectVmComponent.java Fri Jun 15 11:57:10 2012 @@ -0,0 +1,89 @@ +/** + * 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.directvm; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; +import java.util.concurrent.atomic.AtomicInteger; + +import org.apache.camel.Endpoint; +import org.apache.camel.impl.DefaultComponent; + +/** + * Represents the component that manages {@link DirectVmEndpoint}. It holds the + * list of named direct-vm endpoints. + */ +public class DirectVmComponent extends DefaultComponent { + + private static final AtomicInteger START_COUNTER = new AtomicInteger(); + + // must keep a map of consumers on the component to ensure endpoints can lookup old consumers + // later in case the DirectEndpoint was re-created due the old was evicted from the endpoints LRUCache + // on DefaultCamelContext + private static final ConcurrentMap<String, DirectVmConsumer> consumers = new ConcurrentHashMap<String, DirectVmConsumer>(); + + @Override + protected Endpoint createEndpoint(String uri, String remaining, Map<String, Object> parameters) throws Exception { + DirectVmEndpoint answer = new DirectVmEndpoint(uri, this); + answer.configureProperties(parameters); + return answer; + } + + public DirectVmConsumer getConsumer(DirectVmEndpoint endpoint) { + String key = getConsumerKey(endpoint.getEndpointUri()); + return consumers.get(key); + } + + public void addConsumer(DirectVmEndpoint endpoint, DirectVmConsumer consumer) { + String key = getConsumerKey(endpoint.getEndpointUri()); + DirectVmConsumer existing = consumers.putIfAbsent(key, consumer); + if (existing != null) { + String contextId = existing.getEndpoint().getCamelContext().getName(); + throw new IllegalStateException("A consumer " + existing + " already exists from CamelContext: " + contextId + ". Multiple consumers not supported"); + } + consumers.put(key, consumer); + } + + public void removeConsumer(DirectVmEndpoint endpoint, DirectVmConsumer consumer) { + String key = getConsumerKey(endpoint.getEndpointUri()); + consumers.remove(key); + } + + private static String getConsumerKey(String uri) { + if (uri.contains("?")) { + // strip parameters + uri = uri.substring(0, uri.indexOf('?')); + } + return uri; + } + + @Override + protected void doStart() throws Exception { + super.doStart(); + START_COUNTER.incrementAndGet(); + } + + @Override + protected void doStop() throws Exception { + if (START_COUNTER.decrementAndGet() <= 0) { + // clear queues when no more direct-vm components in use + consumers.clear(); + } + } + +} Added: camel/trunk/camel-core/src/main/java/org/apache/camel/component/directvm/DirectVmConsumer.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/component/directvm/DirectVmConsumer.java?rev=1350589&view=auto ============================================================================== --- camel/trunk/camel-core/src/main/java/org/apache/camel/component/directvm/DirectVmConsumer.java (added) +++ camel/trunk/camel-core/src/main/java/org/apache/camel/component/directvm/DirectVmConsumer.java Fri Jun 15 11:57:10 2012 @@ -0,0 +1,48 @@ +/** + * 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.directvm; + +import org.apache.camel.Processor; +import org.apache.camel.impl.DefaultConsumer; + +/** + * The direct-vm consumer + */ +public class DirectVmConsumer extends DefaultConsumer { + + public DirectVmConsumer(DirectVmEndpoint endpoint, Processor processor) { + super(endpoint, processor); + } + + @Override + public DirectVmEndpoint getEndpoint() { + return (DirectVmEndpoint) super.getEndpoint(); + } + + @Override + protected void doStart() throws Exception { + super.doStart(); + getEndpoint().getComponent().addConsumer(getEndpoint(), this); + } + + @Override + protected void doStop() throws Exception { + getEndpoint().getComponent().removeConsumer(getEndpoint(), this); + super.doStop(); + } + +} Added: camel/trunk/camel-core/src/main/java/org/apache/camel/component/directvm/DirectVmEndpoint.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/component/directvm/DirectVmEndpoint.java?rev=1350589&view=auto ============================================================================== --- camel/trunk/camel-core/src/main/java/org/apache/camel/component/directvm/DirectVmEndpoint.java (added) +++ camel/trunk/camel-core/src/main/java/org/apache/camel/component/directvm/DirectVmEndpoint.java Fri Jun 15 11:57:10 2012 @@ -0,0 +1,57 @@ +/** + * 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.directvm; + +import org.apache.camel.Consumer; +import org.apache.camel.Processor; +import org.apache.camel.Producer; +import org.apache.camel.impl.DefaultEndpoint; + +/** + * The direct-vm endpoint. + */ +public class DirectVmEndpoint extends DefaultEndpoint { + + public DirectVmEndpoint(String endpointUri, DirectVmComponent component) { + super(endpointUri, component); + } + + @Override + public DirectVmComponent getComponent() { + return (DirectVmComponent) super.getComponent(); + } + + @Override + public Producer createProducer() throws Exception { + return new DirectVmProducer(this); + } + + @Override + public Consumer createConsumer(Processor processor) throws Exception { + return new DirectVmConsumer(this, new DirectVmProcessor(processor, this)); + } + + @Override + public boolean isSingleton() { + return true; + } + + public DirectVmConsumer getConsumer() { + return getComponent().getConsumer(this); + } + +} Added: camel/trunk/camel-core/src/main/java/org/apache/camel/component/directvm/DirectVmProcessor.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/component/directvm/DirectVmProcessor.java?rev=1350589&view=auto ============================================================================== --- camel/trunk/camel-core/src/main/java/org/apache/camel/component/directvm/DirectVmProcessor.java (added) +++ camel/trunk/camel-core/src/main/java/org/apache/camel/component/directvm/DirectVmProcessor.java Fri Jun 15 11:57:10 2012 @@ -0,0 +1,66 @@ +/** + * 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.directvm; + +import org.apache.camel.Exchange; +import org.apache.camel.Processor; +import org.apache.camel.processor.DelegateProcessor; +import org.apache.camel.util.ExchangeHelper; + +/** +* +*/ +public final class DirectVmProcessor extends DelegateProcessor { + + private final DirectVmEndpoint endpoint; + + public DirectVmProcessor(Processor processor, DirectVmEndpoint endpoint) { + super(processor); + this.endpoint = endpoint; + } + + @Override + public void process(Exchange exchange) throws Exception { + // need to use a copy of the incoming exchange, so we route using this camel context + Exchange copy = prepareExchange(exchange); + try { + getProcessor().process(copy); + } finally { + // make sure to copy results back + ExchangeHelper.copyResults(exchange, copy); + } + } + + /** + * Strategy to prepare exchange for being processed by this consumer + * + * @param exchange the exchange + * @return the exchange to process by this consumer. + */ + protected Exchange prepareExchange(Exchange exchange) { + // send a new copied exchange with new camel context + Exchange newExchange = ExchangeHelper.copyExchangeAndSetCamelContext(exchange, endpoint.getCamelContext()); + // set the from endpoint + newExchange.setFromEndpoint(endpoint); + return newExchange; + } + + @Override + public String toString() { + return "DirectVm[" + processor + "]"; + } +} Added: camel/trunk/camel-core/src/main/java/org/apache/camel/component/directvm/DirectVmProducer.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/component/directvm/DirectVmProducer.java?rev=1350589&view=auto ============================================================================== --- camel/trunk/camel-core/src/main/java/org/apache/camel/component/directvm/DirectVmProducer.java (added) +++ camel/trunk/camel-core/src/main/java/org/apache/camel/component/directvm/DirectVmProducer.java Fri Jun 15 11:57:10 2012 @@ -0,0 +1,48 @@ +/** + * 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.directvm; + +import org.apache.camel.CamelExchangeException; +import org.apache.camel.Exchange; +import org.apache.camel.impl.DefaultProducer; + +/** + * The direct-vm producer + */ +public class DirectVmProducer extends DefaultProducer { + + public DirectVmProducer(DirectVmEndpoint endpoint) { + super(endpoint); + } + + @Override + public DirectVmEndpoint getEndpoint() { + return (DirectVmEndpoint) super.getEndpoint(); + } + + @Override + public void process(Exchange exchange) throws Exception { + // send to consumer + DirectVmConsumer consumer = getEndpoint().getComponent().getConsumer(getEndpoint()); + if (consumer == null) { + log.warn("No consumers available on endpoint: " + getEndpoint() + " to process: " + exchange); + throw new CamelExchangeException("No consumers available on endpoint: " + getEndpoint(), exchange); + } else { + consumer.getProcessor().process(exchange); + } + } +} Copied: camel/trunk/camel-core/src/main/java/org/apache/camel/component/directvm/package.html (from r1350519, camel/trunk/camel-core/src/main/java/org/apache/camel/component/direct/package.html) URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/component/directvm/package.html?p2=camel/trunk/camel-core/src/main/java/org/apache/camel/component/directvm/package.html&p1=camel/trunk/camel-core/src/main/java/org/apache/camel/component/direct/package.html&r1=1350519&r2=1350589&rev=1350589&view=diff ============================================================================== --- camel/trunk/camel-core/src/main/java/org/apache/camel/component/direct/package.html (original) +++ camel/trunk/camel-core/src/main/java/org/apache/camel/component/directvm/package.html Fri Jun 15 11:57:10 2012 @@ -19,8 +19,12 @@ </head> <body> -The <a href="http://camel.apache.org/direct.html">Direct Component</a> which synchronously invokes -all the consumers when a producer sends an exchange to the endpoint. This also known as <i>strait through processing</i>. +The <a href="http://camel.apache.org/directvm.html">Direct VM Component</a> which synchronously invokes +the consumer when a producer sends an exchange to the endpoint. This also known as <i>strait through processing</i>. +<p/> +This component supports messaging within the current JVM; so across CamelContext instances. +Note that this communication can only take place between ClassLoaders which share the same camel-core.jar. +So to communicate across web applications you need to put camel-core.jar on the system/boot classpath. </body> </html> Copied: camel/trunk/camel-core/src/main/resources/META-INF/services/org/apache/camel/component/direct-vm (from r1350519, camel/trunk/camel-core/src/main/resources/META-INF/services/org/apache/camel/component/direct) URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/resources/META-INF/services/org/apache/camel/component/direct-vm?p2=camel/trunk/camel-core/src/main/resources/META-INF/services/org/apache/camel/component/direct-vm&p1=camel/trunk/camel-core/src/main/resources/META-INF/services/org/apache/camel/component/direct&r1=1350519&r2=1350589&rev=1350589&view=diff ============================================================================== --- camel/trunk/camel-core/src/main/resources/META-INF/services/org/apache/camel/component/direct (original) +++ camel/trunk/camel-core/src/main/resources/META-INF/services/org/apache/camel/component/direct-vm Fri Jun 15 11:57:10 2012 @@ -15,4 +15,4 @@ # limitations under the License. # -class=org.apache.camel.component.direct.DirectComponent +class=org.apache.camel.component.directvm.DirectVmComponent Added: camel/trunk/camel-core/src/test/java/org/apache/camel/component/directvm/AbstractDirectVmTestSupport.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/component/directvm/AbstractDirectVmTestSupport.java?rev=1350589&view=auto ============================================================================== --- camel/trunk/camel-core/src/test/java/org/apache/camel/component/directvm/AbstractDirectVmTestSupport.java (added) +++ camel/trunk/camel-core/src/test/java/org/apache/camel/component/directvm/AbstractDirectVmTestSupport.java Fri Jun 15 11:57:10 2012 @@ -0,0 +1,64 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.component.directvm; + +import org.apache.camel.CamelContext; +import org.apache.camel.ContextTestSupport; +import org.apache.camel.ProducerTemplate; +import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.impl.DefaultCamelContext; +import org.apache.camel.util.ServiceHelper; +import org.junit.After; +import org.junit.Before; + +/** + * + */ +public class AbstractDirectVmTestSupport extends ContextTestSupport { + protected CamelContext context2; + protected ProducerTemplate template2; + + @Override + @Before + protected void setUp() throws Exception { + super.setUp(); + + context2 = new DefaultCamelContext(); + template2 = context2.createProducerTemplate(); + + ServiceHelper.startServices(template2, context2); + + // add routes after CamelContext has been started + RouteBuilder routeBuilder = createRouteBuilderForSecondContext(); + if (routeBuilder != null) { + context2.addRoutes(routeBuilder); + } + } + + @Override + @After + protected void tearDown() throws Exception { + ServiceHelper.stopServices(context2, template2); + + super.tearDown(); + } + + protected RouteBuilder createRouteBuilderForSecondContext() throws Exception { + return null; + } + +} Added: camel/trunk/camel-core/src/test/java/org/apache/camel/component/directvm/DirectVmShouldUseSameThreadTest.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/component/directvm/DirectVmShouldUseSameThreadTest.java?rev=1350589&view=auto ============================================================================== --- camel/trunk/camel-core/src/test/java/org/apache/camel/component/directvm/DirectVmShouldUseSameThreadTest.java (added) +++ camel/trunk/camel-core/src/test/java/org/apache/camel/component/directvm/DirectVmShouldUseSameThreadTest.java Fri Jun 15 11:57:10 2012 @@ -0,0 +1,63 @@ +/** + * 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.directvm; + +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; + +/** + * + */ +public class DirectVmShouldUseSameThreadTest extends ContextTestSupport { + + private static long id; + + public void testUseSameThread() throws Exception { + MockEndpoint mock = getMockEndpoint("mock:result"); + mock.expectedBodiesReceived("Hello World"); + + template.sendBody("direct-vm:start", "Hello World"); + + assertMockEndpointsSatisfied(); + } + + protected RouteBuilder createRouteBuilder() throws Exception { + return new RouteBuilder() { + public void configure() throws Exception { + final ThreadLocal<String> local = new ThreadLocal<String>(); + + from("direct-vm:start").process(new Processor() { + public void process(Exchange exchange) throws Exception { + local.set("Hello"); + id = Thread.currentThread().getId(); + } + }).to("direct-vm:foo"); + + from("direct-vm:foo").process(new Processor() { + public void process(Exchange exchange) throws Exception { + assertEquals("Hello", local.get()); + assertEquals(id, Thread.currentThread().getId()); + } + }).to("mock:result"); + } + }; + } + +} \ No newline at end of file Added: camel/trunk/camel-core/src/test/java/org/apache/camel/component/directvm/DirectVmTwoCamelContextDuplicateConsumerTest.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/component/directvm/DirectVmTwoCamelContextDuplicateConsumerTest.java?rev=1350589&view=auto ============================================================================== --- camel/trunk/camel-core/src/test/java/org/apache/camel/component/directvm/DirectVmTwoCamelContextDuplicateConsumerTest.java (added) +++ camel/trunk/camel-core/src/test/java/org/apache/camel/component/directvm/DirectVmTwoCamelContextDuplicateConsumerTest.java Fri Jun 15 11:57:10 2012 @@ -0,0 +1,92 @@ +/** + * 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.directvm; + +import org.apache.camel.CamelContext; +import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.component.mock.MockEndpoint; +import org.apache.camel.impl.DefaultCamelContext; + +/** + * + */ +public class DirectVmTwoCamelContextDuplicateConsumerTest extends AbstractDirectVmTestSupport { + + public void testThirdClash() throws Exception { + CamelContext third = new DefaultCamelContext(); + third.addRoutes(createRouteBuilderForThirdContext()); + try { + third.start(); + fail("Should have thrown exception"); + } catch (IllegalStateException e) { + assertEquals("A consumer Consumer[direct-vm://foo] already exists from CamelContext: camel-1. Multiple consumers not supported", e.getMessage()); + } + + // stop first camel context then + context.stop(); + + // and start the 3rd which should work now + third.start(); + + MockEndpoint mock = third.getEndpoint("mock:third", MockEndpoint.class); + mock.expectedMessageCount(1); + + template2.sendBody("direct:start", "Hello World"); + + mock.assertIsSatisfied(); + + third.stop(); + } + + @Override + protected RouteBuilder createRouteBuilder() throws Exception { + return new RouteBuilder() { + @Override + public void configure() throws Exception { + from("direct-vm:foo") + .transform(constant("Bye World")) + .log("Running on Camel ${camelId} on thread ${threadName} with message ${body}") + .to("mock:result"); + } + }; + } + + @Override + protected RouteBuilder createRouteBuilderForSecondContext() throws Exception { + return new RouteBuilder() { + @Override + public void configure() throws Exception { + from("direct:start") + .log("Running on Camel ${camelId} on thread ${threadName} with message ${body}") + .to("direct-vm:foo"); + } + }; + } + + protected RouteBuilder createRouteBuilderForThirdContext() throws Exception { + return new RouteBuilder() { + @Override + public void configure() throws Exception { + from("direct-vm:foo") + .transform(constant("Bye World")) + .log("Running on Camel ${camelId} on thread ${threadName} with message ${body}") + .to("mock:third"); + } + }; + } + +} Added: camel/trunk/camel-core/src/test/java/org/apache/camel/component/directvm/DirectVmTwoCamelContextTest.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/component/directvm/DirectVmTwoCamelContextTest.java?rev=1350589&view=auto ============================================================================== --- camel/trunk/camel-core/src/test/java/org/apache/camel/component/directvm/DirectVmTwoCamelContextTest.java (added) +++ camel/trunk/camel-core/src/test/java/org/apache/camel/component/directvm/DirectVmTwoCamelContextTest.java Fri Jun 15 11:57:10 2012 @@ -0,0 +1,60 @@ +/** + * 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.directvm; + +import org.apache.camel.builder.RouteBuilder; + +/** + * + */ +public class DirectVmTwoCamelContextTest extends AbstractDirectVmTestSupport { + + public void testTwoCamelContext() throws Exception { + getMockEndpoint("mock:result").expectedBodiesReceived("Bye World"); + + String out = template2.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 { + from("direct-vm:foo") + .transform(constant("Bye World")) + .log("Running on Camel ${camelId} on thread ${threadName} with message ${body}") + .to("mock:result"); + } + }; + } + + @Override + protected RouteBuilder createRouteBuilderForSecondContext() throws Exception { + return new RouteBuilder() { + @Override + public void configure() throws Exception { + from("direct:start") + .log("Running on Camel ${camelId} on thread ${threadName} with message ${body}") + .to("direct-vm:foo"); + } + }; + } + +}