diff options
author | Gordon Sim <gsim@apache.org> | 2010-01-22 10:58:20 +0000 |
---|---|---|
committer | Gordon Sim <gsim@apache.org> | 2010-01-22 10:58:20 +0000 |
commit | 578ab4e8631e778bfdbb4f88b030314471394d53 (patch) | |
tree | ee64e14b131d3dfb2a73e2045efcab7f28ef7bfa /cpp/src/qpid/broker/Queue.cpp | |
parent | af58f5140110d2d8da38773a1b13f6e288f8fa56 (diff) | |
download | qpid-python-578ab4e8631e778bfdbb4f88b030314471394d53.tar.gz |
QPID-2347: Signal deletion of queue to active subscribers via a resource-deleted exception.
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk/qpid@902055 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'cpp/src/qpid/broker/Queue.cpp')
-rw-r--r-- | cpp/src/qpid/broker/Queue.cpp | 22 |
1 files changed, 21 insertions, 1 deletions
diff --git a/cpp/src/qpid/broker/Queue.cpp b/cpp/src/qpid/broker/Queue.cpp index 3eb714186c..6e813e936d 100644 --- a/cpp/src/qpid/broker/Queue.cpp +++ b/cpp/src/qpid/broker/Queue.cpp @@ -101,7 +101,8 @@ Queue::Queue(const string& _name, bool _autodelete, eventMode(0), eventMgr(0), insertSeqNo(0), - broker(b) + broker(b), + deleted(false) { if (parent != 0 && broker != 0) { @@ -291,6 +292,7 @@ void Queue::notifyListener() bool Queue::getNextMessage(QueuedMessage& m, Consumer::shared_ptr c) { + checkNotDeleted(); if (c->preAcquires()) { switch (consumeNextMessage(m, c)) { case CONSUMED: @@ -869,6 +871,17 @@ void Queue::destroy() } } +void Queue::notifyDeleted() +{ + QueueListeners::ListenerSet set; + { + Mutex::ScopedLock locker(messageLock); + listeners.snapshot(set); + deleted = true; + } + set.notifyAll(); +} + void Queue::bound(const string& exchange, const string& key, const FieldTable& args) { @@ -1102,3 +1115,10 @@ bool Queue::isEnqueued(const QueuedMessage& msg) } QueueListeners& Queue::getListeners() { return listeners; } + +void Queue::checkNotDeleted() +{ + if (deleted) { + throw ResourceDeletedException(QPID_MSG("Queue " << getName() << " has been deleted.")); + } +} |