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 2014/08/13 18:18:58 UTC

svn commit: r1617752 - in /qpid/proton/branches/examples/tutorial: ./ _build/doctrees/ _build/html/ _build/html/_sources/

Author: gsim
Date: Wed Aug 13 16:18:58 2014
New Revision: 1617752

URL: http://svn.apache.org/r1617752
Log:
Updated docs

Modified:
    qpid/proton/branches/examples/tutorial/_build/doctrees/environment.pickle
    qpid/proton/branches/examples/tutorial/_build/doctrees/tutorial.doctree
    qpid/proton/branches/examples/tutorial/_build/html/_sources/tutorial.txt
    qpid/proton/branches/examples/tutorial/_build/html/index.html
    qpid/proton/branches/examples/tutorial/_build/html/searchindex.js
    qpid/proton/branches/examples/tutorial/_build/html/tutorial.html
    qpid/proton/branches/examples/tutorial/tutorial.rst

Modified: qpid/proton/branches/examples/tutorial/_build/doctrees/environment.pickle
URL: http://svn.apache.org/viewvc/qpid/proton/branches/examples/tutorial/_build/doctrees/environment.pickle?rev=1617752&r1=1617751&r2=1617752&view=diff
==============================================================================
Binary files - no diff available.

Modified: qpid/proton/branches/examples/tutorial/_build/doctrees/tutorial.doctree
URL: http://svn.apache.org/viewvc/qpid/proton/branches/examples/tutorial/_build/doctrees/tutorial.doctree?rev=1617752&r1=1617751&r2=1617752&view=diff
==============================================================================
Binary files - no diff available.

Modified: qpid/proton/branches/examples/tutorial/_build/html/_sources/tutorial.txt
URL: http://svn.apache.org/viewvc/qpid/proton/branches/examples/tutorial/_build/html/_sources/tutorial.txt?rev=1617752&r1=1617751&r2=1617752&view=diff
==============================================================================
--- qpid/proton/branches/examples/tutorial/_build/html/_sources/tutorial.txt (original)
+++ qpid/proton/branches/examples/tutorial/_build/html/_sources/tutorial.txt Wed Aug 13 16:18:58 2014
@@ -54,10 +54,14 @@ connection).
 
 To be notified of this we pass a reference to self as the handler in
 ``connect()`` and define an ``on_connection_remote_open()`` method
-within which we can create our receiver and sender using the
-connection context we obtained from the earlier ``connect()`` call,
-and passing the handler implementations defined by
-``HelloWorldReceiver`` and ``HelloWorldSender`` respectively.
+within which we can create our receiver using the connection context
+we obtained from the earlier ``connect()`` call, and passing the
+handler implementation defined by ``HelloWorldReceiver``. When the
+remote peer confirms the establishment of that receiver we get a
+callback on ``on_link_remote_open()`` and that is where we then create
+our sender, passing it the ``HelloWorldSender`` handler. Delaying the
+creation of the sender until the receiver is established avoids losing
+messages even when these are not queued up by the remote peer.
 
 We'll add definitions to ``HelloWorld`` of ``on_link_remote_close()``
 and ``on_connection_remote_close()`` also, so that we can be notified
@@ -113,49 +117,19 @@ So now we have our example working witho
 The Basics
 ==========
 
-So much for hello world! Let's explore a little more. Separating out
-the receiving logic and receiving messages until the program is
-stopped, we get the following example (which has the same broker
-requirements mentioned for the first hello world example).
+TODO: These examples show reliable (at-least-once) send and receive
+with reconnect ability. Need to write some explanation. Could also do
+with some further cleanup.
+
 
 .. literalinclude:: simple_recv.py
    :lines: 21-
    :linenos:
 
-Often we want to be notified whether the messages we send arrive at
-their intended destination. We can do that by specifying a handler for
-the sender we create with an ``on_message()`` method defined on it. This
-will be called whenever a message sent by the sender is accepted by
-the remote peer.
-
-When sending a large number of messages, we need to consider whether
-the remote peer is able to handle them all. AMQP has a powerful flow
-control mechanism through which processes can limit the incoming flow
-of messages. If we implement a ``on_link_flow()`` method on our sender's
-handler, this will be called whenever the sender is allowed to send
-and will prevent messages building up due to the receivers inability
-to process them.
-
-Separating out the sending logic, extending it to send a given number
-of messages and incorporating the two handler methods just described
-we get:
-
 .. literalinclude:: simple_send.py
    :lines: 21-
    :linenos:
 
-============
-Reconnecting
-============
-
-TODO: This shows a basic reconnect for the receiver. Need some backoff
-logic which requires some sort of support for timers in the event
-loop.
-
-.. literalinclude:: simple_recv_2.py
-   :lines: 21-
-   :linenos:
-
 ================
 Request/Response
 ================

