<div dir="ltr">I&#39;ve just finished a simple high level api, and committed several examples showing off direct, topic, fanout and rpc style messaging over rabbitmq:<div><br></div><div>&nbsp;&nbsp;<a href="http://github.com/tmm1/amqp/tree/master/examples/pingpong.rb">http://github.com/tmm1/amqp/tree/master/examples/pingpong.rb</a></div>
<div>&nbsp;&nbsp;<a href="http://github.com/tmm1/amqp/tree/master/examples/clock.rb">http://github.com/tmm1/amqp/tree/master/examples/clock.rb</a></div><div>&nbsp;&nbsp;<a href="http://github.com/tmm1/amqp/tree/master/examples/stocks.rb">http://github.com/tmm1/amqp/tree/master/examples/stocks.rb</a></div>
<div>&nbsp;&nbsp;<a href="http://github.com/tmm1/amqp/tree/master/examples/hashtable.rb">http://github.com/tmm1/amqp/tree/master/examples/hashtable.rb</a></div><div><br></div><div>The API revolves around an MQ object, which corresponds 1:1 with an AMQP channel. An AMQP connection is created automatically by the MQ class (on demand), so you don&#39;t have to worry about connection, channel or sessions. In the simplest case, MQ objects allow publishing to exchanges and reading from queues:</div>
<div><br></div><div>&nbsp;&nbsp;amq = MQ.new</div><div><br></div><div>&nbsp;&nbsp;amq.queue(&#39;queue_name&#39;).subscribe{ |msg|</div><div>&nbsp;&nbsp; &nbsp;puts &quot;i got a message: #{msg}&quot; &nbsp; # msg == &quot;hello world&quot;<br></div><div>&nbsp;&nbsp;end</div>
<div><br></div><div>&nbsp;&nbsp;amq.direct.publish(&#39;hello world&#39;, :key =&gt; &#39;queue_name&#39;)</div><div><br></div><div>&nbsp;&nbsp;Aman Gupta<br><br><div class="gmail_quote">On Sat, Jul 12, 2008 at 2:45 AM, Aman Gupta &lt;<a href="mailto:rabbitmq@tmm1.net">rabbitmq@tmm1.net</a>&gt; wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;"><div>I&#39;ve been working on a Ruby/EventMachine AMQP client over the past few days and I have a simple client up and running:<br>
</div><div><br></div><div><div><span>&nbsp;&nbsp; &nbsp;def receive_data data</span></div>
<div><span>&nbsp;&nbsp; &nbsp; &nbsp;Frame.extract(data).each do |frame|<br></span></div><div><span>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;# log &#39;got a frame&#39;, frame</span></div>
<div><span>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span></div><div><span>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;case method = frame.payload</span></div>
<div><span>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;when Protocol::Connection::Start</span></div><div><span>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;send Protocol::Connection::StartOk.new({:platform =&gt; &#39;Ruby/EventMachine&#39;,</span></div>
<div><span>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;:product =&gt; &#39;AMQP&#39;,</span></div><div><span>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;:information =&gt; &#39;<a href="http://github.com/tmm1/amqp" target="_blank">http://github.com/tmm1/amqp</a>&#39;,</span></div>

<div><span>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;:version =&gt; &#39;0.0.1&#39;},</span></div><div><span>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#39;AMQPLAIN&#39;,</span></div>
<div><span>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {:LOGIN =&gt; &#39;guest&#39;,</span></div><div><span>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;:PASSWORD =&gt; &#39;guest&#39;},</span></div>
<div><span>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#39;en_US&#39;)</span></div><div><span><br>
</span></div><div><span>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;when Protocol::Connection::Tune</span></div><div><span>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;send Protocol::Connection::TuneOk.new :channel_max =&gt; 0,</span></div>
<div><span>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;:frame_max =&gt; 131072,</span></div><div><span>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;:heartbeat =&gt; 0</span></div>
<div><span><br></span></div><div><span>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;send Protocol::Connection::Open.new :virtual_host =&gt; &#39;/&#39;,</span></div>
<div><span>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;:capabilities =&gt; &#39;&#39;,</span></div><div><span>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;:insist =&gt; false</span></div>
<div><span><br></span></div><div><span>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;when Protocol::Connection::OpenOk</span></div>
<div><span>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;send Protocol::Channel::Open.new, :channel =&gt; 1</span></div><div><span>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;end</span></div>
<div><span>&nbsp;&nbsp; &nbsp; &nbsp;end</span></div><div><span>&nbsp;&nbsp; &nbsp;end</span></div>
<div><br></div><div>Feedback and ideas for a higher-level queue/exchange/binding API are welcome.</div><div><br></div><font color="#888888"><div>&nbsp;&nbsp;Aman Gupta</div></font></div>
</blockquote></div><br></div></div>