Given that the code in question is in DefaultMessageListenerContainer
(Spring), I'd encourage you to post to their mailing list and/or submit a
bug report to them and see if maybe there's something for them to fix.
Setting the timeout sounds like a reasonable workaround, but it would be
good to have the code work properly at some point in the future...

Tim

On Wed, Sep 30, 2015 at 8:44 AM, Anna Maier <a.ma...@topdesk.com> wrote:

> Hi,
>
> I debugged a bit, and it looks like it never calls the shutdown method in
> PooledTaskRunner after all. It gets stuck in
> DefaultMessageListenerContainer.doShutdown() where it calls
> this.lifecycleMonitor.wait(). Apparently, this does not terminate. I am not
> sure if this is a bug in Camel, ActiveMQ or Spring, or if it is even
> intended behaviour.
>
> Anyway, setting the timeout to camel does the trick:
> camelContext.getShutdownStrategy().setTimeout(1L);
> Apparently the default for this is 5 minutes and I was never patient
> enough to wait so long. ;)
>
> Thanks for the help!
> Anna
>
>
> -----Original Message-----
> From: Ganesh Murthy [mailto:gmur...@redhat.com]
> Sent: Mittwoch, 30. September 2015 15:12
> To: users@activemq.apache.org
> Subject: Re: Problem shutting down activemq client with failover transport
>
> How is Camel setting the shutdown flag on the PooledTaskRunner? Is Camel
> calling the shutdown() function to shut it down? The shutdown() method
> (which in turn calls shutdown(0)) on PooledTaskRunner is guaranteed to shut
> it down because if shutdown is set to true, then iterating is set to false.
>
> Have you tried the "timeout" parameter in FailoverTransport?
>
> http://activemq.apache.org/failover-transport-reference.html
>
> If you are using an IDE like IntelliJ, try putting in breakpoints on only
> that PooledTaskRunner thread and analyze what is going on.
>
> Thanks.
>
> -----Original Message-----
> From: Ganesh Murthy [mailto:gmur...@redhat.com]
> Sent: Dienstag, 29. September 2015 16:52
> To: users@activemq.apache.org
> Subject: Re: Problem shutting down activemq client with failover transport
>
> Can you please provide a thread dump? That would throw some light on
> exactly what is going on.
>
> Thanks.
>
> ----- Original Message -----
> From: "Anna Maier" <a.ma...@topdesk.com>
> To: users@activemq.apache.org
> Sent: Tuesday, September 29, 2015 9:31:13 AM
> Subject: Problem shutting down activemq client with failover transport
>
> Hi,
>
>
>
> I am using Camel to connect to ActiveMQ and it fails to shutdown when the
> ActiveMQComponent cannot make a connection to the broker with the failover
> protocol (activemq version 5.12.0).
>
> The problem seems to be that the failover transport tries to connect to
> the broker in an endless loop on its own thread that cannot be interrupted.
> I think the problem is in the PooledTaskRunner: there is a shutdown field
> which is set to true when camel shuts down, but it appears as false to the
> thread that is running the endless loop.
>
>
>
> I am currently at a loss what to do. I want to keep the maximum retries
> setting for the failover transport on indefinite, since I do not know when
> the the broker is back online. At the same time, it has to be possible to
> shut down the application even if there never was a connection to the
> ActiveMQ broker.
>
>
>
> Has anybody seen this problem before and can give some advice? Is this a
> bug in ActiveMQ?
>
>
>
> Attached there is some code that reproduces the problem - it never
> terminates.
>
>
>
> Regards,
>
> Anna
>
>
>
> The code:
> public class ShutdownBug {
>
>      public static void main(String[] args) throws Exception {
>          DefaultCamelContext camelContext = new DefaultCamelContext();
>          ActiveMQComponent activeMQComponent = new ActiveMQComponent();
>           activeMQComponent.setBrokerURL("failover:(http://localhost:61616
> )");
>          camelContext.addComponent("activemq", activeMQComponent);
>          camelContext.addRoutes(new RouteBuilder() {
>               @Override
>               public void configure() {
>                    from("activemq:queue:myqueue").to("stream:out");
>               }
>          });
>          Thread startThread = new Thread(new Runnable() {
>               @Override
>               public void run() {
>                    try {
>                         camelContext.start();
>                    }
>                    catch (Exception e) {
>                         e.printStackTrace();
>                    }
>               }
>          });
>          startThread.start();
>          startThread.interrupt();
>          startThread.join();
>          camelContext.stop();
>      }
>
> }
>

Reply via email to