Modified: qpid/proton/branches/examples/tutorial/_build/html/index.html
URL: http://svn.apache.org/viewvc/qpid/proton/branches/examples/tutorial/_build/html/index.html?rev=1617752&r1=1617751&r2=1617752&view=diff
==============================================================================
--- qpid/proton/branches/examples/tutorial/_build/html/index.html (original)
+++ qpid/proton/branches/examples/tutorial/_build/html/index.html Wed Aug 13 16:18:58 2014
@@ -55,7 +55,6 @@
 <li class="toctree-l1"><a class="reference internal" href="tutorial.html">Hello World!</a></li>
 <li class="toctree-l1"><a class="reference internal" href="tutorial.html#hello-world-direct">Hello World, Direct!</a></li>
 <li class="toctree-l1"><a class="reference internal" href="tutorial.html#the-basics">The Basics</a></li>
-<li class="toctree-l1"><a class="reference internal" href="tutorial.html#reconnecting">Reconnecting</a></li>
 <li class="toctree-l1"><a class="reference internal" href="tutorial.html#request-response">Request/Response</a></li>
 </ul>
 </div>

Modified: qpid/proton/branches/examples/tutorial/_build/html/searchindex.js
URL: http://svn.apache.org/viewvc/qpid/proton/branches/examples/tutorial/_build/html/searchindex.js?rev=1617752&r1=1617751&r2=1617752&view=diff
==============================================================================
--- qpid/proton/branches/examples/tutorial/_build/html/searchindex.js (original)
+++ qpid/proton/branches/examples/tutorial/_build/html/searchindex.js Wed Aug 13 16:18:58 2014
@@ -1 +1 @@
-Search.setIndex({objects:{},terms:{all:1,concept:[],illustr:1,code:1,follow:1,incas:1,send:1,program:1,exit:[],sent:1,on_messag:1,util:1,mechan:1,veri:1,did:1,helloworld:1,"try":1,prevent:1,direct:[0,1],slithi:1,second:1,pass:1,further:1,port:[],rath:1,what:[],repli:1,abl:1,"while":1,"new":[],method:1,honour:[],gener:1,here:1,bodi:1,let:1,address:1,modifi:1,valu:[],acceptor:1,convert:1,sender:1,queue:1,credit:1,chang:[],ourselv:1,via:[],incomingmessagehandl:1,wit:1,total:1,establish:1,twa:1,from:1,describ:1,would:1,commun:1,two:1,handler:1,call:1,msg:1,scope:[],tell:1,more:1,sort:1,desir:1,relat:[],particular:1,send_msg:1,given:1,cach:1,must:[],dictat:1,none:1,endpoint:1,work:1,can:1,def:1,control:1,want:1,process:1,accept:1,topic:1,explor:1,listent:[],occur:1,delai:1,rather:1,anoth:1,conn:1,simpl:1,earlier:1,befor:[],associ:[],demonstr:1,alloc:1,issu:1,callback:1,allow:1,enter:1,volum:1,oper:1,over:1,remote_condit:1,becaus:1,through:1,reconnect:[0,1],still:1,dynam:1,paramet:[],conj
 unct:1,disconnect:1,link_flow:[],borogrov:1,helloworldsend:1,might:1,easier:1,them:1,"return":1,handl:1,"break":1,mention:1,flowcontrol:1,now:1,mome:1,strive:1,stopper:[],name:1,separ:1,reactiv:1,fulli:1,ensur:1,gire:1,connect:1,our:1,helloworldreceiv:1,todo:1,event:1,special:1,out:1,accomplish:[],req:1,content:0,laid:1,print:1,after:[],differ:1,reason:1,recv:1,shortest:1,care:[],timer:1,messagingcontext:1,first:1,origin:1,rang:1,notifi:1,directli:1,upper:1,onc:1,number:1,restrict:1,instruct:[],done:[],messag:1,open:1,brillig:1,tove:1,construct:1,too:1,on_connection_remote_clos:1,"final":1,listen:1,option:1,specifi:1,provid:1,part:1,than:1,whenev:1,remot:1,structur:1,were:1,"function":1,ani:1,have:1,need:1,requisit:[],inform:[],self:1,client:1,note:1,also:1,without:1,take:1,which:1,singl:1,uppercas:1,gymbl:1,incorpor:1,though:1,object:1,react:1,on_disconnect:1,"class":1,tradit:1,don:1,url:1,later:[],flow:1,doe:1,runtim:[],gracefulli:[],recipi:1,show:1,particularli:1,involv:1,onli:1,
 configur:1,should:[],local:[],variou:1,get:1,stop:1,outgoingmessagehandl:1,remote_sourc:1,requir:1,enabl:1,cleanli:[],common:1,contain:[],where:1,on_connection_remote_open:1,respond:1,set:1,see:1,respons:[0,1],close:1,kei:[],pattern:1,written:1,won:1,"import":1,inabl:1,extend:1,style:1,last:1,howev:1,against:[],instanc:1,context:1,logic:1,simpli:1,arriv:1,pop:1,shutdown:[],respect:1,on_link_remote_open:1,coupl:1,connectionhandl:[],due:1,trigger:1,interest:[],basic:[0,1],next_request:1,togeth:1,unauthent:[],"case":1,look:1,servic:1,wabe:1,aim:1,defin:1,invok:1,error:1,loop:1,outgrab:1,helper:1,readi:1,toolkit:1,worri:1,destin:1,senderhandl:[],incom:1,"__init__":1,receiv:1,make:1,same:1,mimsi:1,finish:[],receiverhandl:[],hang:[],temporari:1,implement:1,appropri:1,keyboardinterrupt:1,well:1,exampl:[0,1],thi:1,everyth:1,protocol:1,just:1,obtain:1,except:1,littl:1,add:1,els:1,match:1,build:1,applic:1,on_link_remote_clos:1,proton:[0,1],world:[0,1],specif:[],server:1,necessari:1,either:1,o
 ften:1,acknowledg:1,eventloop:1,some:[0,1],back:1,handshak:1,confirm:1,definit:1,outgo:[],larg:1,localhost:1,refer:1,run:1,on_link_flow:1,power:1,broker:1,on_accept:1,host:1,peer:1,about:1,actual:1,socket:[],most:[],constructor:1,own:1,within:1,automat:[],drain:1,down:1,proton_util:[],your:[],wai:[],aren:1,support:1,start:1,much:1,interfac:[],includ:1,suit:1,deliveri:[],offer:1,link:1,line:1,"true":1,count:[],made:1,possibl:1,whether:1,until:1,limit:1,similar:1,expect:1,creat:1,request:[0,1],doesn:[],backoff:1,amqp:1,when:1,detail:1,proton_ev:1,"default":1,other:[],test:1,you:1,intend:1,sequenc:1,consid:1,rule:1,ignor:[],fact:[],time:[],reply_to:1,hello:[0,1]},objtypes:{},titles:["Some Proton Examples","Hello World!"],objnames:{},filenames:["index","tutorial"]})
