Thank you guys for the response! Best, Christian
On Fri, May 3, 2013 at 3:38 PM, Babak Vahdat <[email protected]>wrote: > Yeah that was the cause of the behaviour threadPoolProfile instead of > threadProfile, sorry! > > Babak > > Am 03.05.2013 um 15:23 schrieb Claus Ibsen <[email protected]>: > > > 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 > > <[email protected]> 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: [email protected] > > Web: http://fusesource.com > > Twitter: davsclaus > > Blog: http://davsclaus.com > > Author of Camel in Action: http://www.manning.com/ibsen >
