[
https://issues.apache.org/jira/browse/CAMEL-9984?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Claus Ibsen resolved CAMEL-9984.
--------------------------------
Resolution: Fixed
Assignee: Claus Ibsen
Thanks for the PR
> 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
> Assignee: Claus Ibsen
> 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)