\ No newline at end of file
+Search.setIndex({objects:{},terms:{all:1,concept:[],illustr:1,code:1,abil:1,follow:1,incas:1,send:1,program:1,larg:1,sent:1,on_messag:1,util:1,mechan:[],veri:1,did:1,helloworld:1,"try":1,prevent:[],direct:[0,1],slithi:1,second:1,pass:1,further:1,port:[],rath:1,even:1,what:[],repli:1,abl:1,"while":1,remote_sourc:1,method:1,honour:[],gener:1,here:1,bodi:1,let:1,address:1,modifi:1,valu:[],acceptor:1,convert:1,sender:1,queue:1,credit:1,chang:[],ourselv:1,via:[],incomingmessagehandl:1,wit:1,total:1,establish:1,twa:1,from:1,describ:[],would:1,commun:1,two:[],handler:1,call:1,msg:1,scope:[],tell:1,more:1,sort:[],desir:1,relat:[],particular:1,actual:1,given:1,cach:1,must:[],dictat:1,none:1,endpoint:1,work:1,can:1,def:1,control:1,want:[],process:1,accept:1,topic:1,explor:[],listent:[],occur:1,delai:1,rather:1,anoth:1,write:1,conn:1,simpl:1,after:1,befor:[],callback:1,associ:[],demonstr:1,alloc:1,issu:1,inform:[],incorpor:[],enter:1,volum:1,oper:1,least:1,over:1,remote_condit:1,becaus:1,throu
 gh:1,reconnect:1,still:1,dynam:1,paramet:[],conjunct:1,disconnect:1,link_flow:[],borogrov:1,helloworldsend:1,might:1,easier:1,them:1,"return":1,handl:1,"break":1,mention:[],flowcontrol:1,now:1,mome:1,strive:1,stopper:[],name:1,separ:[],reactiv:1,fulli:1,proton_util:[],gire:1,connect:1,our:1,helloworldreceiv:1,todo:1,event:1,special:1,out:1,accomplish:[],req:1,content:0,laid:1,print:1,earlier:1,differ:1,reason:1,recv:1,shortest:1,care:[],could:1,timer:[],messagingcontext:1,first:1,origin:1,rang:1,notifi:1,directli:1,upper:1,onc:1,number:[],restrict:1,instruct:[],done:[],messag:1,open:1,brillig:1,tove:1,construct:1,too:1,interfac:[],"final":1,listen:1,option:1,specifi:1,provid:1,part:1,than:1,whenev:[],remot:1,structur:1,were:1,deliveri:[],ani:1,have:1,need:1,requisit:[],min:1,self:1,client:1,note:1,also:1,without:1,build:[],which:1,singl:1,uppercas:1,gymbl:1,allow:1,though:1,object:1,react:1,on_disconnect:1,"class":1,tradit:1,don:1,url:1,later:[],flow:1,doe:1,runtim:[],gracefulli:[],
 recipi:1,show:1,particularli:1,involv:1,onli:1,configur:1,should:[],queu:1,local:[],variou:1,get:1,stop:1,outgoingmessagehandl:1,"new":[],requir:1,enabl:1,cleanli:[],common:1,contain:[],where:1,on_connection_remote_open:1,respond:1,set:1,see:1,respons:[0,1],close:1,kei:[],pattern:1,written:1,won:1,"import":1,inabl:[],extend:[],style:1,last:1,howev:1,against:[],instanc:1,context:1,logic:[],simpli:1,schedul:1,arriv:[],proton:[0,1],shutdown:[],respect:[],on_link_remote_open:1,coupl:1,connectionhandl:[],due:1,trigger:1,interest:[],basic:[0,1],next_request:1,togeth:1,backoff:[],"case":1,look:1,servic:1,wabe:1,aim:1,defin:1,invok:1,error:1,on_tim:1,loop:1,outgrab:1,helper:1,readi:1,toolkit:1,worri:1,destin:[],senderhandl:[],incom:1,"__init__":1,receiv:1,make:1,same:1,mimsi:1,finish:[],receiverhandl:[],hang:[],temporari:1,implement:1,appropri:1,keyboardinterrupt:1,well:1,exampl:[0,1],thi:1,everyth:1,explan:1,protocol:1,just:1,obtain:1,except:1,littl:1,add:1,other:[],els:1,match:1,take:1,ap
 plic:1,on_link_remote_clos:1,pop:1,world:[0,1],specif:[],server:1,necessari:1,either:1,lose:1,often:1,acknowledg:1,eventloop:1,some:[0,1],back:1,handshak:1,confirm:1,avoid:1,definit:1,outgo:[],exit:[],localhost:1,refer:1,run:1,on_link_flow:1,power:[],is_receiv:1,broker:1,on_accept:1,host:1,peer:1,about:1,send_msg:1,socket:[],most:[],constructor:1,own:1,within:1,automat:[],drain:1,down:1,ensur:1,your:[],wai:[],aren:1,support:1,start:1,much:[],on_connection_remote_clos:1,includ:1,suit:1,"function":1,creation:1,offer:1,link:1,line:1,"true":1,count:[],made:1,possibl:1,whether:[],until:1,limit:[],similar:1,expect:1,creat:1,request:[0,1],doesn:[],unauthent:[],amqp:1,when:1,detail:1,proton_ev:1,"default":1,cleanup:1,test:1,you:1,intend:[],sequenc:1,consid:[],reliabl:1,rule:1,ignor:[],fact:[],time:1,reply_to:1,hello:[0,1]},objtypes:{},titles:["Some Proton Examples","Hello World!"],objnames:{},filenames:["index","tutorial"]})
