On Fri, Dec 30, 2011 at 9:54 AM, Jason Dillon <[email protected]> wrote:
> On Dec 29, 2011, at 5:42 PM, Willem Jiang wrote:
>> There are some default interceptors, processor wrappers are used to help 
>> camel to implement the error handling and async processing.
>
> What is async about the route below?  I'd imagine that the route flow:
>
> producer-template -> direct -> direct -> processor
>
> ... would be completely sync.   Is there some async behavior hiding in here?
>

Its the Camel routing engine underneath that adds in behavior to
control the routing, and deal with interceptors, tracing, error
handling, asynchronous non-blocking routing and whatnot.


> --jason
>
>
>> On Fri Dec 30 03:56:15 2011, Jason Dillon wrote:
>>> I'm seeing a very deep stack for a simple route and I'm wondering... why it 
>>> is so deep?
>>>
>>> Testing with a class like:
>>>
>>> <snip>
>>> public class BasicCamelTrial
>>>     extends TestSupport
>>> {
>>>     @Test
>>>     public void showStackDepthForSimpleRoute() throws Exception {
>>>         DefaultCamelContext camel = new DefaultCamelContext();
>>>         camel.disableJMX();
>>>         camel.addRoutes(new RouteBuilder()
>>>         {
>>>             @Override
>>>             public void configure() throws Exception {
>>>                 from("direct:foo").to("direct:bar");
>>>                 from("direct:bar").process(new Processor()
>>>                 {
>>>                     @Override
>>>                     public void process(Exchange exchange) throws Exception 
>>> {
>>>                         Throwable t = new Throwable("MARKER");
>>>                         log("HERE; stack size: {}", 
>>> t.getStackTrace().length, t);
>>>                     }
>>>                 });
>>>             }
>>>         });
>>>
>>>         camel.start();
>>>
>>>         ProducerTemplate producer = camel.createProducerTemplate();
>>>         producer.sendBody("direct:foo", "Hello");
>>>         producer.stop();
>>>
>>>         camel.stop();
>>>     }
>>> }
>>> </snip>
>>>
>>> Shows stack is:
>>>
>>> <snip>
>>> java.lang.Throwable: MARKER
>>>      at BasicCamelTrial$1$1.process(BasicCamelTrial.java:39) 
>>> [test-classes/:na]
>>>      at 
>>> org.apache.camel.impl.converter.AsyncProcessorTypeConverter$ProcessorToAsyncProcessorBridge.process(AsyncProcessorTypeConverter.java:50)
>>>  [camel-core-2.8.3.jar:2.8.3]
>>>      at 
>>> org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:78)
>>>  [camel-core-2.8.3.jar:2.8.3]
>>>      at 
>>> org.apache.camel.processor.DelegateAsyncProcessor.processNext(DelegateAsyncProcessor.java:98)
>>>  [camel-core-2.8.3.jar:2.8.3]
>>>      at 
>>> org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:89)
>>>  [camel-core-2.8.3.jar:2.8.3]
>>>      at 
>>> org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:78)
>>>  [camel-core-2.8.3.jar:2.8.3]
>>>      at 
>>> org.apache.camel.processor.DelegateAsyncProcessor.processNext(DelegateAsyncProcessor.java:98)
>>>  [camel-core-2.8.3.jar:2.8.3]
>>>      at 
>>> org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:89)
>>>  [camel-core-2.8.3.jar:2.8.3]
>>>      at 
>>> org.apache.camel.processor.interceptor.TraceInterceptor.process(TraceInterceptor.java:90)
>>>  [camel-core-2.8.3.jar:2.8.3]
>>>      at 
>>> org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:78)
>>>  [camel-core-2.8.3.jar:2.8.3]
>>>      at 
>>> org.apache.camel.processor.RedeliveryErrorHandler.processErrorHandler(RedeliveryErrorHandler.java:318)
>>>  [camel-core-2.8.3.jar:2.8.3]
>>>      at 
>>> org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:209)
>>>  [camel-core-2.8.3.jar:2.8.3]
>>>      at 
>>> org.apache.camel.processor.DefaultChannel.process(DefaultChannel.java:306) 
>>> [camel-core-2.8.3.jar:2.8.3]
>>>      at 
>>> org.apache.camel.processor.UnitOfWorkProcessor.process(UnitOfWorkProcessor.java:111)
>>>  [camel-core-2.8.3.jar:2.8.3]
>>>      at 
>>> org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:78)
>>>  [camel-core-2.8.3.jar:2.8.3]
>>>      at 
>>> org.apache.camel.processor.DelegateAsyncProcessor.processNext(DelegateAsyncProcessor.java:98)
>>>  [camel-core-2.8.3.jar:2.8.3]
>>>      at 
>>> org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:89)
>>>  [camel-core-2.8.3.jar:2.8.3]
>>>      at 
>>> org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:69)
>>>  [camel-core-2.8.3.jar:2.8.3]
>>>      at 
>>> org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:78)
>>>  [camel-core-2.8.3.jar:2.8.3]
>>>      at 
>>> org.apache.camel.component.direct.DirectProducer.process(DirectProducer.java:61)
>>>  [camel-core-2.8.3.jar:2.8.3]
>>>      at 
>>> org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:78)
>>>  [camel-core-2.8.3.jar:2.8.3]
>>>      at 
>>> org.apache.camel.processor.SendProcessor$2.doInAsyncProducer(SendProcessor.java:114)
>>>  [camel-core-2.8.3.jar:2.8.3]
>>>      at 
>>> org.apache.camel.impl.ProducerCache.doInAsyncProducer(ProducerCache.java:284)
>>>  [camel-core-2.8.3.jar:2.8.3]
>>>      at 
>>> org.apache.camel.processor.SendProcessor.process(SendProcessor.java:109) 
>>> [camel-core-2.8.3.jar:2.8.3]
>>>      at 
>>> org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:78)
>>>  [camel-core-2.8.3.jar:2.8.3]
>>>      at 
>>> org.apache.camel.processor.DelegateAsyncProcessor.processNext(DelegateAsyncProcessor.java:98)
>>>  [camel-core-2.8.3.jar:2.8.3]
>>>      at 
>>> org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:89)
>>>  [camel-core-2.8.3.jar:2.8.3]
>>>      at 
>>> org.apache.camel.processor.interceptor.TraceInterceptor.process(TraceInterceptor.java:90)
>>>  [camel-core-2.8.3.jar:2.8.3]
>>>      at 
>>> org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:78)
>>>  [camel-core-2.8.3.jar:2.8.3]
>>>      at 
>>> org.apache.camel.processor.RedeliveryErrorHandler.processErrorHandler(RedeliveryErrorHandler.java:318)
>>>  [camel-core-2.8.3.jar:2.8.3]
>>>      at 
>>> org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:209)
>>>  [camel-core-2.8.3.jar:2.8.3]
>>>      at 
>>> org.apache.camel.processor.DefaultChannel.process(DefaultChannel.java:306) 
>>> [camel-core-2.8.3.jar:2.8.3]
>>>      at 
>>> org.apache.camel.processor.UnitOfWorkProcessor.process(UnitOfWorkProcessor.java:111)
>>>  [camel-core-2.8.3.jar:2.8.3]
>>>      at 
>>> org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:78)
>>>  [camel-core-2.8.3.jar:2.8.3]
>>>      at 
>>> org.apache.camel.processor.DelegateAsyncProcessor.processNext(DelegateAsyncProcessor.java:98)
>>>  [camel-core-2.8.3.jar:2.8.3]
>>>      at 
>>> org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:89)
>>>  [camel-core-2.8.3.jar:2.8.3]
>>>      at 
>>> org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:69)
>>>  [camel-core-2.8.3.jar:2.8.3]
>>>      at 
>>> org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:78)
>>>  [camel-core-2.8.3.jar:2.8.3]
>>>      at 
>>> org.apache.camel.component.direct.DirectProducer.process(DirectProducer.java:61)
>>>  [camel-core-2.8.3.jar:2.8.3]
>>>      at 
>>> org.apache.camel.processor.UnitOfWorkProcessor.processAsync(UnitOfWorkProcessor.java:139)
>>>  [camel-core-2.8.3.jar:2.8.3]
>>>      at 
>>> org.apache.camel.processor.UnitOfWorkProcessor.process(UnitOfWorkProcessor.java:106)
>>>  [camel-core-2.8.3.jar:2.8.3]
>>>      at 
>>> org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:104)
>>>  [camel-core-2.8.3.jar:2.8.3]
>>>      at 
>>> org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:85)
>>>  [camel-core-2.8.3.jar:2.8.3]
>>>      at 
>>> org.apache.camel.processor.UnitOfWorkProducer.process(UnitOfWorkProducer.java:63)
>>>  [camel-core-2.8.3.jar:2.8.3]
>>>      at 
>>> org.apache.camel.impl.ProducerCache$2.doInProducer(ProducerCache.java:351) 
>>> [camel-core-2.8.3.jar:2.8.3]
>>>      at 
>>> org.apache.camel.impl.ProducerCache$2.doInProducer(ProducerCache.java:323) 
>>> [camel-core-2.8.3.jar:2.8.3]
>>>      at 
>>> org.apache.camel.impl.ProducerCache.doInProducer(ProducerCache.java:222) 
>>> [camel-core-2.8.3.jar:2.8.3]
>>>      at 
>>> org.apache.camel.impl.ProducerCache.sendExchange(ProducerCache.java:323) 
>>> [camel-core-2.8.3.jar:2.8.3]
>>>      at org.apache.camel.impl.ProducerCache.send(ProducerCache.java:168) 
>>> [camel-core-2.8.3.jar:2.8.3]
>>>      at 
>>> org.apache.camel.impl.DefaultProducerTemplate.send(DefaultProducerTemplate.java:110)
>>>  [camel-core-2.8.3.jar:2.8.3]
>>>      at 
>>> org.apache.camel.impl.DefaultProducerTemplate.sendBody(DefaultProducerTemplate.java:123)
>>>  [camel-core-2.8.3.jar:2.8.3]
>>>      at 
>>> org.apache.camel.impl.DefaultProducerTemplate.sendBody(DefaultProducerTemplate.java:130)
>>>  [camel-core-2.8.3.jar:2.8.3]
>>>      at 
>>> BasicCamelTrial.showStackDepthForSimpleRoute(BasicCamelTrial.java:48) 
>>> [test-classes/:na]
>>> ... trimmed out test launcher ...
>>> </snip>
>>>
>>> I ran with a few other routes (a simple a ->  b) and a more complicated (a 
>>> ->  b ->  c) and it looks like each route adds 19 stack trace elements.  Is 
>>> this the expected behavior of camel by default?  Is there any way to 
>>> optimize the message flow for simple routes?
>>>
>>> --jason
>>>
>>>
>>>
>>
>>
>> --
>> Willem
>> ----------------------------------
>> FuseSource
>> Web: http://www.fusesource.com
>> Blog:    http://willemjiang.blogspot.com (English)
>>         http://jnn.javaeye.com (Chinese)
>> Twitter: willemjiang
>> Weibo: willemjiang
>



-- 
Claus Ibsen
-----------------
FuseSource
Email: [email protected]
Web: http://fusesource.com
Twitter: davsclaus, fusenews
Blog: http://davsclaus.blogspot.com/
Author of Camel in Action: http://www.manning.com/ibsen/

Reply via email to