You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@camel.apache.org by "Claus Ibsen (JIRA)" <ji...@apache.org> on 2016/05/24 07:04:12 UTC

[jira] [Updated] (CAMEL-9984) RabbitConsumer.stop() doesn't stop underlying AutorecoveringConnection obtained from supplied ConnectionFactory

     [ https://issues.apache.org/jira/browse/CAMEL-9984?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Claus Ibsen updated CAMEL-9984:
-------------------------------
    Fix Version/s: 2.18.0
                   2.17.2

> RabbitConsumer.stop() doesn't stop underlying AutorecoveringConnection obtained from supplied ConnectionFactory
> ---------------------------------------------------------------------------------------------------------------
>
>                 Key: CAMEL-9984
>                 URL: https://issues.apache.org/jira/browse/CAMEL-9984
>             Project: Camel
>          Issue Type: Bug
>          Components: camel-rabbitmq
>    Affects Versions: 2.17.1
>            Reporter: Darrell King
>            Priority: Minor
>             Fix For: 2.17.2, 2.18.0
>
>
> If I have a ConnectionFactory defined as:
> {code:borderStyle=solid}
> ConnectionFactory connectionFactory = new ConnectionFactory();
> connectionFactory.setAutomaticRecoveryEnabled(true);
> connectionFactory.setUsername(username);
> connectionFactory.setPassword(password);
> {code}
> And a Camel route defined like:
> {code:borderStyle=solid}
> rabbitmq://localhost:5672/MyExchange?connectionFactory=#connectionFactory&exchangeType=direct&queue=MyQueue&routingKey=MyRoutingKey
> {code}
> Performing these steps:
> * Start my application and it connects to Rabbit and consumes messages
> * Shutdown the RabbbitMQ server
> * Shutdown my Camel application
> The application doesn't stop fully because the automatic recovery mechanism has background threads running. It carries on indefinately logging messages like:
> {code:borderStyle=solid}
> 	at com.rabbitmq.client.impl.AMQChannel.wrap(AMQChannel.java:106)
> 	at com.rabbitmq.client.impl.AMQChannel.wrap(AMQChannel.java:102)
> 	at com.rabbitmq.client.impl.AMQConnection.start(AMQConnection.java:350)
> 	at com.rabbitmq.client.impl.recovery.RecoveryAwareAMQConnectionFactory.newConnection(RecoveryAwareAMQConnectionFactory.java:37)
> 	at com.rabbitmq.client.impl.recovery.AutorecoveringConnection.recoverConnection(AutorecoveringConnection.java:476)
> 	at com.rabbitmq.client.impl.recovery.AutorecoveringConnection.beginAutomaticRecovery(AutorecoveringConnection.java:444)
> 	at com.rabbitmq.client.impl.recovery.AutorecoveringConnection.access$000(AutorecoveringConnection.java:53)
> 	at com.rabbitmq.client.impl.recovery.AutorecoveringConnection$1.shutdownCompleted(AutorecoveringConnection.java:383)
> 	at com.rabbitmq.client.impl.ShutdownNotifierComponent.notifyListeners(ShutdownNotifierComponent.java:75)
> 	at com.rabbitmq.client.impl.AMQConnection$MainLoop.run(AMQConnection.java:578)
> {code}
> Looking at org.apache.camel.component.rabbitmq.RabbitConsumer.stop()
> {code:borderStyle=solid}
>     public void stop() throws IOException, TimeoutException {
>         stopping = true;
>         if (channel == null) {
>             return;
>         }
>         channel.basicCancel(tag);
>         try {
>             channel.close();
>         } catch (TimeoutException e) {
>             log.error("Timeout occured");
>             throw e;
>         }
>     }
> {code}
> The calls to channel.basicCancel(tag) and channel.close() both throw com.rabbitmq.client.AlreadyClosedException when the server has closed the connection which stops the automatic recovery thread from being halted. Checking whether the channel is open before the calls to channel.basicCancel(tag) and channel.close() seems to fix the issue.
> {code:borderStyle=solid}
>     public void stop() throws IOException, TimeoutException {
>         stopping = true;
>         if (channel == null) {
>             return;
>         }
>         if (tag != null && isChannelOpen()) {
>             channel.basicCancel(tag);
>         }
>         try {
>             if (isChannelOpen()) {
>                 channel.close();
>             }
>         } catch (TimeoutException e) {
>             log.error("Timeout occured");
>             throw e;
>         }
>     }
> {code}
> I'll submit a PR later



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)