\ No newline at end of file

Modified: qpid/proton/branches/examples/tutorial/_build/html/tutorial.html
URL: http://svn.apache.org/viewvc/qpid/proton/branches/examples/tutorial/_build/html/tutorial.html?rev=1617752&r1=1617751&r2=1617752&view=diff
==============================================================================
--- qpid/proton/branches/examples/tutorial/_build/html/tutorial.html (original)
+++ qpid/proton/branches/examples/tutorial/_build/html/tutorial.html Wed Aug 13 16:18:58 2014
@@ -90,7 +90,10 @@ sending and receiving a single message.<
 35
 36
 37
-38</pre></div></td><td class="code"><div class="highlight"><pre><span class="kn">from</span> <span class="nn">proton</span> <span class="kn">import</span> <span class="n">Message</span>
+38
+39
+40
+41</pre></div></td><td class="code"><div class="highlight"><pre><span class="kn">from</span> <span class="nn">proton</span> <span class="kn">import</span> <span class="n">Message</span>
 <span class="kn">from</span> <span class="nn">proton_events</span> <span class="kn">import</span> <span class="n">EventLoop</span><span class="p">,</span> <span class="n">IncomingMessageHandler</span>
 
 <span class="k">class</span> <span class="nc">HelloWorldReceiver</span><span class="p">(</span><span class="n">IncomingMessageHandler</span><span class="p">):</span>
@@ -111,7 +114,10 @@ sending and receiving a single message.<
 
     <span class="k">def</span> <span class="nf">on_connection_remote_open</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">):</span>
         <span class="bp">self</span><span class="o">.</span><span class="n">conn</span><span class="o">.</span><span class="n">receiver</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">address</span><span class="p">,</span> <span class="n">handler</span><span class="o">=</span><span class="n">HelloWorldReceiver</span><span class="p">())</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">conn</span><span class="o">.</span><span class="n">sender</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">address</span><span class="p">,</span> <span class="n">handler</span><span class="o">=</span><span class="n">HelloWorldSender</span><span class="p">())</span>
+
+    <span class="k">def</span> <span class="nf">on_link_remote_open</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">):</span>
+        <span class="k">if</span> <span class="n">event</span><span class="o">.</span><span class="n">link</span><span class="o">.</span><span class="n">is_receiver</span><span class="p">:</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">conn</span><span class="o">.</span><span class="n">sender</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">address</span><span class="p">,</span> <span class="n">handler</span><span class="o">=</span><span class="n">HelloWorldSender</span><span class="p">())</span>
 
     <span class="k">def</span> <span class="nf">on_link_remote_close</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">):</span>
         <span class="bp">self</span><span class="o">.</span><span class="n">closed</span><span class="p">(</span><span class="n">event</span><span class="o">.</span><span class="n">link</span><span class="o">.</span><span class="n">remote_condition</span><span class="p">)</span>
