Modified: qpid/site/docs/books/0.6/Programming-In-Apache-Qpid/html/ch02s02.html URL: http://svn.apache.org/viewvc/qpid/site/docs/books/0.6/Programming-In-Apache-Qpid/html/ch02s02.html?rev=955411&r1=955410&r2=955411&view=diff ============================================================================== --- qpid/site/docs/books/0.6/Programming-In-Apache-Qpid/html/ch02s02.html (original) +++ qpid/site/docs/books/0.6/Programming-In-Apache-Qpid/html/ch02s02.html Wed Jun 16 22:01:44 2010 @@ -1,6 +1,6 @@ -<html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>2. A Simple Messaging Program in Python</title><meta name="generator" content="DocBook XSL Stylesheets V1.75.2"><link rel="home" href="index.html" title="Programming in Apache Qpid"><link rel="up" href="ch02.html" title="Chapter 2. Using the Qpid Messaging API"><link rel="prev" href="ch02.html" title="Chapter 2. Using the Qpid Messaging API"><link rel="next" href="ch02s03.html" title="3. Addresses"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">2. A Simple Messaging Program in Python</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch02.html">Prev</a> </td><th width="60%" align="center">Chapter 2. Using the Qpid Messaging API</th><td width="20%" align="right"> <a accesskey="n" href="ch02s03.html">Next</a></td></tr ></table><hr></div><div class="section" title="2. A Simple Messaging Program >in Python"><div class="titlepage"><div><div><h2 class="title" style="clear: >both"><a name="id2621571"></a>2. A Simple Messaging Program in >Python</h2></div></div></div><p>The following Python program shows how to >create a +<html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>2. A Simple Messaging Program in Python</title><meta name="generator" content="DocBook XSL Stylesheets V1.75.2"><link rel="home" href="index.html" title="Programming in Apache Qpid"><link rel="up" href="ch02.html" title="Chapter 2. Using the Qpid Messaging API"><link rel="prev" href="ch02.html" title="Chapter 2. Using the Qpid Messaging API"><link rel="next" href="ch02s03.html" title="3. A Simple Messaging Program in .NET C#"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">2. A Simple Messaging Program in Python</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch02.html">Prev</a> </td><th width="60%" align="center">Chapter 2. Using the Qpid Messaging API</th><td width="20%" align="right"> <a accesskey="n" href="ch0 2s03.html">Next</a></td></tr></table><hr></div><div class="section" title="2. A Simple Messaging Program in Python"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="id2764277"></a>2. A Simple Messaging Program in Python</h2></div></div></div><p>The following Python program shows how to create a connection, create a session, send messages using a sender, and - receive messages using a receiver.</p><div class="example"><a name="id2599690"></a><p class="title"><b>Example 2.2. "Hello world!" in Python</b></p><div class="example-contents"><pre lang="python" class="programlisting"> + receive messages using a receiver.</p><div class="example"><a name="id2747068"></a><p class="title"><b>Example 2.2. "Hello world!" in Python</b></p><div class="example-contents"><pre lang="python" class="programlisting"> import sys from qpid.messaging import * @@ -10,20 +10,20 @@ address = "amq.topic" if len(sys.argv)&l connection = Connection(broker) try: - connection.open() <a class="co" name="hello-python-open" href="ch02s02.html#callout-python-open"><img src="images/callouts/1.png" alt="1" border="0"></a> - session = connection.session() <a class="co" name="hello-python-session" href="ch02s02.html#callout-python-session"><img src="images/callouts/2.png" alt="2" border="0"></a> + connection.open() <a class="co" name="hello-python-open" href="ch02s02.html#callout-python-open">(1)</a> + session = connection.session() <a class="co" name="hello-python-session" href="ch02s02.html#callout-python-session">(2)</a> - sender = session.sender(address) <a class="co" name="hello-python-sender" href="ch02s02.html#callout-python-sender"><img src="images/callouts/3.png" alt="3" border="0"></a> - receiver = session.receiver(address) <a class="co" name="hello-python-receiver" href="ch02s02.html#callout-python-receiver"><img src="images/callouts/4.png" alt="4" border="0"></a> + sender = session.sender(address) <a class="co" name="hello-python-sender" href="ch02s02.html#callout-python-sender">(3)</a> + receiver = session.receiver(address) <a class="co" name="hello-python-receiver" href="ch02s02.html#callout-python-receiver">(4)</a> sender.send(Message("Hello world!")); - message = receiver.fetch(timeout=1) <a class="co" name="hello-python-fetch" href="ch02s02.html#callout-python-fetch"><img src="images/callouts/5.png" alt="5" border="0"></a> + message = receiver.fetch(timeout=1) <a class="co" name="hello-python-fetch" href="ch02s02.html#callout-python-fetch">(5)</a> print message.content - session.acknowledge() <a class="co" name="hello-python-acknowledge" href="ch02s02.html#callout-python-acknowledge"><img src="images/callouts/6.png" alt="6" border="0"></a> + session.acknowledge() <a class="co" name="hello-python-acknowledge" href="ch02s02.html#callout-python-acknowledge">(6)</a> except MessagingError,m: print m finally: - connection.close() <a class="co" name="hello-python-close" href="ch02s02.html#callout-python-close"><img src="images/callouts/7.png" alt="7" border="0"></a> -</pre><div class="calloutlist"><table border="0" summary="Callout list"><tr><td width="5%" valign="top" align="left"><p><a name="callout-python-open"></a><a href="#hello-python-open"><img src="images/callouts/1.png" alt="1" border="0"></a> </p></td><td valign="top" align="left"><p>Establishes the connection with the messaging broker.</p></td></tr><tr><td width="5%" valign="top" align="left"><p><a name="callout-python-session"></a><a href="#hello-python-session"><img src="images/callouts/2.png" alt="2" border="0"></a> </p></td><td valign="top" align="left"><p>Creates a session object, which maintains the state of all interactions with the messaging broker, and manages senders and receivers.</p></td></tr><tr><td width="5%" valign="top" align="left"><p><a name="callout-python-receiver"></a><a href="#hello-python-receiver"><img src="images/callouts/4.png" alt="4" border="0"></a> </p></td><td valign="top" align="left"><p>Creates a receiver that reads from the given address.</p></ td></tr><tr><td width="5%" valign="top" align="left"><p><a name="callout-python-sender"></a><a href="#hello-python-sender"><img src="images/callouts/3.png" alt="3" border="0"></a> </p></td><td valign="top" align="left"><p>Creates a sender that sends to the given address.</p></td></tr><tr><td width="5%" valign="top" align="left"><p><a name="callout-python-fetch"></a><a href="#hello-python-fetch"><img src="images/callouts/5.png" alt="5" border="0"></a> </p></td><td valign="top" align="left"><p>Reads the next message. The duration is optional, if omitted, will wait indefinitely for the next message.</p></td></tr><tr><td width="5%" valign="top" align="left"><p><a name="callout-python-acknowledge"></a><a href="#hello-python-acknowledge"><img src="images/callouts/6.png" alt="6" border="0"></a> </p></td><td valign="top" align="left"><p>Acknowledges messages that have been read. To guarantee delivery, a message remains on the messaging broker until it is acknowledged by a client. se ssion.acknowledge() acknowledges all unacknowledged messages for the given session—this allows acknowledgements to be batched, which is more efficient than acknowledging messages individually.</p></td></tr><tr><td width="5%" valign="top" align="left"><p><a name="callout-python-close"></a><a href="#hello-python-close"><img src="images/callouts/7.png" alt="7" border="0"></a> </p></td><td valign="top" align="left"><p>Closes the connection, all sessions managed by the connection, and all senders and receivers managed by each session.</p></td></tr></table></div></div></div><br class="example-break"></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch02.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="ch02.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="ch02s03.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">Chapter 2. Using the Qpid Messaging API </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> 3. Addresses</td></tr></table></div></body></html> + connection.close() <a class="co" name="hello-python-close" href="ch02s02.html#callout-python-close">(7)</a> +</pre><div class="calloutlist"><table border="0" summary="Callout list"><tr><td width="5%" valign="top" align="left"><p><a name="callout-python-open"></a><a href="#hello-python-open">(1)</a> </p></td><td valign="top" align="left"><p>Establishes the connection with the messaging broker.</p></td></tr><tr><td width="5%" valign="top" align="left"><p><a name="callout-python-session"></a><a href="#hello-python-session">(2)</a> </p></td><td valign="top" align="left"><p>Creates a session object, which maintains the state of all interactions with the messaging broker, and manages senders and receivers.</p></td></tr><tr><td width="5%" valign="top" align="left"><p><a name="callout-python-receiver"></a><a href="#hello-python-receiver">(4)</a> </p></td><td valign="top" align="left"><p>Creates a receiver that reads from the given address.</p></td></tr><tr><td width="5%" valign="top" align="left"><p><a name="callout-python-sender"></a><a href="#hello-python-sender">(3)</a> </p></td><td val ign="top" align="left"><p>Creates a sender that sends to the given address.</p></td></tr><tr><td width="5%" valign="top" align="left"><p><a name="callout-python-fetch"></a><a href="#hello-python-fetch">(5)</a> </p></td><td valign="top" align="left"><p>Reads the next message. The duration is optional, if omitted, will wait indefinitely for the next message.</p></td></tr><tr><td width="5%" valign="top" align="left"><p><a name="callout-python-acknowledge"></a><a href="#hello-python-acknowledge">(6)</a> </p></td><td valign="top" align="left"><p>Acknowledges messages that have been read. To guarantee delivery, a message remains on the messaging broker until it is acknowledged by a client. session.acknowledge() acknowledges all unacknowledged messages for the given session—this allows acknowledgements to be batched, which is more efficient than acknowledging messages individually.</p></td></tr><tr><td width="5%" valign="top" align="left"><p><a name="callout-python-close"></ a><a href="#hello-python-close">(7)</a> </p></td><td valign="top" align="left"><p>Closes the connection, all sessions managed by the connection, and all senders and receivers managed by each session.</p></td></tr></table></div></div></div><br class="example-break"></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch02.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="ch02.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="ch02s03.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">Chapter 2. Using the Qpid Messaging API </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> 3. A Simple Messaging Program in .NET C#</td></tr></table></div></body></html>
Modified: qpid/site/docs/books/0.6/Programming-In-Apache-Qpid/html/ch02s03.html URL: http://svn.apache.org/viewvc/qpid/site/docs/books/0.6/Programming-In-Apache-Qpid/html/ch02s03.html?rev=955411&r1=955410&r2=955411&view=diff ============================================================================== --- qpid/site/docs/books/0.6/Programming-In-Apache-Qpid/html/ch02s03.html (original) +++ qpid/site/docs/books/0.6/Programming-In-Apache-Qpid/html/ch02s03.html Wed Jun 16 22:01:44 2010 @@ -1,565 +1,39 @@ -<html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>3. Addresses</title><meta name="generator" content="DocBook XSL Stylesheets V1.75.2"><link rel="home" href="index.html" title="Programming in Apache Qpid"><link rel="up" href="ch02.html" title="Chapter 2. Using the Qpid Messaging API"><link rel="prev" href="ch02s02.html" title="2. A Simple Messaging Program in Python"><link rel="next" href="ch02s04.html" title="4. Logging"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">3. Addresses</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch02s02.html">Prev</a> </td><th width="60%" align="center">Chapter 2. Using the Qpid Messaging API</th><td width="20%" align="right"> <a accesskey="n" href="ch02s04.html">Next</a></td></tr></table><hr></div><div class="section" title="3. Addresses"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="section-addresses"></a>3. Addresses</h2></div></div></div><p>An <em class="firstterm">address</em> is the name of a message - target or message source. In the programs we have just seen, we - used the address <code class="literal">amq.topic</code> (which is the name - of an exchange on an AMQP 0-10 messaging broker). - - The methods that create senders and receivers require an - address. The details of sending to a particular target or - receiving from a particular source are then handled by the - sender or receiver. A different target or source can be used - simply by using a different address. - </p><p>An address resolves to a <em class="firstterm">node</em>. The - Qpid Messaging API recognises two kinds of nodes, - <em class="firstterm">queues</em> and <em class="firstterm">topics</em> - - <sup>[<a name="id2609913" href="#ftn.id2609913" class="footnote">1</a>]</sup>. - - A queue stores each message until it has been received and - acknowledged, and only one receiver can receive a given message - <sup>[<a name="id2621138" href="#ftn.id2621138" class="footnote">2</a>]</sup> - - A topic immediately delivers a message to all eligible - receivers; if there are no eligible receivers, it discards the - message. In the AMQP 0-10 implementation of the API, - - <sup>[<a name="id2614455" href="#ftn.id2614455" class="footnote">3</a>]</sup> - - queues map to AMQP queues, and topics map to AMQP exchanges. - - <sup>[<a name="id2598385" href="#ftn.id2598385" class="footnote">4</a>]</sup> - </p><p>In the rest of this tutorial, we present many examples - using two programs that take an address as a command line - parameter. <span class="command"><strong>spout</strong></span> sends messages to the - target address, <span class="command"><strong>drain</strong></span> receives messages from - the source address. The source code is available in both C++ - and Python, and can be found in the examples directory for each - language. These programs can use any address string as a source - or a destination, and have many command line options to - configure behavior—use the <span class="command"><strong>-h</strong></span> option - for documentation on these options. - - <sup>[<a name="id2589472" href="#ftn.id2589472" class="footnote">5</a>]</sup> - - - The examples in this tutorial also use the - <span class="command"><strong>qpid-config</strong></span> utility to configure AMQP 0-10 - queues and exchanges on a Qpid broker. - </p><div class="example"><a name="id2617058"></a><p class="title"><b>Example 2.3. Queues</b></p><div class="example-contents"><p>Create a queue with <span class="command"><strong>qpid-config</strong></span>, send a message using - <span class="command"><strong>spout</strong></span>, and read it using <span class="command"><strong>drain</strong></span>:</p><pre class="screen"> -$ qpid-config add queue hello-world -$ ./spout hello-world -$ ./drain hello-world - -Message(properties={spout-id:c877e622-d57b-4df2-bf3e-6014c68da0ea:0}, content='') - </pre><p>The queue stored the message sent by <span class="command"><strong>spout</strong></span> and delivered - it to <span class="command"><strong>drain</strong></span> when requested.</p><p>Once the message has been delivered and and acknowledged - by <span class="command"><strong>drain</strong></span>, it is no longer available on the queue. If we run - <span class="command"><strong>drain</strong></span> one more time, no messages will be retrieved.</p><pre class="screen"> -$ ./drain hello-world -$ - </pre></div></div><br class="example-break"><div class="example"><a name="id2613118"></a><p class="title"><b>Example 2.4. Topics</b></p><div class="example-contents"><p>This example is similar to the previous example, but it - uses a topic instead of a queue.</p><p>First, use <span class="command"><strong>qpid-config</strong></span> to remove the queue - and create an exchange with the same name:</p><pre class="screen"> -$ qpid-config del queue hello-world -$ qpid-config add exchange topic hello-world - </pre><p>Now run <span class="command"><strong>drain</strong></span> and <span class="command"><strong>spout</strong></span> the same way we did in the previous example:</p><pre class="screen"> -$ ./spout hello-world -$ ./drain hello-world -$ - </pre><p>Topics deliver messages immediately to any interested - receiver, and do not store messages. Because there were no - receivers at the time <span class="command"><strong>spout</strong></span> sent the - message, it was simply discarded. When we ran - <span class="command"><strong>drain</strong></span>, there were no messages to - receive.</p><p>Now let's run <span class="command"><strong>drain</strong></span> first, using the - <code class="literal">-t</code> option to specify a timeout in seconds. - While <span class="command"><strong>drain</strong></span> is waiting for messages, - run <span class="command"><strong>spout</strong></span> in another window.</p><p><span class="emphasis"><em>First Window:</em></span></p><pre class="screen"> -$ ./drain -t 30 hello-word - </pre><p><span class="emphasis"><em>Second Window:</em></span></p><pre class="screen"> -$ ./spout hello-word - </pre><p>Once <span class="command"><strong>spout</strong></span> has sent a message, return - to the first window to see the output from - <span class="command"><strong>drain</strong></span>:</p><pre class="screen"> -Message(properties={spout-id:7da2d27d-93e6-4803-8a61-536d87b8d93f:0}, content='') - </pre><p>You can run <span class="command"><strong>drain</strong></span> in several separate - windows; each creates a subscription for the exchange, and - each receives all messages sent to the exchange.</p></div></div><br class="example-break"><div class="section" title="3.1. Address Strings"><div class="titlepage"><div><div><h3 class="title"><a name="id2598210"></a>3.1. Address Strings</h3></div></div></div><p>So far, our examples have used address strings that - contain only the name of a node. An <em class="firstterm">address - string</em> can also contain a - <em class="firstterm">subject</em> and - <em class="firstterm">options</em>.</p><p>The syntax for an address string is:</p><pre class="programlisting"> -address_string ::= <address> [ / <subject> ] [ ; <options> ] -options ::= { <key> : <value>, ... } -</pre><p>Addresses, subjects, and keys are strings. Values can - be numbers, strings (with optional single or double quotes), - maps, or lists. A complete BNF for address strings appears in - <a class="xref" href="ch02s03.html#section-address-string-bnf" title="3.4. Address String Grammar">Section 3.4, “Address String Grammar”</a>.</p><p>So far, the address strings in this tutorial have used - only addresses. The following sections show how to use - subjects and options.</p></div><div class="section" title="3.2. Subjects"><div class="titlepage"><div><div><h3 class="title"><a name="id2607393"></a>3.2. Subjects</h3></div></div></div><p>Every message has a property called - <em class="firstterm">subject</em>, which is analogous to the - subject on an email message. If no subject is specified, the - message's subject is null. For convenience, address strings - also allow a subject. If a sender's address contains a - subject, it is used as the default subject for the messages - it sends. - - If a receiver's address contains a subject, it is used to - select only messages that match the subject—the matching - algorithm depends on the message source. - </p><p> - In AMQP 0-10, each exchange type has its own matching - algorithm, and queues do not provide filtering. This is - discussed in <a class="xref" href="ch02s12.html" title="12. The AMQP 0-10 mapping">Section 12, “The AMQP 0-10 mapping”</a>. - </p><div class="note" title="Note" style="margin-left: 0.5in; margin-right: 0.5in;"><h3 class="title">Note</h3><p> - Currently, a receiver bound to a queue ignores subjects, - receiving messages from the queue without filtering. - - In the future, if a receiver is bound to a queue, and its - address contains a subject, the subject will be used as a - selector to filter messages. - </p></div><div class="example"><a name="id2606918"></a><p class="title"><b>Example 2.5. Using subjects</b></p><div class="example-contents"><p>In this example we show how subjects affect message - flow.</p><p>First, let's use <span class="command"><strong>qpid-config</strong></span> to create a topic exchange.</p><pre class="screen"> -$ qpid-config add exchange topic news-service - </pre><p>Now we use drain to receive messages from <code class="literal">news-service</code> that match the subject <code class="literal">sports</code>.</p><p><span class="emphasis"><em>First Window:</em></span></p><pre class="screen"> -$ ./drain -t 30 news-service/sports - </pre><p>In a second window, let's send messages to <code class="literal">news-service</code> using two different subjects:</p><p><span class="emphasis"><em>Second Window:</em></span></p><pre class="screen"> -$ ./spout news-service/sports -$ ./spout news-service/news - </pre><p>Now look at the first window, the message with the - subject <code class="literal">sports</code> has been received, but not - the message with the subject <code class="literal">news</code>:</p><pre class="screen"> -Message(properties={qpid.subject:sports, spout-id:9441674e-a157-4780-a78e-f7ccea998291:0}, content='') - </pre><p>If you run <span class="command"><strong>drain</strong></span> in multiple - windows using the same subject, all instances of - <span class="command"><strong>drain</strong></span> receive the messages for that - subject.</p></div></div><br class="example-break"><p>The AMQP exchange type we are using here, - <code class="literal">amq.topic</code>, can also do more sophisticated - matching. - - A sender's subject can contain multiple words separated by a - <span class="quote">“<span class="quote">.</span>”</span> delimiter. For instance, in a news - application, the sender might use subjects like - <code class="literal">usa.news</code>, <code class="literal">usa.weather</code>, - <code class="literal">europe.news</code>, or - <code class="literal">europe.weather</code>. - - The receiver's subject can include wildcard characters— - <span class="quote">“<span class="quote">#</span>”</span> matches one or more words in the message's - subject, <span class="quote">“<span class="quote">*</span>”</span> matches a single word. - - For instance, if the subject in the source address is - <code class="literal">*.news</code>, it matches messages with the - subject <code class="literal">europe.news</code> or - <code class="literal">usa.news</code>; if it is - <code class="literal">europe.#</code>, it matches messages with subjects - like <code class="literal">europe.news</code> or - <code class="literal">europe.pseudo.news</code>.</p><div class="example"><a name="id2599695"></a><p class="title"><b>Example 2.6. Subjects with multi-word keys</b></p><div class="example-contents"><p>This example uses drain and spout to demonstrate the - use of subjects with two-word keys.</p><p>Let's use <span class="command"><strong>drain</strong></span> with the subject - <code class="literal">*.news</code> to listen for messages in which - the second word of the key is - <code class="literal">news</code>.</p><p><span class="emphasis"><em>First Window:</em></span></p><pre class="screen"> -$ ./drain -t 30 news-service/*.news - </pre><p>Now let's send messages using several different - two-word keys:</p><p><span class="emphasis"><em>Second Window:</em></span></p><pre class="screen"> -$ ./spout news-service/usa.news -$ ./spout news-service/usa.sports -$ ./spout news-service/europe.sports -$ ./spout news-service/europe.news - </pre><p>In the first window, the messages with - <code class="literal">news</code> in the second word of the key have - been received:</p><pre class="screen"> -Message(properties={qpid.subject:usa.news, spout-id:73fc8058-5af6-407c-9166-b49a9076097a:0}, content='') -Message(properties={qpid.subject:europe.news, spout-id:f72815aa-7be4-4944-99fd-c64c9747a876:0}, content='') - </pre><p>Next, let's use <span class="command"><strong>drain</strong></span> with the - subject <code class="literal">#.news</code> to match any sequence of - words that ends with <code class="literal">news</code>.</p><p><span class="emphasis"><em>First Window:</em></span></p><pre class="screen"> -$ ./drain -t 30 news-service/#.news - </pre><p>In the second window, let's send messages using a - variety of different multi-word keys:</p><p><span class="emphasis"><em>Second Window:</em></span></p><pre class="screen"> -$ ./spout news-service/news -$ ./spout news-service/sports -$ ./spout news-service/usa.news -$ ./spout news-service/usa.sports -$ ./spout news-service/usa.faux.news -$ ./spout news-service/usa.faux.sports - </pre><p>In the first window, messages with - <code class="literal">news</code> in the last word of the key have been - received:</p><pre class="screen"> -Message(properties={qpid.subject:news, spout-id:cbd42b0f-c87b-4088-8206-26d7627c9640:0}, content='') -Message(properties={qpid.subject:usa.news, spout-id:234a78d7-daeb-4826-90e1-1c6540781eac:0}, content='') -Message(properties={qpid.subject:usa.faux.news, spout-id:6029430a-cfcb-4700-8e9b-cbe4a81fca5f:0}, content='') - </pre></div></div><br class="example-break"></div><div class="section" title="3.3. Address String Options"><div class="titlepage"><div><div><h3 class="title"><a name="id2594787"></a>3.3. Address String Options</h3></div></div></div><p> - The options in an address string contain additional - information for the senders or receivers created for it, - including: - </p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p> - Policies for assertions about the node to which an address - refers. - </p><p> - For instance, in the address string <code class="literal">my-queue; - {assert: always, node:{ type: queue }}</code>, the node - named <code class="literal">my-queue</code> must be a queue; if not, - the address does not resolve to a node, and an exception - is raised. - </p></li><li class="listitem"><p> - Policies for automatically creating or deleting the node to which an address refers. - </p><p> - For instance, in the address string <code class="literal">xoxox ; {create: always}</code>, - the queue <code class="literal">xoxox</code> is created, if it does - not exist, before the address is resolved. - </p></li><li class="listitem"><p> - Extension points that can be used for sender/receiver configuration. - </p><p> - For instance, if the address for a receiver is - <code class="literal">my-queue; {mode: browse}</code>, the receiver - works in <code class="literal">browse</code> mode, leaving messages - on the queue so other receivers can receive them. - </p></li><li class="listitem"><p> - Extension points that rely on the functionality of specific node types. - </p><p> - For instance, the Qpid XML exchange can use XQuery to do - content-based routing for XML messages, or to query - message data using XQuery. Queries can be specified using - options. - </p></li></ul></div><p> - Let's use some examples to show how these different kinds of - address string options affect the behavior of senders and - receives. - </p><div class="section" title="3.3.1. assert"><div class="titlepage"><div><div><h4 class="title"><a name="id2610235"></a>3.3.1. assert</h4></div></div></div><p> - In this section, we use the <code class="literal">assert</code> option - to ensure that the address resolves to a node of the required - type. - </p><div class="example"><a name="id2576196"></a><p class="title"><b>Example 2.7. Assertions on Nodes</b></p><div class="example-contents"><p>Let's use <span class="command"><strong>qpid-config</strong></span> to create a - queue and a topic.</p><pre class="screen"> -$ qpid-config add queue my-queue -$ qpid-config add exchange topic my-topic - </pre><p> - We can now use the address specified to drain to assert that it is - of a particular type: - </p><pre class="screen"> -$ ./drain 'my-queue; {assert: always, node:{ type: queue }}' -$ ./drain 'my-queue; {assert: always, node:{ type: topic }}' -2010-04-20 17:30:46 warning Exception received from broker: not-found: not-found: Exchange not found: my-queue (../../src/qpid/broker/ExchangeRegistry.cpp:92) [caused by 2 \x07:\x01] -Exchange my-queue does not exist - </pre><p> - The first attempt passed without error as my-queue is indeed a - queue. The second attempt however failed; my-queue is not a - topic. - </p><p> - We can do the same thing for my-topic: - </p><pre class="screen"> -$ ./drain 'my-topic; {assert: always, node:{ type: topic }}' -$ ./drain 'my-topic; {assert: always, node:{ type: queue }}' -2010-04-20 17:31:01 warning Exception received from broker: not-found: not-found: Queue not found: my-topic (../../src/qpid/broker/SessionAdapter.cpp:754) [caused by 1 \x08:\x01] -Queue my-topic does not exist - </pre></div></div><br class="example-break"><p>Now let's use the <code class="literal">create</code> option to - create the queue <code class="literal">xoxox</code> if it does not already - exist:</p></div><div class="section" title="3.3.2. create"><div class="titlepage"><div><div><h4 class="title"><a name="id2593763"></a>3.3.2. create</h4></div></div></div><p>In previous examples, we created the queue before - listening for messages on it. Using <code class="literal">create: - always</code>, the queue is automatically created if it - does not exist.</p><div class="example"><a name="id2616221"></a><p class="title"><b>Example 2.8. Creating a Queue Automatically</b></p><div class="example-contents"><p><span class="emphasis"><em>First Window:</em></span></p><pre class="screen">$ ./drain -t 30 "xoxox ; {create: always}"</pre><p>Now we can send messages to this queue:</p><p><span class="emphasis"><em>Second Window:</em></span></p><pre class="screen">$ ./spout "xoxox ; {create: always}"</pre><p>Returning to the first window, we see that <span class="command"><strong>drain</strong></span> has received this message:</p><pre class="screen">Message(properties={spout-id:1a1a3842-1a8b-4f88-8940-b4096e615a7d:0}, content='')</pre></div></div><br class="example-break"></div><div class="section" title="3.3.3. browse"><div class="titlepage"><div><div><h4 class="title"><a name="id2597449"></a>3.3.3. browse</h4></div></div></div><p>Some options specify message transfer semantics; for - instance, they may state whether messages should be consumed or - read in browsing mode, or specify reliability - characteristics. The following example uses the - <code class="literal">browse</code> option to receive messages without - removing them from a queue.</p><div class="example"><a name="id2600049"></a><p class="title"><b>Example 2.9. Browsing a Queue</b></p><div class="example-contents"><p> - Let's use the browse mode to receive messages without - removing them from the queue. First we send three messages to the - queue: - </p><pre class="screen"> -$ ./spout my-queue --content one -$ ./spout my-queue --content two -$ ./spout my-queue --content three - </pre><p>Now we use drain to get those messages, using the browse option:</p><pre class="screen"> -$ ./drain 'my-queue; {mode: browse}' -Message(properties={spout-id:fbb93f30-0e82-4b6d-8c1d-be60eb132530:0}, content='one') -Message(properties={spout-id:ab9e7c31-19b0-4455-8976-34abe83edc5f:0}, content='two') -Message(properties={spout-id:ea75d64d-ea37-47f9-96a9-d38e01c97925:0}, content='three') - </pre><p>We can confirm the messages are still on the queue by repeating the drain:</p><pre class="screen"> -$ ./drain 'my-queue; {mode: browse}' -Message(properties={spout-id:fbb93f30-0e82-4b6d-8c1d-be60eb132530:0}, content='one') -Message(properties={spout-id:ab9e7c31-19b0-4455-8976-34abe83edc5f:0}, content='two') -Message(properties={spout-id:ea75d64d-ea37-47f9-96a9-d38e01c97925:0}, content='three') - </pre></div></div><br class="example-break"></div><div class="section" title="3.3.4. x-bindings"><div class="titlepage"><div><div><h4 class="title"><a name="id2591003"></a>3.3.4. x-bindings</h4></div></div></div><p><code class="literal">x-bindings</code> allows an address string - to specify properties AMQP 0-10 bindings. For instance, the - XML Exchange is an AMQP 0-10 custom exchange provided by the - Apache Qpid C++ broker. It allows messages to be filtered - using XQuery; queries can address either message properties or - XML content in the body of the message. These queries can be - specified in addresses using x-bindings</p><p>An instance of the XML Exchange must be added before it - can be used:</p><pre class="programlisting"> -$ qpid-config add exchange xml xml - </pre><p>When using the XML Exchange, a receiver provides an - XQuery as an x-binding argument. If the query contains a - context item (a path starting with <span class="quote">“<span class="quote">.</span>”</span>), then it - is applied to the content of the message, which must be - well-formed XML. For instance, <code class="literal">./weather</code> is - a valid XQuery, which matches any message in which the root - element is named <code class="literal">weather</code>. Here is an - address string that contains this query:</p><pre class="programlisting"> -xml; { - link: { - x-bindings: [{exchange:xml, key:weather, arguments:{xquery:"./weather"} }] - } +<html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>3. A Simple Messaging Program in .NET C#</title><meta name="generator" content="DocBook XSL Stylesheets V1.75.2"><link rel="home" href="index.html" title="Programming in Apache Qpid"><link rel="up" href="ch02.html" title="Chapter 2. Using the Qpid Messaging API"><link rel="prev" href="ch02s02.html" title="2. A Simple Messaging Program in Python"><link rel="next" href="ch02s04.html" title="4. Addresses"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">3. A Simple Messaging Program in .NET C#</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch02s02.html">Prev</a> </td><th width="60%" align="center">Chapter 2. Using the Qpid Messaging API</th><td width="20%" align="right"> <a accesskey="n" href="ch02s04.html">Next</a></ td></tr></table><hr></div><div class="section" title="3. A Simple Messaging Program in .NET C#"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="id2778332"></a>3. A Simple Messaging Program in .NET C#</h2></div></div></div><p>The following .NET C# program shows how to create a connection, + create a session, send messages using a sender, and receive + messages using a receiver.</p><div class="example"><a name="id2783534"></a><p class="title"><b>Example 2.3. "Hello world!" in .NET C#</b></p><div class="example-contents"><pre lang="c++" class="programlisting"> +using System; +using Org.Apache.Qpid.Messaging; <a class="co" name="hello-csharp-using" href="ch02s03.html#callout-csharp-using">(1)</a> + +namespace Org.Apache.Qpid.Messaging { + class Program { + static void Main(string[] args) { + String broker = args.Length > 0 ? args[0] : "localhost:5672"; + String address = args.Length > 1 ? args[1] : "amq.topic"; + + Connection connection = null; + try { + connection = new Connection(broker); + connection.Open(); <a class="co" name="hello-csharp-open" href="ch02s03.html#callout-csharp-open">(2)</a> + Session session = connection.CreateSession(); <a class="co" name="hello-csharp-session" href="ch02s03.html#callout-csharp-session">(3)</a> + + Receiver receiver = session.CreateReceiver(address); <a class="co" name="hello-csharp-receiver" href="ch02s03.html#callout-csharp-receiver">(4)</a> + Sender sender = session.CreateSender(address); <a class="co" name="hello-csharp-sender" href="ch02s03.html#callout-csharp-sender">(5)</a> + + sender.Send(new Message("Hello world!")); + + Message message = new Message(); + message = receiver.Fetch(DurationConstants.SECOND * 1); <a class="co" name="hello-csharp-fetch" href="ch02s03.html#callout-csharp-fetch">(6)</a> + Console.WriteLine("{0}", message.GetContent()); + session.Acknowledge(); <a class="co" name="hello-csharp-acknowledge" href="ch02s03.html#callout-csharp-acknowledge">(7)</a> + + connection.Close(); <a class="co" name="hello-csharp-close" href="ch02s03.html#callout-csharp-close">(8)</a> + } catch (Exception e) { + Console.WriteLine("Exception {0}.", e); + if (null != connection) + connection.Close(); + } + } + } } - </pre><p>When using longer queries with <span class="command"><strong>drain</strong></span>, - it is often useful to place the query in a file, and use - <span class="command"><strong>cat</strong></span> in the command line. We do this in the - following example.</p><div class="example"><a name="id2583051"></a><p class="title"><b>Example 2.10. Using the XML Exchange</b></p><div class="example-contents"><p>This example uses an x-binding that contains queries, which filter based on the content of XML messages. Here is an XQuery that we will use in this example:</p><pre class="programlisting"> - -let $w := ./weather -return $w/station = 'Raleigh-Durham International Airport (KRDU)' - and $w/temperature_f > 50 - and $w/temperature_f - $w/dewpoint > 5 - and $w/wind_speed_mph > 7 - and $w/wind_speed_mph < 20 - </pre><p>We can specify this query in an x-binding to listen to messages that meet the criteria specified by the query:</p><p><span class="emphasis"><em>First Window:</em></span></p><pre class="screen"> -$ ./drain -f "xml; {link:{x-bindings:[{key:'weather', -arguments:{xquery:\"$(cat rdu.xquery )\"}}]}}" - </pre><p>In another window, let's create an XML message that meets the criteria in the query, and place it in the file <code class="filename">rdu.xml</code>:</p><pre class="programlisting"> -<weather> - <station>Raleigh-Durham International Airport (KRDU)</station> - <wind_speed_mph>16</wind_speed_mph> - <temperature_f>70</temperature_f> - <dewpoint>35</dewpoint> -</weather> - </pre><p>Now let's use <span class="command"><strong>spout</strong></span> to send this message to the XML exchange:</p><p><span class="emphasis"><em>Second Window:</em></span></p><pre class="screen"> -spout --content "$(cat rdu.xml)" xml/weather - </pre><p>Returning to the first window, we see that the message has been received:</p><pre class="screen">$ ./drain -f "xml; {link:{x-bindings:[{exchange:'xml', key:'weather', arguments:{xquery:\"$(cat rdu.xquery )\"}}]}}" -Message(properties={qpid.subject:weather, spout-id:31c431de-593f-4bec-a3dd-29717bd945d3:0}, -content='<weather> - <station>Raleigh-Durham International Airport (KRDU)</station> - <wind_speed_mph>16</wind_speed_mph> - <temperature_f>40</temperature_f> - <dewpoint>35</dewpoint> -</weather>') - </pre></div></div><br class="example-break"></div><div class="section" title="3.3.5. Address String Options - Reference"><div class="titlepage"><div><div><h4 class="title"><a name="id2604667"></a>3.3.5. Address String Options - Reference</h4></div></div></div><div class="table"><a name="id2578819"></a><p class="title"><b>Table 2.1. Address String Options</b></p><div class="table-contents"><table summary="Address String Options" width="100%" border="1"><colgroup><col><col><col></colgroup><thead><tr><th>option</th><th>value</th><th>semantics</th></tr></thead><tbody><tr><td> - assert - </td><td> - one of: always, never, sender or receiver - </td><td> - Asserts that the properties specified in the node option - match whatever the address resolves to. If they do not, - resolution fails and an exception is raised. - </td></tr><tr><td> - create - </td><td> - one of: always, never, sender or receiver - </td><td> - Creates the node to which an address refers if it does - not exist. No error is raised if the node does - exist. The details of the node may be specified in the - node option. - </td></tr><tr><td> - delete - </td><td> - one of: always, never, sender or receiver - </td><td> - Delete the node when the sender or receiver is closed. - </td></tr><tr><td> - node - </td><td> - A nested map containing the entries shown in <a class="xref" href="ch02s03.html#table-node-properties" title="Table 2.2. Node Properties">Table 2.2, “Node Properties”</a>. - </td><td> - Specifies properties of the node to which the address - refers. These are used in conjunction with the assert or - create options. - </td></tr><tr><td> - link - </td><td> - A nested map containing the entries shown in <a class="xref" href="ch02s03.html#table-link-properties" title="Table 2.3. Link Properties">Table 2.3, “Link Properties”</a>. - </td><td> - Used to control the establishment of a conceptual link - from the client application to or from the target/source - address. - </td></tr><tr><td> - mode - </td><td> - one of: browse, consume - </td><td> - This option is only of relevance for source addresses - that resolve to a queue. If browse is specified the - messages delivered to the receiver are left on the queue - rather than being removed. If consume is specified the - normal behaviour applies; messages are removed from teh - queue once the client acknoweldges their receipt. - </td></tr></tbody></table></div></div><br class="table-break"><div class="table"><a name="table-node-properties"></a><p class="title"><b>Table 2.2. Node Properties</b></p><div class="table-contents"><table summary="Node Properties" width="100%" border="1"><colgroup><col><col><col></colgroup><thead><tr><th>property</th><th>value</th><th>semantics</th></tr></thead><tbody><tr><td> - type - </td><td> - topic, queue - </td><td> - Indicates the type of the node. - </td></tr><tr><td> - durable - </td><td> - True, False - </td><td> - Indicates whether the node survives a loss of - volatile storage e.g. if the broker is restarted. - </td></tr><tr><td> - x-declare - </td><td> - A nested map whose values correspond to the valid fields - on an AMQP 0-10 queue-declare or exchange-declare - command. - </td><td> - These values are used to fine tune the creation or - assertion process. Note however that they are protocol - specific. - </td></tr><tr><td> - x-bindings - </td><td> - A nested list in which each binding is represented by - a map. The entries of the map for a binding contain - the fields that describe an AMQP 0-10 binding. Here is - the format for x-bindings: - -<pre class="programlisting"> -[ - { - exchange: <exchange>, - queue: <queue>, - key: <key>, - arguments: { - <key_1>: <value_1>, - ..., - <key_n>: <value_n> } - }, - ... -] -</pre> - </td><td> - In conjunction with the create option, each of these - bindings is established as the address is resolved. In - conjunction with the assert option, the existence of - each of these bindings is verified during - resolution. Again, these are protocol specific. - </td></tr></tbody></table></div></div><br class="table-break"><div class="table"><a name="table-link-properties"></a><p class="title"><b>Table 2.3. Link Properties</b></p><div class="table-contents"><table summary="Link Properties" width="100%" border="1"><colgroup><col><col><col></colgroup><thead><tr><th>option</th><th>value</th><th>semantics</th></tr></thead><tbody><tr><td> - reliability - </td><td> - one of: unreliable, at-least-once, at-most-once, exactly-once - </td><td> - Reliability indicates the level of reliability that - the sender or receiver. <code class="literal">unreliable</code> - and <code class="literal">at-most-once</code> are currently - treated as synonyms, and allow messages to be lost if - a broker crashes or the connection to a broker is - lost. <code class="literal">at-least-once</code> guarantees that - a message is not lost, but duplicates may be - received. <code class="literal">exactly-once</code> guarantees - that a message is not lost, and is delivered precisely - once. - </td></tr><tr><td> - durable - </td><td> - True, False - </td><td> - Indicates whether the link survives a loss of - volatile storage e.g. if the broker is restarted. - </td></tr><tr><td> - x-declare - </td><td> - A nested map whose values correspond to the valid fields - of an AMQP 0-10 queue-declare command. - </td><td> - These values can be used to customise the subscription - queue in the case of receiving from an exchange. Note - however that they are protocol specific. - </td></tr><tr><td> - x-subscribe - </td><td> - A nested map whose values correspond to the valid fields - of an AMQP 0-10 message-subscribe command. - </td><td> - These values can be used to customise the subscription. - </td></tr><tr><td> - x-bindings - </td><td> - A nested list each of whose entries is a map that may - contain fields (queue, exchange, key and arguments) - describing an AMQP 0-10 binding. - </td><td> - These bindings are established during resolution - independent of the create option. They are considered - logically part of the linking process rather than of - node creation. - </td></tr></tbody></table></div></div><br class="table-break"></div></div><div class="section" title="3.4. Address String Grammar"><div class="titlepage"><div><div><h3 class="title"><a name="section-address-string-bnf"></a>3.4. Address String Grammar</h3></div></div></div><p>This section provides a formal grammar for address strings.</p><p title="Tokens"><b>Tokens. </b>The following regular expressions define the tokens used - to parse address strings:</p><pre class="programlisting"> -LBRACE: \\{ -RBRACE: \\} -LBRACK: \\[ -RBRACK: \\] -COLON: : -SEMI: ; -SLASH: / -COMMA: , -NUMBER: [+-]?[0-9]*\\.?[0-9]+ -ID: [a-zA-Z_](?:[a-zA-Z0-9_-]*[a-zA-Z0-9_])? -STRING: "(?:[^\\\\"]|\\\\.)*"|\'(?:[^\\\\\']|\\\\.)*\' -ESC: \\\\[^ux]|\\\\x[0-9a-fA-F][0-9a-fA-F]|\\\\u[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F] -SYM: [....@$^!+-] -WSPACE: [ \\n\\r\\t]+ -</pre><p title="Grammar"><b>Grammar. </b>The formal grammar for addresses is given below:</p><pre class="programlisting"> -address := name [ "/" subject ] [ ";" options ] - name := ( part | quoted )+ -subject := ( part | quoted | "/" )* - quoted := STRING / ESC - part := LBRACE / RBRACE / COLON / COMMA / NUMBER / ID / SYM -options := map - map := "{" ( keyval ( "," keyval )* )? "}" - keyval "= ID ":" value - value := NUMBER / STRING / ID / map / list - list := "[" ( value ( "," value )* )? "]" - </pre><p title="Address String Options"><b>Address String Options. </b>The address string options map supports the following parameters:</p><pre class="programlisting"> -<name> [ / <subject> ] ; { - create: always | sender | receiver | never, - delete: always | sender | receiver | never, - assert: always | sender | receiver | never, - mode: browse | consume, - node: { - type: queue | topic, - durable: True | False, - x-declare: { ... <declare-overrides> ... }, - x-bindings: [<binding_1>, ... <binding_n>] - }, - link: { - name: <link-name>, - durable: True | False, - reliability: unreliable | at-most-once | at-least-once | exactly-once, - x-declare: { ... <declare-overrides> ... }, - x-bindings: [<binding_1>, ... <binding_n>], - x-subscribe: { ... <subscribe-overrides> ... } - } -} -</pre><div class="itemizedlist" title="Create, Delete, and Assert Policies"><p class="title"><b>Create, Delete, and Assert Policies</b></p><p>The create, delete, and assert policies specify who should - perfom the associated action:</p><ul class="itemizedlist" type="disc"><li class="listitem"><p><span class="emphasis"><em>always</em></span>: the action is performed by any messaging client</p></li><li class="listitem"><p><span class="emphasis"><em>sender</em></span>: the action is only performed by a sender</p></li><li class="listitem"><p><span class="emphasis"><em>receiver</em></span>: the action is only performed by a receiver</p></li><li class="listitem"><p><span class="emphasis"><em>never</em></span>: the action is never performed (this is the default)</p></li></ul></div><div class="itemizedlist" title="Node-Type"><p class="title"><b>Node-Type</b></p><p>The node-type is one of:</p><ul class="itemizedlist" type="disc"><li class="listitem"><p><span class="emphasis"><em>topic</em></span>: in the AMQP 0-10 - mapping, a topic node defaults to the topic exchange, x-declare - may be used to specify other exchange types</p></li><li class="listitem"><p><span class="emphasis"><em>queue</em></span>: this is the default node-type</p></li></ul></div></div><div class="footnotes"><br><hr width="100" align="left"><div class="footnote"><p><sup>[<a name="ftn.id2609913" href="#id2609913" class="para">1</a>] </sup>The terms <span class="emphasis"><em>queue</em></span> and - <span class="emphasis"><em>topic</em></span> here were chosen to align with - their meaning in JMS. These two addressing 'patterns', - queue and topic, are sometimes refered as point-to-point - and publish-subscribe. AMQP 0-10 has an exchange type - called a <span class="emphasis"><em>topic exchange</em></span>. When the term - <span class="emphasis"><em>topic</em></span> occurs alone, it refers to a - Messaging API topic, not the topic - exchange.</p></div><div class="footnote"><p><sup>[<a name="ftn.id2621138" href="#id2621138" class="para">2</a>] </sup>There are exceptions to this rule; for instance, - a receiver can use <code class="literal">browse</code> mode, which leaves - messages on the queue for other receivers to - read.</p></div><div class="footnote"><p><sup>[<a name="ftn.id2614455" href="#id2614455" class="para">3</a>] </sup>The AMQP 0-10 implementation is the only one - that currently exists.</p></div><div class="footnote"><p><sup>[<a name="ftn.id2598385" href="#id2598385" class="para">4</a>] </sup>In AMQP 0-10, messages are sent to - exchanges, and read from queues. The Messaging API also - allows a sender to send messages to a queue; internally, - Qpid implements this by sending the message to the default - exchange, with the name of the queue as the routing key. The - Messaging API also allows a receiver to receive messages - from a topic; internally, Qpid implements this by setting up - a private subscription queue for the receiver and binding - the subscription queue to the exchange that corresponds to - the topic.</p></div><div class="footnote"><p><sup>[<a name="ftn.id2589472" href="#id2589472" class="para">5</a>] </sup>Currently, the Python and C++ - implementations of <span class="command"><strong>drain</strong></span> and - <span class="command"><strong>spout</strong></span> have slightly different - options. This tutorial uses the C++ implementation. The - options will be reconciled in the near - future.</p></div></div></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch02s02.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="ch02.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="ch02s04.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">2. A Simple Messaging Program in Python </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> 4. Logging</td></tr></table></div></body></html> +</pre><div class="calloutlist"><table border="0" summary="Callout list"><tr><td width="5%" valign="top" align="left"><p><a name="callout-csharp-using"></a><a href="#hello-csharp-using">(1)</a> </p></td><td valign="top" align="left"><p>Selects the Qpid Messaging namespace. A project reference to the Org.Apache.Qpid.Messaging dll defines the Qpid Messaging namespace objects and methods.</p></td></tr><tr><td width="5%" valign="top" align="left"><p><a name="callout-csharp-open"></a><a href="#hello-csharp-open">(2)</a> </p></td><td valign="top" align="left"><p>Establishes the connection with the messaging broker.</p></td></tr><tr><td width="5%" valign="top" align="left"><p><a name="callout-csharp-session"></a><a href="#hello-csharp-session">(3)</a> </p></td><td valign="top" align="left"><p>Creates a session object, which maintains the state of all interactions with the messaging broker, and manages senders and receivers.</p></td></tr><tr><td width="5%" valign="top" align="left">< p><a name="callout-csharp-receiver"></a><a href="#hello-csharp-receiver">(4)</a> </p></td><td valign="top" align="left"><p>Creates a receiver that reads from the given address.</p></td></tr><tr><td width="5%" valign="top" align="left"><p><a name="callout-csharp-sender"></a><a href="#hello-csharp-sender">(5)</a> </p></td><td valign="top" align="left"><p>Creates a sender that sends to the given address.</p></td></tr><tr><td width="5%" valign="top" align="left"><p><a name="callout-csharp-fetch"></a><a href="#hello-csharp-fetch">(6)</a> </p></td><td valign="top" align="left"><p>Reads the next message. The duration is optional, if omitted, will wait indefinitely for the next message.</p></td></tr><tr><td width="5%" valign="top" align="left"><p><a name="callout-csharp-acknowledge"></a><a href="#hello-csharp-acknowledge">(7)</a> </p></td><td valign="top" align="left"><p>Acknowledges messages that have been read. To guarantee delivery, a message remains on the messaging broker until it is acknowledged by a client. session.acknowledge() acknowledges all unacknowledged messages for the given session—this allows acknowledgements to be batched, which is more efficient than acknowledging messages individually.</p></td></tr><tr><td width="5%" valign="top" align="left"><p><a name="callout-csharp-close"></a><a href="#hello-csharp-close">(8)</a> </p></td><td valign="top" align="left"><p>Closes the connection, all sessions managed by the connection, and all senders and receivers managed by each session.</p></td></tr></table></div></div></div><br class="example-break"></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch02s02.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="ch02.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="ch02s04.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">2. A Simple Messagi ng Program in Python </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> 4. Addresses</td></tr></table></div></body></html> --------------------------------------------------------------------- Apache Qpid - AMQP Messaging Implementation Project: http://qpid.apache.org Use/Interact: mailto:[email protected]
