Repository: qpid-jms Updated Branches: refs/heads/master 2da24883d -> 26ec26863
QPIDJMS-438 Ensure that closed sessions are removed from tracking When a session is remotely closed it can be left in the Connection tracking map which can lead to large leaks of remotely closed sessions over time. Ensure it is removed on shutdown calls. Project: http://git-wip-us.apache.org/repos/asf/qpid-jms/repo Commit: http://git-wip-us.apache.org/repos/asf/qpid-jms/commit/26ec2686 Tree: http://git-wip-us.apache.org/repos/asf/qpid-jms/tree/26ec2686 Diff: http://git-wip-us.apache.org/repos/asf/qpid-jms/diff/26ec2686 Branch: refs/heads/master Commit: 26ec26863410ddf11097054987764b93567a4663 Parents: 2da2488 Author: Timothy Bish <[email protected]> Authored: Wed Dec 12 12:32:17 2018 -0500 Committer: Timothy Bish <[email protected]> Committed: Wed Dec 12 12:32:56 2018 -0500 ---------------------------------------------------------------------- .../java/org/apache/qpid/jms/JmsSession.java | 49 +++++++++++--------- 1 file changed, 26 insertions(+), 23 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/qpid-jms/blob/26ec2686/qpid-jms-client/src/main/java/org/apache/qpid/jms/JmsSession.java ---------------------------------------------------------------------- diff --git a/qpid-jms-client/src/main/java/org/apache/qpid/jms/JmsSession.java b/qpid-jms-client/src/main/java/org/apache/qpid/jms/JmsSession.java index 0970a6d..ea70544 100644 --- a/qpid-jms-client/src/main/java/org/apache/qpid/jms/JmsSession.java +++ b/qpid-jms-client/src/main/java/org/apache/qpid/jms/JmsSession.java @@ -305,7 +305,6 @@ public class JmsSession implements AutoCloseable, Session, QueueSession, TopicSe connection.destroyResource(sessionInfo); } catch (JmsConnectionFailedException jmsex) { } - connection.removeSession(sessionInfo); if (interrupted) { Thread.currentThread().interrupt(); } @@ -328,34 +327,38 @@ public class JmsSession implements AutoCloseable, Session, QueueSession, TopicSe protected void shutdown(Throwable cause) throws JMSException { if (closed.compareAndSet(false, true)) { - sessionInfo.setState(ResourceState.CLOSED); - setFailureCause(cause); - stop(); + try { + sessionInfo.setState(ResourceState.CLOSED); + setFailureCause(cause); + stop(); - for (JmsMessageConsumer consumer : new ArrayList<JmsMessageConsumer>(this.consumers.values())) { - consumer.shutdown(cause); - } + for (JmsMessageConsumer consumer : new ArrayList<JmsMessageConsumer>(this.consumers.values())) { + consumer.shutdown(cause); + } - for (JmsMessageProducer producer : new ArrayList<JmsMessageProducer>(this.producers.values())) { - producer.shutdown(cause); - } + for (JmsMessageProducer producer : new ArrayList<JmsMessageProducer>(this.producers.values())) { + producer.shutdown(cause); + } - transactionContext.shutdown(); + transactionContext.shutdown(); - // Ensure that no asynchronous completion sends remain blocked after close. - synchronized (sessionInfo) { - if (cause == null) { - cause = new JMSException("Session closed remotely before message transfer result was notified"); - } + // Ensure that no asynchronous completion sends remain blocked after close. + synchronized (sessionInfo) { + if (cause == null) { + cause = new JMSException("Session closed remotely before message transfer result was notified"); + } - getCompletionExecutor().execute(new FailOrCompleteAsyncCompletionsTask(JmsExceptionSupport.create(cause))); - getCompletionExecutor().shutdown(); - } + getCompletionExecutor().execute(new FailOrCompleteAsyncCompletionsTask(JmsExceptionSupport.create(cause))); + getCompletionExecutor().shutdown(); + } - try { - getCompletionExecutor().awaitTermination(connection.getCloseTimeout(), TimeUnit.MILLISECONDS); - } catch (InterruptedException e) { - LOG.trace("Session close awaiting send completions was interrupted"); + try { + getCompletionExecutor().awaitTermination(connection.getCloseTimeout(), TimeUnit.MILLISECONDS); + } catch (InterruptedException e) { + LOG.trace("Session close awaiting send completions was interrupted"); + } + } finally { + connection.removeSession(sessionInfo); } } } --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