@@ -167,10 +173,14 @@ fully established, i.e. until the remote
 connection).</p>
 <p>To be notified of this we pass a reference to self as the handler in
 <tt class="docutils literal"><span class="pre">connect()</span></tt> and define an <tt class="docutils literal"><span class="pre">on_connection_remote_open()</span></tt> method
-within which we can create our receiver and sender using the
-connection context we obtained from the earlier <tt class="docutils literal"><span class="pre">connect()</span></tt> call,
-and passing the handler implementations defined by
-<tt class="docutils literal"><span class="pre">HelloWorldReceiver</span></tt> and <tt class="docutils literal"><span class="pre">HelloWorldSender</span></tt> respectively.</p>
+within which we can create our receiver using the connection context
+we obtained from the earlier <tt class="docutils literal"><span class="pre">connect()</span></tt> call, and passing the
+handler implementation defined by <tt class="docutils literal"><span class="pre">HelloWorldReceiver</span></tt>. When the
+remote peer confirms the establishment of that receiver we get a
+callback on <tt class="docutils literal"><span class="pre">on_link_remote_open()</span></tt> and that is where we then create
+our sender, passing it the <tt class="docutils literal"><span class="pre">HelloWorldSender</span></tt> handler. Delaying the
+creation of the sender until the receiver is established avoids losing
+messages even when these are not queued up by the remote peer.</p>
 <p>We&#8217;ll add definitions to <tt class="docutils literal"><span class="pre">HelloWorld</span></tt> of <tt class="docutils literal"><span class="pre">on_link_remote_close()</span></tt>
 and <tt class="docutils literal"><span class="pre">on_connection_remote_close()</span></tt> also, so that we can be notified
 if the broker we are connected to closes either link or the connection
@@ -291,10 +301,9 @@ event (line 33).</p>
 </div>
 <div class="section" id="the-basics">
 <h1>The Basics<a class="headerlink" href="#the-basics" title="Permalink to this headline">¶</a></h1>
-<p>So much for hello world! Let&#8217;s explore a little more. Separating out
-the receiving logic and receiving messages until the program is
-stopped, we get the following example (which has the same broker
-requirements mentioned for the first hello world example).</p>
+<p>TODO: These examples show reliable (at-least-once) send and receive
+with reconnect ability. Need to write some explanation. Could also do
+with some further cleanup.</p>
 <div class="highlight-python"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre> 1
  2
  3
@@ -325,18 +334,46 @@ requirements mentioned for the first hel
 28
 29
 30
-31</pre></div></td><td class="code"><div class="highlight"><pre><span class="kn">from</span> <span class="nn">proton_events</span> <span class="kn">import</span> <span class="n">EventLoop</span><span class="p">,</span> <span class="n">IncomingMessageHandler</span>
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52</pre></div></td><td class="code"><div class="highlight"><pre><span class="kn">import</span> <span class="nn">time</span>
+<span class="kn">from</span> <span class="nn">proton_events</span> <span class="kn">import</span> <span class="n">IncomingMessageHandler</span><span class="p">,</span> <span class="n">EventLoop</span>
 
 <span class="k">class</span> <span class="nc">Recv</span><span class="p">(</span><span class="n">IncomingMessageHandler</span><span class="p">):</span>
     <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">eventloop</span><span class="p">,</span> <span class="n">host</span><span class="p">,</span> <span class="n">address</span><span class="p">):</span>
         <span class="bp">self</span><span class="o">.</span><span class="n">eventloop</span> <span class="o">=</span> <span class="n">eventloop</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">conn</span> <span class="o">=</span> <span class="n">eventloop</span><span class="o">.</span><span class="n">connect</span><span class="p">(</span><span class="n">host</span><span class="p">,</span> <span class="n">handler</span><span class="o">=</span><span class="bp">self</span><span class="p">)</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">host</span> <span class="o">=</span> <span class="n">host</span>
         <span class="bp">self</span><span class="o">.</span><span class="n">address</span> <span class="o">=</span> <span class="n">address</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">delay</span> <span class="o">=</span> <span class="mi">0</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">connect</span><span class="p">()</span>
+
+    <span class="k">def</span> <span class="nf">connect</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">conn</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">eventloop</span><span class="o">.</span><span class="n">connect</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">host</span><span class="p">,</span> <span class="n">handler</span><span class="o">=</span><span class="bp">self</span><span class="p">)</span>
 
     <span class="k">def</span> <span class="nf">on_message</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">):</span>
         <span class="k">print</span> <span class="n">event</span><span class="o">.</span><span class="n">message</span><span class="o">.</span><span class="n">body</span>
 
     <span class="k">def</span> <span class="nf">on_connection_remote_open</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">):</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">delay</span> <span class="o">=</span> <span class="mi">0</span>
         <span class="bp">self</span><span class="o">.</span><span class="n">conn</span><span class="o">.</span><span class="n">receiver</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">address</span><span class="p">)</span>
 
     <span class="k">def</span> <span class="nf">on_link_remote_close</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">):</span>
