Hi!

I've run into a problem with camel-quartz2 (at least on 2.13.2 and 2.15.2)
cron scheduling and AsyncDelayedDelivery-option in the DefaultErrorHandler.
If I want to shutdown/restart routes during DefaultErrorHandlers
redeliveries quartz scheduling gets deadlocked and quietly fails all future
fire times. Without AsyncDelayedDelivery-option this problem does not occur.
I'm running my routes in bundles in Karaf 3.0.3 but the problem also occurs
when running the code on jvm (at least on 1.7) without Karaf.

I have configured quite long redelivery times for my routes (e.g. 8 times in
2 hour interval) but at times I would need to be able to restart bundles
running in Karaf even when there would be redeliveries still left (e.g. when
installing new version of the bundle).

This seems like a bug to me but what's your take on this? I've attached few
lines of log and some example route code to the end of this message.

Best regards,
- Jussi



Logs on org.quartz debug level show every few seconds:
[artzScheduler-camel-1_Worker-2] SimpleThreadPool               DEBUG
Waiting for thread DefaultQuartzScheduler-camel-1_Worker-2 to shut down

and jstack shows for DefaultQuartzScheduler-camel-1_Worker-2:
"DefaultQuartzScheduler-camel-1_Worker-2" prio=10 tid=0x00007fd2f8201000
nid=0x2a16 in Object.wait() [0x00007fd3039dc000]
   java.lang.Thread.State: TIMED_WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        - waiting on <0x00000007ae410420> (a java.lang.Object)
        at org.quartz.simpl.SimpleThreadPool.shutdown(SimpleThreadPool.java:371)
        - locked <0x00000007ae410420> (a java.lang.Object)
        at org.quartz.core.QuartzScheduler.shutdown(QuartzScheduler.java:740)
        at org.quartz.impl.StdScheduler.shutdown(StdScheduler.java:206)
        at
org.apache.camel.component.quartz2.QuartzComponent.doStop(QuartzComponent.java:352)
        at org.apache.camel.support.ServiceSupport.stop(ServiceSupport.java:102)
        at 
org.apache.camel.util.ServiceHelper.stopService(ServiceHelper.java:141)
        at
org.apache.camel.util.ServiceHelper.stopAndShutdownService(ServiceHelper.java:204)
        at
org.apache.camel.impl.DefaultCamelContext.shutdownServices(DefaultCamelContext.java:2827)
        at
org.apache.camel.impl.DefaultCamelContext.shutdownServices(DefaultCamelContext.java:2852)
        at
org.apache.camel.impl.DefaultCamelContext.shutdownServices(DefaultCamelContext.java:2840)
        at
org.apache.camel.impl.DefaultCamelContext.doStop(DefaultCamelContext.java:2704)
        - locked <0x00000007ad1abd88> (a 
org.apache.camel.impl.DefaultCamelContext)
        at org.apache.camel.support.ServiceSupport.stop(ServiceSupport.java:102)
        at
com.example.route.MyAsyncDelayedDeliveryTesting$1.process(MyAsyncDelayedDeliveryTesting.java:43)
        at
org.apache.camel.processor.DelegateSyncProcessor.process(DelegateSyncProcessor.java:63)
        at
org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:77)
        at
org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:448)
        at
org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:191)
        at
org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:191)
        at
org.apache.camel.processor.loadbalancer.QueueLoadBalancer.process(QueueLoadBalancer.java:44)
        at
org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:109)
        at
org.apache.camel.processor.loadbalancer.LoadBalancerSupport.process(LoadBalancerSupport.java:87)
        at org.apache.camel.component.quartz2.CamelJob.execute(CamelJob.java:56)
        at org.quartz.core.JobRunShell.run(JobRunShell.java:202)
        at
org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573)
        - locked <0x00000007ae539450> (a java.lang.Object)


Example of this situation looks like this:

package com.example.route;

import static org.apache.camel.LoggingLevel.ERROR;
import static org.apache.camel.LoggingLevel.WARN;

import org.apache.camel.Exchange;
import org.apache.camel.Processor;
import org.apache.camel.builder.RouteBuilder;
import org.joda.time.DateTime;

public class MyAsyncDelayedDeliveryTesting extends RouteBuilder {
        
                
        @Override
        public void configure() throws Exception {

                // Set lower timeout for convenience (default 300 seconds).
                getContext().getShutdownStrategy().setTimeout(10);

                // Start some route1 cron scheduled.
                DateTime now = DateTime.now().plusSeconds(2);
                from("quartz2://my_route_quartz_timer?cron="
                                +now.getSecondOfMinute()+"+"
                                +now.getMinuteOfHour()+"+"
                                +now.getHourOfDay()+"+*+*+?")
                .id("scheduling1")
                .to("direct://my-route");
                
                
                // Start other route that shutdowns the context thus shutting 
down the
route1.
                // Simulate the situation where you want to restart your route 
when there
are still
                // ongoing redelivery tasks.
                now = DateTime.now().plusSeconds(4);
                from("quartz2://my_shutdown_route_quartz_timer?cron="
                                +now.getSecondOfMinute()+"+"
                                +now.getMinuteOfHour()+"+"
                                +now.getHourOfDay()+"+*+*+?")
                .id("scheduling2")
                .process(new Processor() {
                        
                        @Override
                        public void process(Exchange arg0) throws Exception {
                                getContext().stop();
                                
                        }
                });
                
                // Do some logic that causes exception and redeliveries for 1 
minute.
                from("direct://my-route")
                .id("route1")
                .errorHandler(defaultErrorHandler()
                        .maximumRedeliveries(10)
                        .redeliveryDelay(1000*6)
                        // asyncDelayedRedelivery causes the problem. 
                        .asyncDelayedRedelivery()
                        .retryAttemptedLogLevel(WARN)
                        .retriesExhaustedLogLevel(ERROR))

                .process(new Processor() {
                        
                        @Override
                        public void process(Exchange exchange) throws Exception 
{
                                throw new RuntimeException("Error");
                        }
                });     
        }
}

Full example is visible here:
https://github.com/jnupponen/camel-quartz2-asyncDelayedDelivery-problem



--
View this message in context: 
http://camel.465427.n5.nabble.com/Quartz2-problem-with-AsyncDelayedDelivery-tp5769210.html
Sent from the Camel - Users mailing list archive at Nabble.com.

Reply via email to