diff options
-rw-r--r-- | qpid/cpp/src/qpid/broker/SessionAdapter.cpp | 3 | ||||
-rw-r--r-- | qpid/cpp/src/tests/MessagingSessionTests.cpp | 19 |
2 files changed, 21 insertions, 1 deletions
diff --git a/qpid/cpp/src/qpid/broker/SessionAdapter.cpp b/qpid/cpp/src/qpid/broker/SessionAdapter.cpp index 2effa03afb..d4f6b28ccb 100644 --- a/qpid/cpp/src/qpid/broker/SessionAdapter.cpp +++ b/qpid/cpp/src/qpid/broker/SessionAdapter.cpp @@ -489,7 +489,8 @@ SessionAdapter::MessageHandlerImpl::subscribe(const string& queueName, Queue::shared_ptr queue = getQueue(queueName); if(!destination.empty() && state.exists(destination)) throw NotAllowedException(QPID_MSG("Consumer tags must be unique")); - if (queue->hasExclusiveOwner() && !queue->isExclusiveOwner(&session)) + + if (queue->hasExclusiveOwner() && !queue->isExclusiveOwner(&session) && acquireMode == 0) throw ResourceLockedException(QPID_MSG("Cannot subscribe to exclusive queue " << queue->getName())); diff --git a/qpid/cpp/src/tests/MessagingSessionTests.cpp b/qpid/cpp/src/tests/MessagingSessionTests.cpp index 66ce061b73..fc1632b4e1 100644 --- a/qpid/cpp/src/tests/MessagingSessionTests.cpp +++ b/qpid/cpp/src/tests/MessagingSessionTests.cpp @@ -771,6 +771,25 @@ QPID_AUTO_TEST_CASE(testExclusiveSubscriber) } catch (const MessagingException& /*e*/) {} } + +QPID_AUTO_TEST_CASE(testExclusiveQueueSubscriberAndBrowser) +{ + MessagingFixture fix; + + std::string address = "exclusive-queue; { create: receiver, node : { x-declare : { auto-delete: true, exclusive: true } } }"; + std::string browseAddress = "exclusive-queue; { mode: browse }"; + + Receiver receiver = fix.session.createReceiver(address); + fix.session.sync(); + + Connection c2 = fix.newConnection(); + c2.open(); + Session s2 = c2.createSession(); + + BOOST_CHECK_NO_THROW(Receiver browser = s2.createReceiver(browseAddress)); + c2.close(); +} + QPID_AUTO_TEST_CASE(testAuthenticatedUsername) { MessagingFixture fix; |