@@ -350,6 +387,20 @@ requirements mentioned for the first hel
             <span class="k">print</span> <span class="s">&quot;Closed due to </span><span class="si">%s</span><span class="s">&quot;</span> <span class="o">%</span> <span class="n">error</span>
         <span class="bp">self</span><span class="o">.</span><span class="n">conn</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
 
+    <span class="k">def</span> <span class="nf">on_disconnected</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">conn</span><span class="p">):</span>
+        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">delay</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">delay</span> <span class="o">=</span> <span class="mf">0.1</span>
+            <span class="k">print</span> <span class="s">&quot;Disconnected, reconnecting...&quot;</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">connect</span><span class="p">()</span>
+        <span class="k">else</span><span class="p">:</span>
+            <span class="k">print</span> <span class="s">&quot;Disconnected will try to reconnect after </span><span class="si">%d</span><span class="s"> seconds&quot;</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">delay</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">eventloop</span><span class="o">.</span><span class="n">schedule</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">delay</span><span class="p">,</span> <span class="n">connection</span><span class="o">=</span><span class="n">conn</span><span class="p">)</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">delay</span> <span class="o">=</span> <span class="nb">min</span><span class="p">(</span><span class="mi">10</span><span class="p">,</span> <span class="mi">2</span><span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">delay</span><span class="p">)</span>
+
+    <span class="k">def</span> <span class="nf">on_timer</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">):</span>
+        <span class="k">print</span> <span class="s">&quot;Reconnecting...&quot;</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">connect</span><span class="p">()</span>
+
     <span class="k">def</span> <span class="nf">run</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
         <span class="bp">self</span><span class="o">.</span><span class="n">eventloop</span><span class="o">.</span><span class="n">run</span><span class="p">()</span>
 
@@ -358,21 +409,6 @@ requirements mentioned for the first hel
 <span class="k">except</span> <span class="ne">KeyboardInterrupt</span><span class="p">:</span> <span class="k">pass</span>
 </pre></div>
 </td></tr></table></div>
-<p>Often we want to be notified whether the messages we send arrive at
-their intended destination. We can do that by specifying a handler for
-the sender we create with an <tt class="docutils literal"><span class="pre">on_message()</span></tt> method defined on it. This
-will be called whenever a message sent by the sender is accepted by
-the remote peer.</p>
-<p>When sending a large number of messages, we need to consider whether
-the remote peer is able to handle them all. AMQP has a powerful flow
-control mechanism through which processes can limit the incoming flow
-of messages. If we implement a <tt class="docutils literal"><span class="pre">on_link_flow()</span></tt> method on our sender&#8217;s
-handler, this will be called whenever the sender is allowed to send
-and will prevent messages building up due to the receivers inability
-to process them.</p>
-<p>Separating out the sending logic, extending it to send a given number
-of messages and incorporating the two handler methods just described
-we get:</p>
 <div class="highlight-python"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre> 1
  2
  3
@@ -421,17 +457,45 @@ we get:</p>
 46
 47
 48
-49</pre></div></td><td class="code"><div class="highlight"><pre><span class="kn">from</span> <span class="nn">proton</span> <span class="kn">import</span> <span class="n">Message</span>
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71</pre></div></td><td class="code"><div class="highlight"><pre><span class="kn">import</span> <span class="nn">time</span>
+<span class="kn">from</span> <span class="nn">proton</span> <span class="kn">import</span> <span class="n">Message</span>
 <span class="kn">from</span> <span class="nn">proton_events</span> <span class="kn">import</span> <span class="n">OutgoingMessageHandler</span><span class="p">,</span> <span class="n">EventLoop</span>
 
 <span class="k">class</span> <span class="nc">Send</span><span class="p">(</span><span class="n">OutgoingMessageHandler</span><span class="p">):</span>
     <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">eventloop</span><span class="p">,</span> <span class="n">host</span><span class="p">,</span> <span class="n">address</span><span class="p">,</span> <span class="n">messages</span><span class="p">):</span>
         <span class="bp">self</span><span class="o">.</span><span class="n">eventloop</span> <span class="o">=</span> <span class="n">eventloop</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">conn</span> <span class="o">=</span> <span class="n">eventloop</span><span class="o">.</span><span class="n">connect</span><span class="p">(</span><span class="n">host</span><span class="p">,</span> <span class="n">handler</span><span class="o">=</span><span class="bp">self</span><span class="p">)</span>
         <span class="bp">self</span><span class="o">.</span><span class="n">sent</span> <span class="o">=</span> <span class="mi">0</span>
         <span class="bp">self</span><span class="o">.</span><span class="n">confirmed</span> <span class="o">=</span> <span class="mi">0</span>
         <span class="bp">self</span><span class="o">.</span><span class="n">total</span> <span class="o">=</span> <span class="n">messages</span>
         <span class="bp">self</span><span class="o">.</span><span class="n">address</span> <span class="o">=</span> <span class="n">address</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">host</span> <span class="o">=</span> <span class="n">host</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">delay</span> <span class="o">=</span> <span class="mi">0</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">connect</span><span class="p">()</span>
+
+    <span class="k">def</span> <span class="nf">connect</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">conn</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">eventloop</span><span class="o">.</span><span class="n">connect</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">host</span><span class="p">,</span> <span class="n">handler</span><span class="o">=</span><span class="bp">self</span><span class="p">)</span>
 
     <span class="k">def</span> <span class="nf">on_link_flow</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">):</span>
         <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">sender</span><span class="o">.</span><span class="n">credit</span><span class="p">):</span>
@@ -452,87 +516,10 @@ we get:</p>
             <span class="bp">self</span><span class="o">.</span><span class="n">conn</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
 
     <span class="k">def</span> <span class="nf">on_connection_remote_open</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">):</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">sent</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">confirmed</span>
         <span class="bp">self</span><span class="o">.</span><span class="n">sender</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">conn</span><span class="o">.</span><span class="n">sender</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">address</span><span class="p">)</span>
         <span class="bp">self</span><span class="o">.</span><span class="n">sender</span><span class="o">.</span><span class="n">offered</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">total</span><span class="p">)</span>
