camel-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Ilya S <devmailboxl...@gmail.com>
Subject Re: Graceful shutdown of Camel-Jetty component. (Camel 2.2.0)
Date Thu, 15 Apr 2010 15:39:06 GMT
Let me add that I see around 5-6 inflight exchanges in the jconsole
(via JMX) before I hit stop(). So there are exchanges, but the log
statements say there are none..

Thanks again,

Ilya

On Thu, Apr 15, 2010 at 8:37 AM, Ilya S <devmailboxlive@gmail.com> wrote:
> Here is my full route:
>
>
>        from("jetty:http://0.0.0.0:8686/hello")
>        .process(new Processor() {
>                        public void process(Exchange exchange) throws Exception
{
>
>                                String body = exchange.getIn().getBody(String.class);
>                                Integer ii = Integer.parseInt(body);
>
>                                System.out.println("About to process:
" + ii);
>                                System.out.println("Sending to numbers2
queue to wait...");
>
>                                exchange.getOut().setBody(ii);
>                        }
>                })
>                .to("jms:queue:numbers2?requestTimeout=50000")
>                .process(new Processor() {
>                        public void process(Exchange exchange) throws Exception
{
>                                Integer ii = exchange.getIn().getBody(Integer.class);
>                                System.out.println("Back to processing
of: " + ii);
>                                exchange.getOut().setBody(ii);
>                        }
>                })
>        .to("multiplier");
>
>
> The other queue (jms:queue:numbers2) is a part of another route (in
> another Camel context):
>
>        from("jms:queue:numbers2")
>                .process(new Processor() {
>                        public void process(Exchange exchange) throws Exception
{
>                                int sleepTime = (int)(Math.random()*25000);
>                                System.out.println("Received from numbers2....Going
to sleep now
> for " + sleepTime/1000 + " seconds");
>                                Thread.sleep(sleepTime);
>
>                                Message in = exchange.getIn();
>                                exchange.getOut().setBody(in.getBody());
>                        }
>                });
>
>
>
> I initiate the shutdown on the first Camel Context via JMX. If I
> remove the http component, and only use JMS components, the shutdown
> works just fine. With all the INFO messages about waiting for inflight
> exchanges to finish printed.
> As soon as I add Jetty, and initiate a stop() call, I'm getting the
> following output in the logs:
>
> Back to processing of: 1
> About to process: 2
> Sending to numbers2 queue to wait...
> Back to processing of: 2
> About to process: 3
> Sending to numbers2 queue to wait...
> Back to processing of: 2
> About to process: 3
> Sending to numbers2 queue to wait...
> [CP Connection(4)-10.58.123.154] DefaultCamelContext            INFO
> Apache Camel 2.2.0 (CamelContext:camel) is stopping
> [CP Connection(4)-10.58.123.154] DefaultShutdownStrategy        INFO
> Starting to graceful shutdown routes (timeout 300 seconds)
> [        6718343@qtp-21758581-2] DefaultErrorHandler            ERROR
> Failed delivery for exchangeId: b5e983a8-4777-4db5-997c-3e4daf17c13e.
> On delivery attempt: 0 caught:
> org.apache.camel.ExchangeTimedOutException: The OUT message was not
> received within: 50000 millis. Exchange[Message: 1]
> [       16889166@qtp-21758581-5] DefaultErrorHandler            ERROR
> Failed delivery for exchangeId: b6653535-c32c-49c6-af6f-89fc0d58bbcf.
> Exhausted after delivery attempt: 1 caught:
> org.apache.camel.ExchangeTimedOutException: The OUT message was not
> received within: 50000 millis. Exchange[Message: 2]
> org.apache.camel.ExchangeTimedOutException: The OUT message was not
> received within: 50000 millis. Exchange[Message: 2]
>        at org.apache.camel.component.jms.JmsProducer.processInOut(JmsProducer.java:265)
>        at org.apache.camel.component.jms.JmsProducer.process(JmsProducer.java:147)
>        at org.apache.camel.processor.SendProcessor$1.doInProducer(SendProcessor.java:97)
>        at org.apache.camel.processor.SendProcessor$1.doInProducer(SendProcessor.java:95)
>        at org.apache.camel.impl.ProducerCache.doInProducer(ProducerCache.java:146)
>        at org.apache.camel.processor.SendProcessor.doProcess(SendProcessor.java:94)
>        at org.apache.camel.processor.SendProcessor.process(SendProcessor.java:82)
>        at org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:67)
>        at org.apache.camel.processor.DelegateProcessor.processNext(DelegateProcessor.java:53)
>        at org.apache.camel.processor.DelegateProcessor.proceed(DelegateProcessor.java:82)
>        at org.apache.camel.processor.interceptor.TraceInterceptor.process(TraceInterceptor.java:93)
>        at org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:67)
>        at org.apache.camel.processor.RedeliveryErrorHandler.processExchange(RedeliveryErrorHandler.java:177)
>        at org.apache.camel.processor.RedeliveryErrorHandler.processErrorHandler(RedeliveryErrorHandler.java:143)
>        at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:88)
>        at org.apache.camel.processor.DefaultErrorHandler.process(DefaultErrorHandler.java:49)
>        at org.apache.camel.processor.DefaultChannel.process(DefaultChannel.java:228)
>        at org.apache.camel.processor.Pipeline.process(Pipeline.java:74)
>        at org.apache.camel.processor.UnitOfWorkProcessor.processNext(UnitOfWorkProcessor.java:66)
>        at org.apache.camel.processor.DelegateProcessor.process(DelegateProcessor.java:48)
>        at org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:67)
>        at org.apache.camel.component.http.CamelServlet.service(CamelServlet.java:53)
>        at javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
>        at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
>        at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:390)
>        at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
>        at org.mortbay.jetty.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:230)
>        at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
>        at org.mortbay.jetty.Server.handle(Server.java:326)
>        at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
>        at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:938)
>        at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:755)
>        at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:218)
>        at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
>        at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:409)
>        at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582)
> [       19538521@qtp-21758581-4] DefaultErrorHandler            ERROR
> Failed delivery for exchangeId: c5090377-e834-4b79-9b47-2512080c0632.
> Exhausted after delivery attempt: 1 caught:
> org.apache.camel.ExchangeTimedOutException: The OUT message was not
> received within: 50000 millis. Exchange[Message: 3]
> org.apache.camel.ExchangeTimedOutException: The OUT message was not
> received within: 50000 millis. Exchange[Message: 3]
>        at org.apache.camel.component.jms.JmsProducer.processInOut(JmsProducer.java:265)
>        at org.apache.camel.component.jms.JmsProducer.process(JmsProducer.java:147)
>        at org.apache.camel.processor.SendProcessor$1.doInProducer(SendProcessor.java:97)
>        at org.apache.camel.processor.SendProcessor$1.doInProducer(SendProcessor.java:95)
>        at org.apache.camel.impl.ProducerCache.doInProducer(ProducerCache.java:146)
>        at org.apache.camel.processor.SendProcessor.doProcess(SendProcessor.java:94)
>        at org.apache.camel.processor.SendProcessor.process(SendProcessor.java:82)
>        at org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:67)
>        at org.apache.camel.processor.DelegateProcessor.processNext(DelegateProcessor.java:53)
>        at org.apache.camel.processor.DelegateProcessor.proceed(DelegateProcessor.java:82)
>        at org.apache.camel.processor.interceptor.TraceInterceptor.process(TraceInterceptor.java:93)
>        at org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:67)
>        at org.apache.camel.processor.RedeliveryErrorHandler.processExchange(RedeliveryErrorHandler.java:177)
>        at org.apache.camel.processor.RedeliveryErrorHandler.processErrorHandler(RedeliveryErrorHandler.java:143)
>        at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:88)
>        at org.apache.camel.processor.DefaultErrorHandler.process(DefaultErrorHandler.java:49)
>        at org.apache.camel.processor.DefaultChannel.process(DefaultChannel.java:228)
>        at org.apache.camel.processor.Pipeline.process(Pipeline.java:74)
>        at org.apache.camel.processor.UnitOfWorkProcessor.processNext(UnitOfWorkProcessor.java:66)
>        at org.apache.camel.processor.DelegateProcessor.process(DelegateProcessor.java:48)
>        at org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:67)
>        at org.apache.camel.component.http.CamelServlet.service(CamelServlet.java:53)
>        at javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
>        at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
>        at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:390)
>        at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
>        at org.mortbay.jetty.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:230)
>        at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
>        at org.mortbay.jetty.Server.handle(Server.java:326)
>        at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
>        at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:938)
>        at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:755)
>        at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:218)
>        at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
>        at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:409)
>        at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582)
> [ Camel thread 11: ShutdownTask] DefaultShutdownStrategy        INFO
> Route: route1 shutdown complete.
> [CP Connection(4)-10.58.123.154] DefaultShutdownStrategy        INFO
> Graceful shutdown of routes completed in 0 seconds
> [CP Connection(4)-10.58.123.154] DefaultInflightRepository      INFO
> Shutting down with no inflight exchanges.
> [CP Connection(4)-10.58.123.154] DefaultCamelContext            INFO
> Apache Camel 2.2.0 (CamelContext:camel) stopped
>
>
> I tried to fix this by extending JettyHttpComponent and overriding
> createServer method as follows:
>
>        @Override
>        protected Server createServer() throws Exception {
>         Server server = super.createServer();
>         server.setGracefulShutdown(50000);
>         server.setStopAtShutdown(true);
>
>         return server;
>        }
>
> This seemed to work, but I'm not sure if that's the right approach.
>
>
> Any help is greatly appreciated.
>
> Thanks,
> Ilya.
>
>
>
> On Thu, Apr 15, 2010 at 2:17 AM, Claus Ibsen <claus.ibsen@gmail.com> wrote:
>> Hi
>>
>> All the unit tests run with graceful shutdown by default, and all unit
>> tests with camel-jetty shut down with no issues.
>>
>> The in flight repository do keep track of all in flights. I can only
>> think of if you use the aggregator or some custom code which
>> can cause the exchange to be completed in Camels point of view.
>>
>> Can you post your entire route?
>>
>> And as always report which version of Camel you are using? And try
>> with the latest stable and even with 2.3-SNAPSHOT.
>>
>>
>> On Wed, Apr 14, 2010 at 7:41 PM, Ilya S <devmailboxlive@gmail.com> wrote:
>>> Hi All,
>>>
>>> Fist of all, thank you for this great product!
>>> Every new release brings excellent new features just in time.
>>>
>>> I'm currently investigating Graceful Shutdown feature, and I'm am
>>> wondering if graceful shutdown is supported for Camel-Jetty component?
>>> I was able to successfully shut down JMS component. However,
>>> JettyHttpCoponent seems to have issues when shutting down.
>>>
>>> In my simple test (adopted from camel-example-spring-jms:ServerRoute
>>> example) I have a simple route that looks like this:
>>>
>>> from("jetty:http://0.0.0.0:8686/hello")
>>> ..
>>> .. do work
>>> ...
>>> .to("jms:queue:numbers2?requestTimeout=50000")
>>> .to("multiplier");
>>>
>>>
>>> My producers simply send numbers to http endpoint..
>>>
>>>
>>> When I shutdown this context gracefully I'm getting all sort of
>>> exceptions from Jetty, and the context does not seem to wait until
>>> inflight exchanges have finished.
>>> I'm using the defaults everywhere (e.g. default shutdown strategy).
>>>
>>> Is shutdown supported for Jetty, and if so how should one configure
>>> jetty to initiate proper shutdown?
>>>
>>> Thank you,
>>>
>>> Ilya.
>>>
>>
>>
>>
>> --
>> Claus Ibsen
>> Apache Camel Committer
>>
>> Author of Camel in Action: http://www.manning.com/ibsen/
>> Open Source Integration: http://fusesource.com
>> Blog: http://davsclaus.blogspot.com/
>> Twitter: http://twitter.com/davsclaus
>>
>

Mime
View raw message