From 1ca43e387564d7b43f04c20b4372eaa470de910c Mon Sep 17 00:00:00 2001 From: Robert Godfrey Date: Thu, 24 Oct 2013 12:50:48 +0000 Subject: QPID-5206 : Applied patch from David Ingham git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1535365 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/qpid/amqp_1_0/jms/impl/SessionImpl.java | 4 +++- .../apache/qpid/amqp_1_0/transport/LinkEndpoint.java | 17 ++++++++++------- .../apache/qpid/amqp_1_0/transport/SessionEndpoint.java | 9 ++++++++- 3 files changed, 21 insertions(+), 9 deletions(-) diff --git a/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/SessionImpl.java b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/SessionImpl.java index c64b39c5a4..75243d1c43 100644 --- a/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/SessionImpl.java +++ b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/SessionImpl.java @@ -921,7 +921,9 @@ public class SessionImpl implements Session, QueueSession, TopicSession consumers.remove(); try { - _connection.getExceptionListener().onException(e); + ExceptionListener expListener = _connection.getExceptionListener(); + if (expListener != null) + expListener.onException(e); consumer.close(); } catch (JMSException e1) diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/LinkEndpoint.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/LinkEndpoint.java index 587d26026f..a89844afd4 100644 --- a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/LinkEndpoint.java +++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/LinkEndpoint.java @@ -395,14 +395,17 @@ public abstract class LinkEndpoint default: return; } + + if (getSession().getState() != SessionState.END_RECVD) + { + Detach detach = new Detach(); + detach.setHandle(getLocalHandle()); + if(close) + detach.setClosed(close); + detach.setError(error); - Detach detach = new Detach(); - detach.setHandle(getLocalHandle()); - if(close) - detach.setClosed(close); - detach.setError(error); - - getSession().sendDetach(detach); + getSession().sendDetach(detach); + } getLock().notifyAll(); } diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/SessionEndpoint.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/SessionEndpoint.java index 0ab2e1a9b7..7e72ce55a3 100644 --- a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/SessionEndpoint.java +++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/SessionEndpoint.java @@ -187,9 +187,16 @@ public class SessionEndpoint private void detachLinks() { Collection handles = new ArrayList(_remoteLinkEndpoints.keySet()); + Error error = new Error(); + error.setCondition(LinkError.DETACH_FORCED); + error.setDescription("Force detach the link because the session is remotely ended."); for(UnsignedInteger handle : handles) { - detach(handle, null); + Detach detach = new Detach(); + detach.setClosed(false); + detach.setHandle(handle); + detach.setError(error); + detach(handle, detach); } } -- cgit v1.2.1