-
-    <span class="k">def</span> <span class="nf">on_link_remote_close</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">):</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">closed</span><span class="p">(</span><span class="n">event</span><span class="o">.</span><span class="n">link</span><span class="o">.</span><span class="n">remote_condition</span><span class="p">)</span>
-
-    <span class="k">def</span> <span class="nf">on_connection_remote_close</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">):</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">closed</span><span class="p">(</span><span class="n">event</span><span class="o">.</span><span class="n">connection</span><span class="o">.</span><span class="n">remote_condition</span><span class="p">)</span>
-
-    <span class="k">def</span> <span class="nf">closed</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">error</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
-        <span class="k">if</span> <span class="n">error</span><span class="p">:</span>
-            <span class="k">print</span> <span class="s">&quot;Closed due to </span><span class="si">%s</span><span class="s">&quot;</span> <span class="o">%</span> <span class="n">error</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">conn</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
-
-    <span class="k">def</span> <span class="nf">run</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">eventloop</span><span class="o">.</span><span class="n">run</span><span class="p">()</span>
-
-<span class="n">Send</span><span class="p">(</span><span class="n">EventLoop</span><span class="p">(),</span> <span class="s">&quot;localhost:5672&quot;</span><span class="p">,</span> <span class="s">&quot;examples&quot;</span><span class="p">,</span> <span class="mi">1000</span><span class="p">)</span><span class="o">.</span><span class="n">run</span><span class="p">()</span>
-</pre></div>
-</td></tr></table></div>
-</div>
-<div class="section" id="reconnecting">
-<h1>Reconnecting<a class="headerlink" href="#reconnecting" title="Permalink to this headline">¶</a></h1>
-<p>TODO: This shows a basic reconnect for the receiver. Need some backoff
-logic which requires some sort of support for timers in the event
-loop.</p>
-<div class="highlight-python"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre> 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
-37
-38
-39</pre></div></td><td class="code"><div class="highlight"><pre><span class="kn">from</span> <span class="nn">proton_events</span> <span class="kn">import</span> <span class="n">IncomingMessageHandler</span><span class="p">,</span> <span class="n">EventLoop</span>
-
-<span class="k">class</span> <span class="nc">Recv</span><span class="p">(</span><span class="n">IncomingMessageHandler</span><span class="p">):</span>
-    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">eventloop</span><span class="p">,</span> <span class="n">host</span><span class="p">,</span> <span class="n">address</span><span class="p">):</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">eventloop</span> <span class="o">=</span> <span class="n">eventloop</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">host</span> <span class="o">=</span> <span class="n">host</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">address</span> <span class="o">=</span> <span class="n">address</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">connect</span><span class="p">()</span>
-
-    <span class="k">def</span> <span class="nf">connect</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">conn</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">eventloop</span><span class="o">.</span><span class="n">connect</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">host</span><span class="p">,</span> <span class="n">handler</span><span class="o">=</span><span class="bp">self</span><span class="p">)</span>
-
-    <span class="k">def</span> <span class="nf">on_message</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">):</span>
-        <span class="k">print</span> <span class="n">event</span><span class="o">.</span><span class="n">message</span><span class="o">.</span><span class="n">body</span>
-
-    <span class="k">def</span> <span class="nf">on_connection_remote_open</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">):</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">conn</span><span class="o">.</span><span class="n">receiver</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">address</span><span class="p">)</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">delay</span> <span class="o">=</span> <span class="mi">0</span>
 
     <span class="k">def</span> <span class="nf">on_link_remote_close</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">):</span>
         <span class="bp">self</span><span class="o">.</span><span class="n">closed</span><span class="p">(</span><span class="n">event</span><span class="o">.</span><span class="n">link</span><span class="o">.</span><span class="n">remote_condition</span><span class="p">)</span>
