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)
[ 6718...@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]
[ 16889...@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)
[ 19538...@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 <[email protected]> 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 <[email protected]> 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
>