diff options
author | Rajith Muditha Attapattu <rajith@apache.org> | 2012-06-18 14:50:19 +0000 |
---|---|---|
committer | Rajith Muditha Attapattu <rajith@apache.org> | 2012-06-18 14:50:19 +0000 |
commit | 369f30ef78e238b16999a031c3edfbf74df2e0eb (patch) | |
tree | 993a6ddabbeae3b1ff43b8d0313269f933d7efb7 | |
parent | 3cf0f66f3f91f7edea861d8334c16bf328587e8d (diff) | |
download | qpid-python-369f30ef78e238b16999a031c3edfbf74df2e0eb.tar.gz |
QPID-4027 Added unregister methods for session, sender and receivers.
git-svn-id: https://svn.apache.org/repos/asf/qpid/branches/address-refactor2@1351372 13f79535-47bb-0310-9956-ffa450edef68
6 files changed, 64 insertions, 6 deletions
diff --git a/qpid/java/client-api/src/main/java/org/apache/qpid/messaging/internal/ConnectionInternal.java b/qpid/java/client-api/src/main/java/org/apache/qpid/messaging/internal/ConnectionInternal.java index 2e964b3ad7..780c5a4e0b 100644 --- a/qpid/java/client-api/src/main/java/org/apache/qpid/messaging/internal/ConnectionInternal.java +++ b/qpid/java/client-api/src/main/java/org/apache/qpid/messaging/internal/ConnectionInternal.java @@ -39,6 +39,8 @@ public interface ConnectionInternal extends Connection public void recreate() throws MessagingException; + public void unregisterSession(SessionInternal sesion); + /** * The per connection lock that is used by the connection * and it's child objects. A single lock is used to prevent diff --git a/qpid/java/client-api/src/main/java/org/apache/qpid/messaging/internal/SessionInternal.java b/qpid/java/client-api/src/main/java/org/apache/qpid/messaging/internal/SessionInternal.java index cee3a31c0e..7187bc928d 100644 --- a/qpid/java/client-api/src/main/java/org/apache/qpid/messaging/internal/SessionInternal.java +++ b/qpid/java/client-api/src/main/java/org/apache/qpid/messaging/internal/SessionInternal.java @@ -27,4 +27,10 @@ public interface SessionInternal extends Session public void exception(MessagingException e); public void recreate() throws MessagingException; + + public String getName(); + + public void unregisterReceiver(ReceiverInternal receiver); + + public void unregisterSender(SenderInternal sender); } diff --git a/qpid/java/client-api/src/main/java/org/apache/qpid/messaging/util/ConnectionManagementDecorator.java b/qpid/java/client-api/src/main/java/org/apache/qpid/messaging/util/ConnectionManagementDecorator.java index 6e7d4bed31..ccc216e7af 100644 --- a/qpid/java/client-api/src/main/java/org/apache/qpid/messaging/util/ConnectionManagementDecorator.java +++ b/qpid/java/client-api/src/main/java/org/apache/qpid/messaging/util/ConnectionManagementDecorator.java @@ -119,7 +119,14 @@ public class ConnectionManagementDecorator implements ConnectionInternal _state = ConnectionState.CLOSED; for (Session ssn : _sessions.values()) { - ssn.close(); + try + { + ssn.close(); + } + catch (Exception e) + { + _logger.warn("Error closing session",e); + } } _sessions.clear(); @@ -138,7 +145,7 @@ public class ConnectionManagementDecorator implements ConnectionInternal try { if (name == null || name.isEmpty()) { name = generateSessionName(); } - SessionInternal ssn = new SessionManagementDecorator(this,_delegate.createSession(name)); + SessionInternal ssn = new SessionManagementDecorator(this,name,_delegate.createSession(name)); _sessions.put(name, ssn); return ssn; } @@ -159,7 +166,7 @@ public class ConnectionManagementDecorator implements ConnectionInternal try { if (name == null || name.isEmpty()) { name = generateSessionName(); } - SessionInternal ssn = new SessionManagementDecorator(this,_delegate.createTransactionalSession(name)); + SessionInternal ssn = new SessionManagementDecorator(this,name,_delegate.createTransactionalSession(name)); _sessions.put(name, ssn); return ssn; } @@ -213,6 +220,12 @@ public class ConnectionManagementDecorator implements ConnectionInternal return new ArrayList<SessionInternal>(_sessions.values()); } + @Override + public void unregisterSession(SessionInternal ssn) + { + _sessions.remove(ssn.getName()); + } + @Override // Called by the delegate or a a session created by this connection. public void exception(ConnectionException e) { diff --git a/qpid/java/client-api/src/main/java/org/apache/qpid/messaging/util/ReceiverManagementDecorator.java b/qpid/java/client-api/src/main/java/org/apache/qpid/messaging/util/ReceiverManagementDecorator.java index 6d75f06c15..a4e545e6f0 100644 --- a/qpid/java/client-api/src/main/java/org/apache/qpid/messaging/util/ReceiverManagementDecorator.java +++ b/qpid/java/client-api/src/main/java/org/apache/qpid/messaging/util/ReceiverManagementDecorator.java @@ -170,6 +170,7 @@ public class ReceiverManagementDecorator implements ReceiverInternal { _state = ReceiverState.CLOSED; _delegate.close(); + _ssn.unregisterReceiver(this); } } diff --git a/qpid/java/client-api/src/main/java/org/apache/qpid/messaging/util/SenderManagementDecorator.java b/qpid/java/client-api/src/main/java/org/apache/qpid/messaging/util/SenderManagementDecorator.java index 8bb1c9d6e3..14bd8f3b15 100644 --- a/qpid/java/client-api/src/main/java/org/apache/qpid/messaging/util/SenderManagementDecorator.java +++ b/qpid/java/client-api/src/main/java/org/apache/qpid/messaging/util/SenderManagementDecorator.java @@ -64,6 +64,7 @@ public class SenderManagementDecorator implements SenderInternal { _state = SenderState.CLOSED; _delegate.close(); + _ssn.unregisterSender(this); } } diff --git a/qpid/java/client-api/src/main/java/org/apache/qpid/messaging/util/SessionManagementDecorator.java b/qpid/java/client-api/src/main/java/org/apache/qpid/messaging/util/SessionManagementDecorator.java index f35589901b..1422be7207 100644 --- a/qpid/java/client-api/src/main/java/org/apache/qpid/messaging/util/SessionManagementDecorator.java +++ b/qpid/java/client-api/src/main/java/org/apache/qpid/messaging/util/SessionManagementDecorator.java @@ -83,15 +83,17 @@ public class SessionManagementDecorator implements SessionInternal private ConnectionInternal _conn; private Session _delegate; + private String _name; SessionState _state = SessionState.OPENED; private List<ReceiverInternal> _receivers = new ArrayList<ReceiverInternal>(); private List<SenderInternal> _senders = new ArrayList<SenderInternal>(); private final Object _connectionLock; // global per connection lock - public SessionManagementDecorator(ConnectionInternal conn, Session delegate) + public SessionManagementDecorator(ConnectionInternal conn, String name, Session delegate) { _conn = conn; _delegate = delegate; + _name = name; _connectionLock = conn.getConnectionLock(); } @@ -110,16 +112,31 @@ public class SessionManagementDecorator implements SessionInternal _state = SessionState.CLOSED; for (Sender sender: _senders) { - sender.close(); + try + { + sender.close(); + } + catch (Exception e) + { + _logger.warn("Error closing sender", e); + } } _senders.clear(); for (Receiver receiver: _receivers) { - receiver.close(); + try + { + receiver.close(); + } + catch (Exception e) + { + _logger.warn("Error closing receiver", e); + } } _receivers.clear(); _delegate.close(); + _conn.unregisterSession(this); } } @@ -442,6 +459,24 @@ public class SessionManagementDecorator implements SessionInternal return _conn; } + @Override + public String getName() + { + return _name; + } + + @Override + public void unregisterReceiver(ReceiverInternal receiver) + { + _receivers.remove(receiver); + } + + @Override + public void unregisterSender(SenderInternal sender) + { + _senders.remove(sender); + } + private void checkClosedAndThrowException() throws SessionException { checkClosedAndThrowException("Session is closed. You cannot invoke methods on a closed sesion"); |