Yeah that was the cause of the behaviour threadPoolProfile instead of threadProfile, sorry!
Babak Am 03.05.2013 um 15:23 schrieb Claus Ibsen <claus.ib...@gmail.com>: > Babak well spotted. Though its not a bug. > > <threadPoolProfile> is a profile, (aka like a skeleton/template). > Which you use to define options, when creating new thread pools. > > Use > <threadPool> > > if you want a single thread pool and share it between the 2 wire taps, > then yeah Christian should use a <threadPool> instead. > > Mind that you can still define a <threadPoolProfile> and then a > <threadPool> which can use the profile to define its basic options. > > See more details at > http://camel.apache.org/threading-model.html > > > > On Fri, May 3, 2013 at 2:52 PM, Babak Vahdat > <babak.vah...@swissonline.ch> wrote: >> Hi, >> >> The reason of the behavior you're observing is simply because of a current >> bug in Camel itself as given your 2 routes below, the current logic creates >> TWO instances of ExecutorService and not as you would expect ONE >> ExecutorService object (each being passed to each of the 2 WireTapProcessor >> in your route). Looking at >> ProcessorDefinitionHelper#lookupExecutorServiceRef() the current logic looks >> up ONLY inside the registry causing 2 ExecutorService being returned by each >> invocation of this method. >> >> One simple current workaround to get that lovely green lines inside your IDE >> for your test would be to bind "executorService" into the Camel Registry, in >> your case ApplicationContextRegistry, that's: >> >> <bean id="executorService" class="java.util.concurrent.Executors" >> factory-method="newSingleThreadExecutor" destroy-method="shutdownNow" /> >> >> Would you mind to raise a ticket for this? >> >> Babak >> >> >> Christian Mueller wrote >>> The following test fails randomly fails at message 6 up to 961 (on my >>> machine). I consider this as an bug: >>> >>> public class WireTapTest extends CamelSpringTestSupport { >>> >>> private int counter = 10000; >>> >>> @Test >>> public void test() throws InterruptedException { >>> getMockEndpoint("mock:result").expectedMessageCount(counter * 2); >>> >>> template.setDefaultEndpointUri("direct:start"); >>> for (int i = 0; i < counter; i++) { >>> template.requestBody("Camel"); >>> } >>> >>> assertMockEndpointsSatisfied(); >>> >>> List >>> <Exchange> >>> receivedExchanges = >>> getMockEndpoint("mock:result").getReceivedExchanges(); >>> for (int i = 0; i < receivedExchanges.size(); i++) { >>> System.out.println("check exchange number " + i); >>> >>> String body = >>> receivedExchanges.get(i).getIn().getBody(String.class); >>> if (i % 2 == 0) { >>> assertEquals("REQUEST", body); >>> } else { >>> assertEquals("RESPONSE", body); >>> } >>> } >>> } >>> >>> @Override >>> protected AbstractApplicationContext createApplicationContext() { >>> return new ClassPathXmlApplicationContext("bundle-context.xml"); >>> } >>> } >>> >>> which is using the following route: >>> public class WireTapRouteBuilder extends RouteBuilder { >>> >>> @Override >>> public void configure() throws Exception { >>> from("direct:start") >>> .wireTap("seda:wireTap").executorServiceRef("executorService") >>> .setHeader("TYPE", constant("RESPONSE")) >>> >>> .wireTap("seda:wireTap").executorServiceRef("executorService"); >>> >>> from("seda:wireTap") >>> .choice() >>> .when(header("TYPE").isNull()) >>> .setBody(constant("REQUEST")) >>> .to("mock:result") >>> .otherwise() >>> .setBody(constant("RESPONSE")) >>> .to("mock:result") >>> .end(); >>> } >>> } >>> >>> and the following configuration: >>> <beans xmlns="http://www.springframework.org/schema/beans" >>> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >>> xmlns:camel="http://camel.apache.org/schema/spring" >>> xsi:schemaLocation=" >>> http://www.springframework.org/schema/beans >>> http://www.springframework.org/schema/beans/spring-beans.xsd >>> http://camel.apache.org/schema/spring >>> http://camel.apache.org/schema/spring/camel-spring.xsd"> >>> >>> <camel:camelContext id="com.xxx.xxxx.wireTapTest"> >>> >>> <camel:routeBuilder ref="wireTapRouteBuilder" /> >>> >>> <camel:threadPoolProfile id="executorService" defaultProfile="false" >>> poolSize="1" maxPoolSize="1" maxQueueSize="10000" >>> rejectedPolicy="Discard"/> >>> >>> </camel:camelContext> >>> >>> <bean id="wireTapRouteBuilder" >>> class="com.xxx.xxxx.wiretap.WireTapRouteBuilder" /> >>> </beans> >>> We use the wiretap to send messages to an endpoint which persist some key >>> information about the execution in a database. It's important for us to >>> persist the messages into the database in the same order as they arrive in >>> the seda endpoint. Because of this, we configured the threadPoolProfile to >>> only use one thread. But some times the messages receive in the reverse >>> order in our database/mock endpoint. >>> >>> Any suggestions what is wrong here? >>> >>> Best, >>> Christian >> >> >> >> >> >> -- >> View this message in context: >> http://camel.465427.n5.nabble.com/WireTap-doesn-t-process-the-messages-in-the-order-they-arrived-for-each-message-tp5731733p5731969.html >> Sent from the Camel - Users mailing list archive at Nabble.com. > > > > -- > Claus Ibsen > ----------------- > Red Hat, Inc. > FuseSource is now part of Red Hat > Email: cib...@redhat.com > Web: http://fusesource.com > Twitter: davsclaus > Blog: http://davsclaus.com > Author of Camel in Action: http://www.manning.com/ibsen