@@ -546,15 +533,23 @@ loop.</p>
         <span class="bp">self</span><span class="o">.</span><span class="n">conn</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
 
     <span class="k">def</span> <span class="nf">on_disconnected</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">conn</span><span class="p">):</span>
-        <span class="k">print</span> <span class="s">&quot;Disconnected, reconnecting...&quot;</span>
+        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">delay</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">delay</span> <span class="o">=</span> <span class="mf">0.1</span>
+            <span class="k">print</span> <span class="s">&quot;Disconnected, reconnecting...&quot;</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">connect</span><span class="p">()</span>
+        <span class="k">else</span><span class="p">:</span>
+            <span class="k">print</span> <span class="s">&quot;Disconnected will try to reconnect after </span><span class="si">%d</span><span class="s"> seconds&quot;</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">delay</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">eventloop</span><span class="o">.</span><span class="n">schedule</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">delay</span><span class="p">,</span> <span class="n">connection</span><span class="o">=</span><span class="n">conn</span><span class="p">)</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">delay</span> <span class="o">=</span> <span class="nb">min</span><span class="p">(</span><span class="mi">10</span><span class="p">,</span> <span class="mi">2</span><span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">delay</span><span class="p">)</span>
+
+    <span class="k">def</span> <span class="nf">on_timer</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">):</span>
+        <span class="k">print</span> <span class="s">&quot;Reconnecting...&quot;</span>
         <span class="bp">self</span><span class="o">.</span><span class="n">connect</span><span class="p">()</span>
 
     <span class="k">def</span> <span class="nf">run</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
         <span class="bp">self</span><span class="o">.</span><span class="n">eventloop</span><span class="o">.</span><span class="n">run</span><span class="p">()</span>
 
-<span class="k">try</span><span class="p">:</span>
-    <span class="n">Recv</span><span class="p">(</span><span class="n">EventLoop</span><span class="p">(),</span> <span class="s">&quot;localhost:5672&quot;</span><span class="p">,</span> <span class="s">&quot;examples&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">run</span><span class="p">()</span>
-<span class="k">except</span> <span class="ne">KeyboardInterrupt</span><span class="p">:</span> <span class="k">pass</span>
+<span class="n">Send</span><span class="p">(</span><span class="n">EventLoop</span><span class="p">(),</span> <span class="s">&quot;localhost:5672&quot;</span><span class="p">,</span> <span class="s">&quot;examples&quot;</span><span class="p">,</span> <span class="mi">10000</span><span class="p">)</span><span class="o">.</span><span class="n">run</span><span class="p">()</span>
 </pre></div>
 </td></tr></table></div>
 </div>

Modified: qpid/proton/branches/examples/tutorial/tutorial.rst
URL: http://svn.apache.org/viewvc/qpid/proton/branches/examples/tutorial/tutorial.rst?rev=1617752&r1=1617751&r2=1617752&view=diff
==============================================================================
--- qpid/proton/branches/examples/tutorial/tutorial.rst (original)
+++ qpid/proton/branches/examples/tutorial/tutorial.rst Wed Aug 13 16:18:58 2014
@@ -117,49 +117,19 @@ So now we have our example working witho
 The Basics
 ==========
 
-So much for hello world! Let's explore a little more. Separating out
-the receiving logic and receiving messages until the program is
-stopped, we get the following example (which has the same broker
-requirements mentioned for the first hello world example).
+TODO: These examples show reliable (at-least-once) send and receive
+with reconnect ability. Need to write some explanation. Could also do
+with some further cleanup.
+
 
 .. literalinclude:: simple_recv.py
    :lines: 21-
    :linenos:
 
-Often we want to be notified whether the messages we send arrive at
-their intended destination. We can do that by specifying a handler for
-the sender we create with an ``on_message()`` method defined on it. This
-will be called whenever a message sent by the sender is accepted by
-the remote peer.
-
-When sending a large number of messages, we need to consider whether
-the remote peer is able to handle them all. AMQP has a powerful flow
-control mechanism through which processes can limit the incoming flow
-of messages. If we implement a ``on_link_flow()`` method on our sender's
-handler, this will be called whenever the sender is allowed to send
-and will prevent messages building up due to the receivers inability
-to process them.
-
-Separating out the sending logic, extending it to send a given number
-of messages and incorporating the two handler methods just described
-we get:
-
 .. literalinclude:: simple_send.py
    :lines: 21-
    :linenos:
 
-============
-Reconnecting
-============
-
-TODO: This shows a basic reconnect for the receiver. Need some backoff
-logic which requires some sort of support for timers in the event
-loop.
-
-.. literalinclude:: simple_recv_2.py
-   :lines: 21-
-   :linenos:
-
 ================
 Request/Response
 ================



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org