Hi Chuck,
I think that the

http://qpid.apache.org/releases/qpid-0.24/programming/book/connection-options.html

book is indeed where most people would tend to look, but it's not quite complete

The qpid::messaging API doxygen docs

http://qpid.apache.org/releases/qpid-0.24/messaging-api/cpp/api/classqpid_1_1messaging_1_1Connection.html

(which mentions a few more things than the "programming" book) says:

Current implementation supports the following options:

 * heartbeat: the heartbeat interval in seconds
 * tcp_nodelay: true/false, whether nagle should be disabled or not
 * transport: the underlying transport to use (e.g. tcp, ssl, rsdma)
 * protocol: the version of AMQP to use (e.g. amqp0-10 or amqp1.0)

(Note: the transports and/or protocols recognised may depend on which plugins are loaded)

 * username: the username to authenticate as
 * password: the password to use if required by the selected
   authentication mechanism
 * sasl_mechanisms: a space separated list of acceptable SASL mechanisms
 * sasl_min_ssf: the minimum acceptable security strength factor
 * sasl_max_ssf: the maximum acceptable security strength factor
 * sasl_service: the service name if needed by the SASL mechanism in use

Reconnect behaviour can be controlled through the following options:

 * reconnect: true/false (enables/disables reconnect entirely)
 * reconnect_timeout: seconds (give up and report failure after
   specified time)
 * reconnect_limit: n (give up and report failure after specified
   number of attempts)
 * reconnect_interval_min: seconds (initial delay between failed
   reconnection attempts)
 * reconnect_interval_max: seconds (maximum delay between failed
   reconnection attempts)
 * reconnect_interval: shorthand for setting the same
   reconnect_interval_min/max
 * reconnect_urls: list of alternate urls to try when connecting

The reconnect_interval is the time that the client waits for after a failed attempt to reconnect before retrying. It starts at the value of the min_retry_interval and is doubled every failure until the value of max_retry_interval is reached.

Values in seconds can be fractional, for example 0.001 is a millisecond delay.



It's worth also mentioning that (for AMQP 1.0 at any rate) even the doxygen stuff seems incompete if you look in <qpid>/qpid-trunk/qpid/cpp/src/qpid/messaging/ConnectionOptions.cpp there are a few additional fields.

void ConnectionOptions::set(const std::string& name, const qpid::types::Variant& value)
{
    if (name == "reconnect") {
        reconnect = value;
} else if (name == "reconnect-timeout" || name == "reconnect_timeout") {
        timeout = timeValue(value);
    } else if (name == "reconnect-limit" || name == "reconnect_limit") {
        limit = value;
} else if (name == "reconnect-interval" || name == "reconnect_interval") {
        maxReconnectInterval = minReconnectInterval = timeValue(value);
} else if (name == "reconnect-interval-min" || name == "reconnect_interval_min") {
        minReconnectInterval = timeValue(value);
} else if (name == "reconnect-interval-max" || name == "reconnect_interval_max") {
        maxReconnectInterval = timeValue(value);
} else if (name == "reconnect-urls-replace" || name == "reconnect_urls_replace") {
        replaceUrls = value.asBool();
    } else if (name == "reconnect-urls" || name == "reconnect_urls") {
        if (replaceUrls) urls.clear();
        if (value.getType() == qpid::types::VAR_LIST) {
            merge(value.asList(), urls);
        } else {
            merge(value.asString(), urls);
        }
    } else if (name == "username") {
        username = value.asString();
    } else if (name == "password") {
        password = value.asString();
    } else if (name == "sasl-mechanism" || name == "sasl_mechanism" ||
               name == "sasl-mechanisms" || name == "sasl_mechanisms") {
        mechanism = value.asString();
    } else if (name == "sasl-service" || name == "sasl_service") {
        service = value.asString();
    } else if (name == "sasl-min-ssf" || name == "sasl_min_ssf") {
        minSsf = value;
    } else if (name == "sasl-max-ssf" || name == "sasl_max_ssf") {
        maxSsf = value;
    } else if (name == "heartbeat") {
        heartbeat = value;
    } else if (name == "tcp-nodelay" || name == "tcp_nodelay") {
        tcpNoDelay = value;
    } else if (name == "locale") {
        locale = value.asString();
    } else if (name == "max-channels" || name == "max_channels") {
        maxChannels = value;
    } else if (name == "max-frame-size" || name == "max_frame_size") {
        maxFrameSize = value;
    } else if (name == "bounds") {
        bounds = value;
    } else if (name == "transport") {
        protocol = value.asString();
    } else if (name == "ssl-cert-name" || name == "ssl_cert_name") {
        sslCertName = value.asString();
} else if (name == "x-reconnect-on-limit-exceeded" || name == "x_reconnect_on_limit_exceeded") {
        reconnectOnLimitExceeded = value;
    } else if (name == "container-id" || name == "container_id") {
        identifier = value.asString();
    } else if (name == "nest-annotations" || name == "nest_annotations") {
        nestAnnotations = value;
    } else if (name == "set-to-on-send" || name == "set_to_on_send") {
        setToOnSend = value;
    } else {
throw qpid::messaging::MessagingException(QPID_MSG("Invalid option: " << name << " not recognised"));
    }
}


Note that for qpid::messaging this stuff is all in the connection options, the actual "URL" is usually just set as just a basic <host>:<port>, though actually I *think* that it is an AMQP 0.10 URL and you can actually do amqp:<host>:<port> though TBH I'm not sure if anyone does.


I do rather wonder that for AMQP 1.0 if the URL could be improved to accept something like:
amqp://[<user>][:<password>@][<proto>:]<host>[:<port>]

Which would make it look more like the first part of the Proton Messenger style Address and because the amqp:// would distinguish it from the AMQP 0.10 style URL you could use it instead of the protocol/user/password connection options to signify AMQP 1.0. I personally find that neater, but there might be a good reason for not doing such a thing.

I mentioned this in my AMQP 1.0 Address Musings "essay", though nobody has bitten on that one yet :-D

HTH,
Best regards,
Frase


On 07/02/14 15:00, Chuck Rolke wrote:
I'm writing a how-to document for the Apache.NMS.AMQP Provider (a .NET 
subsystem to provide AMQP support to http://activemq.apache.org/nms/). I'm 
looking for a pointer to a description of the C++ Messaging API connection URL.

The C++ connection options are easy enough to find:
http://qpid.apache.org/releases/qpid-0.24/programming/book/connection-options.html

The JMS Connection URL is declared at:
http://qpid.apache.org/releases/qpid-0.24/programming/book/QpidJNDI.html#section-jms-connection-url

I suspect that the C++ connection URL is similar if not identical to the JMS 
connection URL. However, if one or more fields are different or absent then 
this assumption is no good. Can anyone confirm this for me or point me to a 
description?

The C++ Messaging API needs a section as clear and direct as the JMS connection 
URL page. I'll be happy to add that going forward.

Thanks,
Chuck

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@qpid.apache.org
For additional commands, e-mail: users-h...@qpid.apache.org


Reply via email to