You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by gs...@apache.org on 2009/11/20 00:07:56 UTC
svn commit: r882350 - in /qpid/trunk/qpid/cpp:
include/qpid/messaging/Address.h
src/qpid/client/amqp0_10/AddressResolution.cpp
Author: gsim
Date: Thu Nov 19 23:07:55 2009
New Revision: 882350
URL: http://svn.apache.org/viewvc?rev=882350&view=rev
Log:
QPID-664: Added some documentation for address options; tidied up the handling of queue- and subscribe- arguments
Modified:
qpid/trunk/qpid/cpp/include/qpid/messaging/Address.h
qpid/trunk/qpid/cpp/src/qpid/client/amqp0_10/AddressResolution.cpp
Modified: qpid/trunk/qpid/cpp/include/qpid/messaging/Address.h
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/include/qpid/messaging/Address.h?rev=882350&r1=882349&r2=882350&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/include/qpid/messaging/Address.h (original)
+++ qpid/trunk/qpid/cpp/include/qpid/messaging/Address.h Thu Nov 19 23:07:55 2009
@@ -51,12 +51,80 @@
* All parts of an address can be specified in a string of the
* following form:
*
+ * <pre>
* <address> [ / <subject> ] ; [ { <key> : <value> , ... } ]
+ * </pre>
*
- * Here the <address> is a simple name for the addressed entity and
- * <subject> is a subject or subject pattern for messages sent to or
- * received from this address. The options are specified as a series
- * of key value pairs enclosed in curly brackets (denoting a map).
+ * Here the <pre><address></pre> is a simple name for the addressed
+ * entity and <pre><subject></pre> is a subject or subject pattern for
+ * messages sent to or received from this address. The options are
+ * specified as a series of key value pairs enclosed in curly brackets
+ * (denoting a map). Values can be nested maps, or lists (which are
+ * denoted as a comma separated list of values inside square brackets,
+ * e.g. [a, b, c]).
+ *
+ * The currently supported options are as follows:
+ *
+ * create - whether the address should be automatically created or
+ * not. Can be one of always, never, sender or receiver; the
+ * properties of the node to be created can be specified via the
+ * node-properties option.
+ *
+ * assert - whether or not to assert any specified node-properties
+ * match the address. Can be one of always, never, sender or receiver.
+ *
+ * delete - whether or not to delete the addressed nide when a sender
+ * or receiver is cancelled. Can be one of always, never, sender or
+ * receiver.
+ *
+ * node-properties - a nested map of properties of the addressed
+ * entity or 'node'. These can be used when automatically creating it,
+ * or to assert certain properties.
+ *
+ * The valid node-properties are:
+ *
+ * type - queue or topic
+ *
+ * durable - true or false
+ *
+ * x-properties - a nested map that can contain implementation or
+ * protocol specifiec extedned properties. For the amqp 0-10 mapping,
+ * the fields in queue- or exchange- declare can be specified in here;
+ * anything that is not recognised as one of those will be passed
+ * through in the arguments field.
+ *
+ * For receivers there are some further options of interest:
+ *
+ * no-local - (only relevant for topics at present) specifies that the
+ * receiver does not want to receiver messages published to the topic
+ * that originate from a sender on the same connection
+ *
+ * browse - (only relevant for queues) specifies that the receiver
+ * does not wish to consume the messages, but merely browse them
+ *
+ * durable - (only relevant for topics at present) specifies that a
+ * durable subscription is required
+ *
+ * reliability - indicates the level of reliability that the receiver
+ * expects. Can be one of unreliable, at-most-once, at-least-once or
+ * exactly-once (the latter is not yet correctly supported).
+ *
+ * filter - (only relevant for topics at present) allows bindings to
+ * be created for the queue that match the given criteris (or list of
+ * criteria).
+ *
+ * x-properties - allows protocol or implementation specific options
+ * to be specified for a receiver; this is a nested map and currently
+ * the implementation only recognises two specific nested properties
+ * within it (all others are passed through in the arguments of the
+ * message-subscribe command):
+ *
+ * exclusive, which requests an exclusive subscription and
+ * is only relevant for queues
+ *
+ * x-queue-arguments, which ais only relevant for topics and
+ * allows arguments to the queue-declare for the subscription
+ * queue to be specified
*/
class Address
{
Modified: qpid/trunk/qpid/cpp/src/qpid/client/amqp0_10/AddressResolution.cpp
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/client/amqp0_10/AddressResolution.cpp?rev=882350&r1=882349&r2=882350&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/client/amqp0_10/AddressResolution.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qpid/client/amqp0_10/AddressResolution.cpp Thu Nov 19 23:07:55 2009
@@ -179,7 +179,7 @@
private:
const AcceptMode acceptMode;
const AcquireMode acquireMode;
- const bool exclusive;
+ bool exclusive;
FieldTable options;
};
@@ -344,10 +344,19 @@
Queue(address),
acceptMode(is_unreliable(address) ? ACCEPT_MODE_NONE : ACCEPT_MODE_EXPLICIT),
acquireMode(address.getOption(BROWSE).asBool() ? ACQUIRE_MODE_NOT_ACQUIRED : ACQUIRE_MODE_PRE_ACQUIRED),
- exclusive(getNestedOption(address.getOptions(), list_of<std::string>(X_PROPERTIES)(EXCLUSIVE)).asBool())
+ exclusive(false)
{
//extract subscription arguments from address options
- convert(address.getOption(xamqp::SUBSCRIBE_ARGUMENTS), options);
+ const Variant& x = address.getOption(X_PROPERTIES);
+ if (!x.isVoid()) {
+ const Variant::Map& xProps = x.asMap();
+ Variant::Map passthrough;
+ for (Variant::Map::const_iterator i = xProps.begin(); i != xProps.end(); ++i) {
+ if (i->first == xamqp::EXCLUSIVE) exclusive = i->second;
+ else passthrough[i->first] = i->second;
+ }
+ translate(passthrough, options);
+ }
}
void QueueSource::subscribe(qpid::client::AsyncSession& session, const std::string& destination)
@@ -384,8 +393,16 @@
durable(address.getOption(DURABLE_SUBSCRIPTION).asBool())
{
if (address.getOption(NO_LOCAL).asBool()) queueOptions.setInt(NO_LOCAL, 1);
- convert(address.getOption(xamqp::QUEUE_ARGUMENTS), queueOptions);
- convert(address.getOption(xamqp::SUBSCRIBE_ARGUMENTS), subscriptionOptions);
+ const Variant& x = address.getOption(X_PROPERTIES);
+ if (!x.isVoid()) {
+ const Variant::Map& xProps = x.asMap();
+ Variant::Map passthrough;
+ for (Variant::Map::const_iterator i = xProps.begin(); i != xProps.end(); ++i) {
+ if (i->first == xamqp::QUEUE_ARGUMENTS) convert(i->second.asMap(), queueOptions);
+ else passthrough[i->first] = i->second;
+ }
+ translate(passthrough, subscriptionOptions);
+ }
const Variant& filter = address.getOption(FILTER);
if (!filter.isVoid()) {
---------------------------------------------------------------------
Apache Qpid - AMQP Messaging Implementation
Project: http://qpid.apache.org
Use/Interact: mailto:commits-subscribe@qpid.apache.org