sidekick-client 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (247) hide show
  1. data/.document +5 -0
  2. data/.gitignore +21 -0
  3. data/LICENSE +20 -0
  4. data/README.rdoc +17 -0
  5. data/Rakefile +52 -0
  6. data/VERSION +1 -0
  7. data/lib/ext/README +1 -0
  8. data/lib/ext/bunny-0.6.0/LICENSE +20 -0
  9. data/lib/ext/bunny-0.6.0/README.rdoc +66 -0
  10. data/lib/ext/bunny-0.6.0/Rakefile +24 -0
  11. data/lib/ext/bunny-0.6.0/bunny.gemspec +65 -0
  12. data/lib/ext/bunny-0.6.0/examples/simple_08.rb +30 -0
  13. data/lib/ext/bunny-0.6.0/examples/simple_09.rb +30 -0
  14. data/lib/ext/bunny-0.6.0/examples/simple_ack_08.rb +33 -0
  15. data/lib/ext/bunny-0.6.0/examples/simple_ack_09.rb +33 -0
  16. data/lib/ext/bunny-0.6.0/examples/simple_consumer_08.rb +53 -0
  17. data/lib/ext/bunny-0.6.0/examples/simple_consumer_09.rb +53 -0
  18. data/lib/ext/bunny-0.6.0/examples/simple_fanout_08.rb +39 -0
  19. data/lib/ext/bunny-0.6.0/examples/simple_fanout_09.rb +39 -0
  20. data/lib/ext/bunny-0.6.0/examples/simple_headers_08.rb +40 -0
  21. data/lib/ext/bunny-0.6.0/examples/simple_headers_09.rb +40 -0
  22. data/lib/ext/bunny-0.6.0/examples/simple_publisher_08.rb +27 -0
  23. data/lib/ext/bunny-0.6.0/examples/simple_publisher_09.rb +27 -0
  24. data/lib/ext/bunny-0.6.0/examples/simple_topic_08.rb +59 -0
  25. data/lib/ext/bunny-0.6.0/examples/simple_topic_09.rb +59 -0
  26. data/lib/ext/bunny-0.6.0/lib/bunny/channel08.rb +39 -0
  27. data/lib/ext/bunny-0.6.0/lib/bunny/channel09.rb +39 -0
  28. data/lib/ext/bunny-0.6.0/lib/bunny/client08.rb +494 -0
  29. data/lib/ext/bunny-0.6.0/lib/bunny/client09.rb +460 -0
  30. data/lib/ext/bunny-0.6.0/lib/bunny/exchange08.rb +175 -0
  31. data/lib/ext/bunny-0.6.0/lib/bunny/exchange09.rb +177 -0
  32. data/lib/ext/bunny-0.6.0/lib/bunny/queue08.rb +389 -0
  33. data/lib/ext/bunny-0.6.0/lib/bunny/queue09.rb +395 -0
  34. data/lib/ext/bunny-0.6.0/lib/bunny/subscription08.rb +85 -0
  35. data/lib/ext/bunny-0.6.0/lib/bunny/subscription09.rb +85 -0
  36. data/lib/ext/bunny-0.6.0/lib/bunny.rb +87 -0
  37. data/lib/ext/bunny-0.6.0/lib/qrack/channel.rb +18 -0
  38. data/lib/ext/bunny-0.6.0/lib/qrack/client.rb +204 -0
  39. data/lib/ext/bunny-0.6.0/lib/qrack/protocol/protocol08.rb +132 -0
  40. data/lib/ext/bunny-0.6.0/lib/qrack/protocol/protocol09.rb +133 -0
  41. data/lib/ext/bunny-0.6.0/lib/qrack/protocol/spec08.rb +823 -0
  42. data/lib/ext/bunny-0.6.0/lib/qrack/protocol/spec09.rb +521 -0
  43. data/lib/ext/bunny-0.6.0/lib/qrack/qrack08.rb +23 -0
  44. data/lib/ext/bunny-0.6.0/lib/qrack/qrack09.rb +23 -0
  45. data/lib/ext/bunny-0.6.0/lib/qrack/queue.rb +53 -0
  46. data/lib/ext/bunny-0.6.0/lib/qrack/subscription.rb +102 -0
  47. data/lib/ext/bunny-0.6.0/lib/qrack/transport/buffer08.rb +276 -0
  48. data/lib/ext/bunny-0.6.0/lib/qrack/transport/buffer09.rb +276 -0
  49. data/lib/ext/bunny-0.6.0/lib/qrack/transport/frame08.rb +112 -0
  50. data/lib/ext/bunny-0.6.0/lib/qrack/transport/frame09.rb +94 -0
  51. data/lib/ext/bunny-0.6.0/spec/spec_08/bunny_spec.rb +65 -0
  52. data/lib/ext/bunny-0.6.0/spec/spec_08/connection_spec.rb +12 -0
  53. data/lib/ext/bunny-0.6.0/spec/spec_08/exchange_spec.rb +162 -0
  54. data/lib/ext/bunny-0.6.0/spec/spec_08/queue_spec.rb +206 -0
  55. data/lib/ext/bunny-0.6.0/spec/spec_09/bunny_spec.rb +65 -0
  56. data/lib/ext/bunny-0.6.0/spec/spec_09/connection_spec.rb +12 -0
  57. data/lib/ext/bunny-0.6.0/spec/spec_09/exchange_spec.rb +162 -0
  58. data/lib/ext/bunny-0.6.0/spec/spec_09/queue_spec.rb +205 -0
  59. data/lib/ext/eventmachine-0.12.10/.gitignore +14 -0
  60. data/lib/ext/eventmachine-0.12.10/README +82 -0
  61. data/lib/ext/eventmachine-0.12.10/Rakefile +374 -0
  62. data/lib/ext/eventmachine-0.12.10/docs/COPYING +60 -0
  63. data/lib/ext/eventmachine-0.12.10/docs/ChangeLog +211 -0
  64. data/lib/ext/eventmachine-0.12.10/docs/DEFERRABLES +133 -0
  65. data/lib/ext/eventmachine-0.12.10/docs/EPOLL +141 -0
  66. data/lib/ext/eventmachine-0.12.10/docs/GNU +281 -0
  67. data/lib/ext/eventmachine-0.12.10/docs/INSTALL +13 -0
  68. data/lib/ext/eventmachine-0.12.10/docs/KEYBOARD +38 -0
  69. data/lib/ext/eventmachine-0.12.10/docs/LEGAL +25 -0
  70. data/lib/ext/eventmachine-0.12.10/docs/LIGHTWEIGHT_CONCURRENCY +70 -0
  71. data/lib/ext/eventmachine-0.12.10/docs/PURE_RUBY +75 -0
  72. data/lib/ext/eventmachine-0.12.10/docs/RELEASE_NOTES +94 -0
  73. data/lib/ext/eventmachine-0.12.10/docs/SMTP +2 -0
  74. data/lib/ext/eventmachine-0.12.10/docs/SPAWNED_PROCESSES +89 -0
  75. data/lib/ext/eventmachine-0.12.10/docs/TODO +8 -0
  76. data/lib/ext/eventmachine-0.12.10/eventmachine.gemspec +40 -0
  77. data/lib/ext/eventmachine-0.12.10/examples/ex_channel.rb +43 -0
  78. data/lib/ext/eventmachine-0.12.10/examples/ex_queue.rb +2 -0
  79. data/lib/ext/eventmachine-0.12.10/examples/helper.rb +2 -0
  80. data/lib/ext/eventmachine-0.12.10/ext/binder.cpp +125 -0
  81. data/lib/ext/eventmachine-0.12.10/ext/binder.h +46 -0
  82. data/lib/ext/eventmachine-0.12.10/ext/cmain.cpp +827 -0
  83. data/lib/ext/eventmachine-0.12.10/ext/cplusplus.cpp +202 -0
  84. data/lib/ext/eventmachine-0.12.10/ext/ed.cpp +1893 -0
  85. data/lib/ext/eventmachine-0.12.10/ext/ed.h +424 -0
  86. data/lib/ext/eventmachine-0.12.10/ext/em.cpp +2282 -0
  87. data/lib/ext/eventmachine-0.12.10/ext/em.h +232 -0
  88. data/lib/ext/eventmachine-0.12.10/ext/emwin.cpp +300 -0
  89. data/lib/ext/eventmachine-0.12.10/ext/emwin.h +94 -0
  90. data/lib/ext/eventmachine-0.12.10/ext/epoll.cpp +26 -0
  91. data/lib/ext/eventmachine-0.12.10/ext/epoll.h +25 -0
  92. data/lib/ext/eventmachine-0.12.10/ext/eventmachine.h +122 -0
  93. data/lib/ext/eventmachine-0.12.10/ext/eventmachine_cpp.h +96 -0
  94. data/lib/ext/eventmachine-0.12.10/ext/extconf.rb +148 -0
  95. data/lib/ext/eventmachine-0.12.10/ext/fastfilereader/extconf.rb +83 -0
  96. data/lib/ext/eventmachine-0.12.10/ext/fastfilereader/mapper.cpp +214 -0
  97. data/lib/ext/eventmachine-0.12.10/ext/fastfilereader/mapper.h +59 -0
  98. data/lib/ext/eventmachine-0.12.10/ext/fastfilereader/rubymain.cpp +127 -0
  99. data/lib/ext/eventmachine-0.12.10/ext/files.cpp +94 -0
  100. data/lib/ext/eventmachine-0.12.10/ext/files.h +65 -0
  101. data/lib/ext/eventmachine-0.12.10/ext/kb.cpp +81 -0
  102. data/lib/ext/eventmachine-0.12.10/ext/page.cpp +107 -0
  103. data/lib/ext/eventmachine-0.12.10/ext/page.h +51 -0
  104. data/lib/ext/eventmachine-0.12.10/ext/pipe.cpp +349 -0
  105. data/lib/ext/eventmachine-0.12.10/ext/project.h +151 -0
  106. data/lib/ext/eventmachine-0.12.10/ext/rubymain.cpp +1166 -0
  107. data/lib/ext/eventmachine-0.12.10/ext/sigs.cpp +89 -0
  108. data/lib/ext/eventmachine-0.12.10/ext/sigs.h +32 -0
  109. data/lib/ext/eventmachine-0.12.10/ext/ssl.cpp +460 -0
  110. data/lib/ext/eventmachine-0.12.10/ext/ssl.h +94 -0
  111. data/lib/ext/eventmachine-0.12.10/java/.classpath +8 -0
  112. data/lib/ext/eventmachine-0.12.10/java/.project +17 -0
  113. data/lib/ext/eventmachine-0.12.10/java/src/com/rubyeventmachine/EmReactor.java +570 -0
  114. data/lib/ext/eventmachine-0.12.10/java/src/com/rubyeventmachine/EmReactorException.java +40 -0
  115. data/lib/ext/eventmachine-0.12.10/java/src/com/rubyeventmachine/EventableChannel.java +69 -0
  116. data/lib/ext/eventmachine-0.12.10/java/src/com/rubyeventmachine/EventableDatagramChannel.java +189 -0
  117. data/lib/ext/eventmachine-0.12.10/java/src/com/rubyeventmachine/EventableSocketChannel.java +364 -0
  118. data/lib/ext/eventmachine-0.12.10/java/src/com/rubyeventmachine/application/Application.java +194 -0
  119. data/lib/ext/eventmachine-0.12.10/java/src/com/rubyeventmachine/application/Connection.java +74 -0
  120. data/lib/ext/eventmachine-0.12.10/java/src/com/rubyeventmachine/application/ConnectionFactory.java +37 -0
  121. data/lib/ext/eventmachine-0.12.10/java/src/com/rubyeventmachine/application/DefaultConnectionFactory.java +46 -0
  122. data/lib/ext/eventmachine-0.12.10/java/src/com/rubyeventmachine/application/PeriodicTimer.java +38 -0
  123. data/lib/ext/eventmachine-0.12.10/java/src/com/rubyeventmachine/application/Timer.java +54 -0
  124. data/lib/ext/eventmachine-0.12.10/java/src/com/rubyeventmachine/tests/ApplicationTest.java +109 -0
  125. data/lib/ext/eventmachine-0.12.10/java/src/com/rubyeventmachine/tests/ConnectTest.java +148 -0
  126. data/lib/ext/eventmachine-0.12.10/java/src/com/rubyeventmachine/tests/EMTest.java +80 -0
  127. data/lib/ext/eventmachine-0.12.10/java/src/com/rubyeventmachine/tests/TestDatagrams.java +53 -0
  128. data/lib/ext/eventmachine-0.12.10/java/src/com/rubyeventmachine/tests/TestServers.java +75 -0
  129. data/lib/ext/eventmachine-0.12.10/java/src/com/rubyeventmachine/tests/TestTimers.java +90 -0
  130. data/lib/ext/eventmachine-0.12.10/lib/em/buftok.rb +138 -0
  131. data/lib/ext/eventmachine-0.12.10/lib/em/callback.rb +26 -0
  132. data/lib/ext/eventmachine-0.12.10/lib/em/channel.rb +57 -0
  133. data/lib/ext/eventmachine-0.12.10/lib/em/connection.rb +564 -0
  134. data/lib/ext/eventmachine-0.12.10/lib/em/deferrable.rb +192 -0
  135. data/lib/ext/eventmachine-0.12.10/lib/em/file_watch.rb +54 -0
  136. data/lib/ext/eventmachine-0.12.10/lib/em/future.rb +61 -0
  137. data/lib/ext/eventmachine-0.12.10/lib/em/messages.rb +66 -0
  138. data/lib/ext/eventmachine-0.12.10/lib/em/process_watch.rb +44 -0
  139. data/lib/ext/eventmachine-0.12.10/lib/em/processes.rb +119 -0
  140. data/lib/ext/eventmachine-0.12.10/lib/em/protocols/header_and_content.rb +138 -0
  141. data/lib/ext/eventmachine-0.12.10/lib/em/protocols/httpclient.rb +263 -0
  142. data/lib/ext/eventmachine-0.12.10/lib/em/protocols/httpclient2.rb +590 -0
  143. data/lib/ext/eventmachine-0.12.10/lib/em/protocols/line_and_text.rb +125 -0
  144. data/lib/ext/eventmachine-0.12.10/lib/em/protocols/linetext2.rb +161 -0
  145. data/lib/ext/eventmachine-0.12.10/lib/em/protocols/memcache.rb +323 -0
  146. data/lib/ext/eventmachine-0.12.10/lib/em/protocols/object_protocol.rb +45 -0
  147. data/lib/ext/eventmachine-0.12.10/lib/em/protocols/postgres3.rb +247 -0
  148. data/lib/ext/eventmachine-0.12.10/lib/em/protocols/saslauth.rb +175 -0
  149. data/lib/ext/eventmachine-0.12.10/lib/em/protocols/smtpclient.rb +357 -0
  150. data/lib/ext/eventmachine-0.12.10/lib/em/protocols/smtpserver.rb +547 -0
  151. data/lib/ext/eventmachine-0.12.10/lib/em/protocols/socks4.rb +66 -0
  152. data/lib/ext/eventmachine-0.12.10/lib/em/protocols/stomp.rb +200 -0
  153. data/lib/ext/eventmachine-0.12.10/lib/em/protocols/tcptest.rb +53 -0
  154. data/lib/ext/eventmachine-0.12.10/lib/em/protocols.rb +36 -0
  155. data/lib/ext/eventmachine-0.12.10/lib/em/queue.rb +61 -0
  156. data/lib/ext/eventmachine-0.12.10/lib/em/spawnable.rb +85 -0
  157. data/lib/ext/eventmachine-0.12.10/lib/em/streamer.rb +130 -0
  158. data/lib/ext/eventmachine-0.12.10/lib/em/timers.rb +56 -0
  159. data/lib/ext/eventmachine-0.12.10/lib/em/version.rb +3 -0
  160. data/lib/ext/eventmachine-0.12.10/lib/eventmachine.rb +1592 -0
  161. data/lib/ext/eventmachine-0.12.10/lib/evma/callback.rb +32 -0
  162. data/lib/ext/eventmachine-0.12.10/lib/evma/container.rb +75 -0
  163. data/lib/ext/eventmachine-0.12.10/lib/evma/factory.rb +77 -0
  164. data/lib/ext/eventmachine-0.12.10/lib/evma/protocol.rb +87 -0
  165. data/lib/ext/eventmachine-0.12.10/lib/evma/reactor.rb +48 -0
  166. data/lib/ext/eventmachine-0.12.10/lib/evma.rb +32 -0
  167. data/lib/ext/eventmachine-0.12.10/lib/jeventmachine.rb +257 -0
  168. data/lib/ext/eventmachine-0.12.10/lib/pr_eventmachine.rb +1022 -0
  169. data/lib/ext/eventmachine-0.12.10/setup.rb +1585 -0
  170. data/lib/ext/eventmachine-0.12.10/tasks/cpp.rake_example +77 -0
  171. data/lib/ext/eventmachine-0.12.10/tests/client.crt +31 -0
  172. data/lib/ext/eventmachine-0.12.10/tests/client.key +51 -0
  173. data/lib/ext/eventmachine-0.12.10/tests/test_attach.rb +126 -0
  174. data/lib/ext/eventmachine-0.12.10/tests/test_basic.rb +284 -0
  175. data/lib/ext/eventmachine-0.12.10/tests/test_channel.rb +63 -0
  176. data/lib/ext/eventmachine-0.12.10/tests/test_connection_count.rb +35 -0
  177. data/lib/ext/eventmachine-0.12.10/tests/test_defer.rb +47 -0
  178. data/lib/ext/eventmachine-0.12.10/tests/test_epoll.rb +160 -0
  179. data/lib/ext/eventmachine-0.12.10/tests/test_error_handler.rb +35 -0
  180. data/lib/ext/eventmachine-0.12.10/tests/test_errors.rb +82 -0
  181. data/lib/ext/eventmachine-0.12.10/tests/test_exc.rb +55 -0
  182. data/lib/ext/eventmachine-0.12.10/tests/test_file_watch.rb +49 -0
  183. data/lib/ext/eventmachine-0.12.10/tests/test_futures.rb +198 -0
  184. data/lib/ext/eventmachine-0.12.10/tests/test_get_sock_opt.rb +30 -0
  185. data/lib/ext/eventmachine-0.12.10/tests/test_handler_check.rb +37 -0
  186. data/lib/ext/eventmachine-0.12.10/tests/test_hc.rb +218 -0
  187. data/lib/ext/eventmachine-0.12.10/tests/test_httpclient.rb +218 -0
  188. data/lib/ext/eventmachine-0.12.10/tests/test_httpclient2.rb +153 -0
  189. data/lib/ext/eventmachine-0.12.10/tests/test_inactivity_timeout.rb +50 -0
  190. data/lib/ext/eventmachine-0.12.10/tests/test_kb.rb +60 -0
  191. data/lib/ext/eventmachine-0.12.10/tests/test_ltp.rb +182 -0
  192. data/lib/ext/eventmachine-0.12.10/tests/test_ltp2.rb +317 -0
  193. data/lib/ext/eventmachine-0.12.10/tests/test_next_tick.rb +133 -0
  194. data/lib/ext/eventmachine-0.12.10/tests/test_object_protocol.rb +37 -0
  195. data/lib/ext/eventmachine-0.12.10/tests/test_pause.rb +70 -0
  196. data/lib/ext/eventmachine-0.12.10/tests/test_pending_connect_timeout.rb +48 -0
  197. data/lib/ext/eventmachine-0.12.10/tests/test_process_watch.rb +48 -0
  198. data/lib/ext/eventmachine-0.12.10/tests/test_processes.rb +128 -0
  199. data/lib/ext/eventmachine-0.12.10/tests/test_proxy_connection.rb +92 -0
  200. data/lib/ext/eventmachine-0.12.10/tests/test_pure.rb +125 -0
  201. data/lib/ext/eventmachine-0.12.10/tests/test_queue.rb +44 -0
  202. data/lib/ext/eventmachine-0.12.10/tests/test_running.rb +42 -0
  203. data/lib/ext/eventmachine-0.12.10/tests/test_sasl.rb +72 -0
  204. data/lib/ext/eventmachine-0.12.10/tests/test_send_file.rb +242 -0
  205. data/lib/ext/eventmachine-0.12.10/tests/test_servers.rb +76 -0
  206. data/lib/ext/eventmachine-0.12.10/tests/test_smtpclient.rb +83 -0
  207. data/lib/ext/eventmachine-0.12.10/tests/test_smtpserver.rb +85 -0
  208. data/lib/ext/eventmachine-0.12.10/tests/test_spawn.rb +322 -0
  209. data/lib/ext/eventmachine-0.12.10/tests/test_ssl_args.rb +79 -0
  210. data/lib/ext/eventmachine-0.12.10/tests/test_ssl_methods.rb +50 -0
  211. data/lib/ext/eventmachine-0.12.10/tests/test_ssl_verify.rb +82 -0
  212. data/lib/ext/eventmachine-0.12.10/tests/test_timers.rb +162 -0
  213. data/lib/ext/eventmachine-0.12.10/tests/test_ud.rb +36 -0
  214. data/lib/ext/eventmachine-0.12.10/tests/testem.rb +31 -0
  215. data/lib/ext/eventmachine-0.12.10/web/whatis +7 -0
  216. data/lib/ext/misc/README +1 -0
  217. data/lib/ext/misc/indifferent_access.rb +131 -0
  218. data/lib/ext/uuidtools-2.1.1/CHANGELOG +56 -0
  219. data/lib/ext/uuidtools-2.1.1/LICENSE +20 -0
  220. data/lib/ext/uuidtools-2.1.1/README +13 -0
  221. data/lib/ext/uuidtools-2.1.1/Rakefile +48 -0
  222. data/lib/ext/uuidtools-2.1.1/lib/compat/securerandom.rb +202 -0
  223. data/lib/ext/uuidtools-2.1.1/lib/uuidtools/version.rb +35 -0
  224. data/lib/ext/uuidtools-2.1.1/lib/uuidtools.rb +618 -0
  225. data/lib/ext/uuidtools-2.1.1/spec/spec.opts +1 -0
  226. data/lib/ext/uuidtools-2.1.1/spec/spec_helper.rb +7 -0
  227. data/lib/ext/uuidtools-2.1.1/spec/uuidtools/mac_address_spec.rb +15 -0
  228. data/lib/ext/uuidtools-2.1.1/spec/uuidtools/utility_spec.rb +21 -0
  229. data/lib/ext/uuidtools-2.1.1/spec/uuidtools/uuid_creation_spec.rb +121 -0
  230. data/lib/ext/uuidtools-2.1.1/spec/uuidtools/uuid_parsing_spec.rb +127 -0
  231. data/lib/ext/uuidtools-2.1.1/tasks/benchmark.rake +38 -0
  232. data/lib/ext/uuidtools-2.1.1/tasks/clobber.rake +2 -0
  233. data/lib/ext/uuidtools-2.1.1/tasks/gem.rake +68 -0
  234. data/lib/ext/uuidtools-2.1.1/tasks/git.rake +40 -0
  235. data/lib/ext/uuidtools-2.1.1/tasks/metrics.rake +22 -0
  236. data/lib/ext/uuidtools-2.1.1/tasks/rdoc.rake +29 -0
  237. data/lib/ext/uuidtools-2.1.1/tasks/rubyforge.rake +89 -0
  238. data/lib/ext/uuidtools-2.1.1/tasks/spec.rake +64 -0
  239. data/lib/ext/uuidtools-2.1.1/website/index.html +95 -0
  240. data/lib/sidekick/client/sidekick_client.rb +46 -0
  241. data/lib/sidekick/shared/sidekick_logger.rb +14 -0
  242. data/lib/sidekick/shared/sidekick_queue_publisher.rb +91 -0
  243. data/lib/sidekick-client.rb +7 -0
  244. data/sidekick-client.gemspec +289 -0
  245. data/test/helper.rb +10 -0
  246. data/test/test_sidekick-client.rb +7 -0
  247. metadata +311 -0
@@ -0,0 +1,175 @@
1
+ module Bunny
2
+
3
+ =begin rdoc
4
+
5
+ === DESCRIPTION:
6
+
7
+ *Exchanges* are the routing and distribution hub of AMQP. All messages that Bunny sends
8
+ to an AMQP broker/server _have_ to pass through an exchange in order to be routed to a
9
+ destination queue. The AMQP specification defines the types of exchange that you can create.
10
+
11
+ At the time of writing there are four (4) types of exchange defined -
12
+
13
+ * <tt>:direct</tt>
14
+ * <tt>:fanout</tt>
15
+ * <tt>:topic</tt>
16
+ * <tt>:headers</tt>
17
+
18
+ AMQP-compliant brokers/servers are required to provide default exchanges for the _direct_ and
19
+ _fanout_ exchange types. All default exchanges are prefixed with <tt>'amq.'</tt>, for example -
20
+
21
+ * <tt>amq.direct</tt>
22
+ * <tt>amq.fanout</tt>
23
+ * <tt>amq.topic</tt>
24
+ * <tt>amq.match</tt> or <tt>amq.headers</tt>
25
+
26
+ If you want more information about exchanges, please consult the documentation for your
27
+ target broker/server or visit the {AMQP website}[http://www.amqp.org] to find the version of the
28
+ specification that applies to your target broker/server.
29
+
30
+ =end
31
+
32
+ class Exchange
33
+
34
+ attr_reader :client, :type, :name, :opts, :key
35
+
36
+ def initialize(client, name, opts = {})
37
+ # check connection to server
38
+ raise Bunny::ConnectionError, 'Not connected to server' if client.status == :not_connected
39
+
40
+ @client, @name, @opts = client, name, opts
41
+
42
+ # set up the exchange type catering for default names
43
+ if name.match(/^amq\./)
44
+ new_type = name.sub(/amq\./, '')
45
+ # handle 'amq.match' default
46
+ new_type = 'headers' if new_type == 'match'
47
+ @type = new_type.to_sym
48
+ else
49
+ @type = opts[:type] || :direct
50
+ end
51
+
52
+ @key = opts[:key]
53
+ @client.exchanges[@name] ||= self
54
+
55
+ # ignore the :nowait option if passed, otherwise program will hang waiting for a
56
+ # response that will not be sent by the server
57
+ opts.delete(:nowait)
58
+
59
+ unless name == "amq.#{type}" or name == ''
60
+ client.send_frame(
61
+ Qrack::Protocol::Exchange::Declare.new(
62
+ { :exchange => name, :type => type, :nowait => false }.merge(opts)
63
+ )
64
+ )
65
+
66
+ method = client.next_method
67
+
68
+ client.check_response(method, Qrack::Protocol::Exchange::DeclareOk,
69
+ "Error declaring exchange #{name}: type = #{type}")
70
+
71
+ end
72
+ end
73
+
74
+ =begin rdoc
75
+
76
+ === DESCRIPTION:
77
+
78
+ Requests that an exchange is deleted from broker/server. Removes reference from exchanges
79
+ if successful. If an error occurs raises _Bunny_::_ProtocolError_.
80
+
81
+ ==== Options:
82
+
83
+ * <tt>:if_unused => true or false (_default_)</tt> - If set to _true_, the server will only
84
+ delete the exchange if it has no queue bindings. If the exchange has queue bindings the
85
+ server does not delete it but raises a channel exception instead.
86
+ * <tt>:nowait => true or false (_default_)</tt> - Ignored by Bunny, always _false_.
87
+
88
+ ==== Returns:
89
+
90
+ <tt>:delete_ok</tt> if successful
91
+ =end
92
+
93
+ def delete(opts = {})
94
+ # ignore the :nowait option if passed, otherwise program will hang waiting for a
95
+ # response that will not be sent by the server
96
+ opts.delete(:nowait)
97
+
98
+ client.send_frame(
99
+ Qrack::Protocol::Exchange::Delete.new({ :exchange => name, :nowait => false }.merge(opts))
100
+ )
101
+
102
+ method = client.next_method
103
+
104
+ client.check_response(method, Qrack::Protocol::Exchange::DeleteOk,
105
+ "Error deleting exchange #{name}")
106
+
107
+ client.exchanges.delete(name)
108
+
109
+ # return confirmation
110
+ :delete_ok
111
+ end
112
+
113
+ =begin rdoc
114
+
115
+ === DESCRIPTION:
116
+
117
+ Publishes a message to a specific exchange. The message will be routed to queues as defined
118
+ by the exchange configuration and distributed to any active consumers when the transaction,
119
+ if any, is committed.
120
+
121
+ ==== OPTIONS:
122
+
123
+ * <tt>:key => 'routing_key'</tt> - Specifies the routing key for the message. The routing key is
124
+ used for routing messages depending on the exchange configuration.
125
+ * <tt>:mandatory => true or false (_default_)</tt> - Tells the server how to react if the message
126
+ cannot be routed to a queue. If set to _true_, the server will return an unroutable message
127
+ with a Return method. If this flag is zero, the server silently drops the message.
128
+ * <tt>:immediate => true or false (_default_)</tt> - Tells the server how to react if the message
129
+ cannot be routed to a queue consumer immediately. If set to _true_, the server will return an
130
+ undeliverable message with a Return method. If set to _false_, the server will queue the message,
131
+ but with no guarantee that it will ever be consumed.
132
+ * <tt>:persistent => true or false (_default_)</tt> - Tells the server whether to persist the message
133
+ If set to _true_, the message will be persisted to disk and not lost if the server restarts.
134
+ If set to _false_, the message will not be persisted across server restart. Setting to _true_
135
+ incurs a performance penalty as there is an extra cost associated with disk access.
136
+
137
+ ==== RETURNS:
138
+
139
+ nil
140
+
141
+ =end
142
+
143
+ def publish(data, opts = {})
144
+ opts = opts.dup
145
+ out = []
146
+
147
+ # Set up options
148
+ routing_key = opts.delete(:key) || key
149
+ mandatory = opts.delete(:mandatory)
150
+ immediate = opts.delete(:immediate)
151
+ delivery_mode = opts.delete(:persistent) ? 2 : 1
152
+
153
+ out << Qrack::Protocol::Basic::Publish.new(
154
+ { :exchange => name,
155
+ :routing_key => routing_key,
156
+ :mandatory => mandatory,
157
+ :immediate => immediate }
158
+ )
159
+ data = data.to_s
160
+ out << Qrack::Protocol::Header.new(
161
+ Qrack::Protocol::Basic,
162
+ data.length, {
163
+ :content_type => 'application/octet-stream',
164
+ :delivery_mode => delivery_mode,
165
+ :priority => 0
166
+ }.merge(opts)
167
+ )
168
+ out << Qrack::Transport::Body.new(data)
169
+
170
+ client.send_frame(*out)
171
+ end
172
+
173
+ end
174
+
175
+ end
@@ -0,0 +1,177 @@
1
+ module Bunny
2
+
3
+ =begin rdoc
4
+
5
+ === DESCRIPTION:
6
+
7
+ *Exchanges* are the routing and distribution hub of AMQP. All messages that Bunny sends
8
+ to an AMQP broker/server _have_ to pass through an exchange in order to be routed to a
9
+ destination queue. The AMQP specification defines the types of exchange that you can create.
10
+
11
+ At the time of writing there are four (4) types of exchange defined -
12
+
13
+ * <tt>:direct</tt>
14
+ * <tt>:fanout</tt>
15
+ * <tt>:topic</tt>
16
+ * <tt>:headers</tt>
17
+
18
+ AMQP-compliant brokers/servers are required to provide default exchanges for the _direct_ and
19
+ _fanout_ exchange types. All default exchanges are prefixed with <tt>'amq.'</tt>, for example -
20
+
21
+ * <tt>amq.direct</tt>
22
+ * <tt>amq.fanout</tt>
23
+ * <tt>amq.topic</tt>
24
+ * <tt>amq.match</tt> or <tt>amq.headers</tt>
25
+
26
+ If you want more information about exchanges, please consult the documentation for your
27
+ target broker/server or visit the {AMQP website}[http://www.amqp.org] to find the version of the
28
+ specification that applies to your target broker/server.
29
+
30
+ =end
31
+
32
+ class Exchange09
33
+
34
+ attr_reader :client, :type, :name, :opts, :key
35
+
36
+ def initialize(client, name, opts = {})
37
+ # check connection to server
38
+ raise Bunny::ConnectionError, 'Not connected to server' if client.status == :not_connected
39
+
40
+ @client, @name, @opts = client, name, opts
41
+
42
+ # set up the exchange type catering for default names
43
+ if name.match(/^amq\./)
44
+ new_type = name.sub(/amq\./, '')
45
+ # handle 'amq.match' default
46
+ new_type = 'headers' if new_type == 'match'
47
+ @type = new_type.to_sym
48
+ else
49
+ @type = opts[:type] || :direct
50
+ end
51
+
52
+ @key = opts[:key]
53
+ @client.exchanges[@name] ||= self
54
+
55
+ # ignore the :nowait option if passed, otherwise program will hang waiting for a
56
+ # response that will not be sent by the server
57
+ opts.delete(:nowait)
58
+
59
+ unless name == "amq.#{type}" or name == ''
60
+ client.send_frame(
61
+ Qrack::Protocol09::Exchange::Declare.new(
62
+ { :exchange => name, :type => type, :nowait => false,
63
+ :reserved_1 => 0, :reserved_2 => false, :reserved_3 => false }.merge(opts)
64
+ )
65
+ )
66
+
67
+ method = client.next_method
68
+
69
+ client.check_response(method, Qrack::Protocol09::Exchange::DeclareOk,
70
+ "Error declaring exchange #{name}: type = #{type}")
71
+
72
+ end
73
+ end
74
+
75
+ =begin rdoc
76
+
77
+ === DESCRIPTION:
78
+
79
+ Requests that an exchange is deleted from broker/server. Removes reference from exchanges
80
+ if successful. If an error occurs raises _Bunny_::_ProtocolError_.
81
+
82
+ ==== Options:
83
+
84
+ * <tt>:if_unused => true or false (_default_)</tt> - If set to _true_, the server will only
85
+ delete the exchange if it has no queue bindings. If the exchange has queue bindings the
86
+ server does not delete it but raises a channel exception instead.
87
+ * <tt>:nowait => true or false (_default_)</tt> - Ignored by Bunny, always _false_.
88
+
89
+ ==== Returns:
90
+
91
+ <tt>:delete_ok</tt> if successful
92
+ =end
93
+
94
+ def delete(opts = {})
95
+ # ignore the :nowait option if passed, otherwise program will hang waiting for a
96
+ # response that will not be sent by the server
97
+ opts.delete(:nowait)
98
+
99
+ client.send_frame(
100
+ Qrack::Protocol09::Exchange::Delete.new({ :exchange => name, :nowait => false, :reserved_1 => 0 }.merge(opts))
101
+ )
102
+
103
+ method = client.next_method
104
+
105
+ client.check_response(method, Qrack::Protocol09::Exchange::DeleteOk,
106
+ "Error deleting exchange #{name}")
107
+
108
+ client.exchanges.delete(name)
109
+
110
+ # return confirmation
111
+ :delete_ok
112
+ end
113
+
114
+ =begin rdoc
115
+
116
+ === DESCRIPTION:
117
+
118
+ Publishes a message to a specific exchange. The message will be routed to queues as defined
119
+ by the exchange configuration and distributed to any active consumers when the transaction,
120
+ if any, is committed.
121
+
122
+ ==== OPTIONS:
123
+
124
+ * <tt>:key => 'routing_key'</tt> - Specifies the routing key for the message. The routing key is
125
+ used for routing messages depending on the exchange configuration.
126
+ * <tt>:mandatory => true or false (_default_)</tt> - Tells the server how to react if the message
127
+ cannot be routed to a queue. If set to _true_, the server will return an unroutable message
128
+ with a Return method. If this flag is zero, the server silently drops the message.
129
+ * <tt>:immediate => true or false (_default_)</tt> - Tells the server how to react if the message
130
+ cannot be routed to a queue consumer immediately. If set to _true_, the server will return an
131
+ undeliverable message with a Return method. If set to _false_, the server will queue the message,
132
+ but with no guarantee that it will ever be consumed.
133
+ * <tt>:persistent => true or false (_default_)</tt> - Tells the server whether to persist the message
134
+ If set to _true_, the message will be persisted to disk and not lost if the server restarts.
135
+ If set to _false_, the message will not be persisted across server restart. Setting to _true_
136
+ incurs a performance penalty as there is an extra cost associated with disk access.
137
+
138
+ ==== RETURNS:
139
+
140
+ nil
141
+
142
+ =end
143
+
144
+ def publish(data, opts = {})
145
+ opts = opts.dup
146
+ out = []
147
+
148
+ # Set up options
149
+ routing_key = opts.delete(:key) || key
150
+ mandatory = opts.delete(:mandatory)
151
+ immediate = opts.delete(:immediate)
152
+ delivery_mode = opts.delete(:persistent) ? 2 : 1
153
+
154
+ out << Qrack::Protocol09::Basic::Publish.new(
155
+ { :exchange => name,
156
+ :routing_key => routing_key,
157
+ :mandatory => mandatory,
158
+ :immediate => immediate,
159
+ :reserved_1 => 0 }
160
+ )
161
+ data = data.to_s
162
+ out << Qrack::Protocol09::Header.new(
163
+ Qrack::Protocol09::Basic,
164
+ data.length, {
165
+ :content_type => 'application/octet-stream',
166
+ :delivery_mode => delivery_mode,
167
+ :priority => 0
168
+ }.merge(opts)
169
+ )
170
+ out << Qrack::Transport09::Body.new(data)
171
+
172
+ client.send_frame(*out)
173
+ end
174
+
175
+ end
176
+
177
+ end
@@ -0,0 +1,389 @@
1
+ module Bunny
2
+
3
+ =begin rdoc
4
+
5
+ === DESCRIPTION:
6
+
7
+ Queues store and forward messages. Queues can be configured in the server or created at runtime.
8
+ Queues must be attached to at least one exchange in order to receive messages from publishers.
9
+
10
+ =end
11
+
12
+ class Queue < Qrack::Queue
13
+
14
+ def initialize(client, name, opts = {})
15
+ # check connection to server
16
+ raise Bunny::ConnectionError, 'Not connected to server' if client.status == :not_connected
17
+
18
+ @client = client
19
+ @opts = opts
20
+ @delivery_tag = nil
21
+ @subscription = nil
22
+
23
+ # Queues without a given name are named by the server and are generally
24
+ # bound to the process that created them.
25
+ if !name
26
+ opts = {
27
+ :passive => false,
28
+ :durable => false,
29
+ :exclusive => true,
30
+ :auto_delete => true
31
+ }.merge(opts)
32
+ end
33
+
34
+ # ignore the :nowait option if passed, otherwise program will hang waiting for a
35
+ # response that will not be sent by the server
36
+ opts.delete(:nowait)
37
+
38
+ client.send_frame(
39
+ Qrack::Protocol::Queue::Declare.new({ :queue => name || '', :nowait => false }.merge(opts))
40
+ )
41
+
42
+ method = client.next_method
43
+
44
+ client.check_response(method, Qrack::Protocol::Queue::DeclareOk, "Error declaring queue #{name}")
45
+
46
+ @name = method.queue
47
+ client.queues[@name] = self
48
+ end
49
+
50
+ =begin rdoc
51
+
52
+ === DESCRIPTION:
53
+
54
+ Acknowledges one or more messages delivered via the _Deliver_ or _Get_-_Ok_ methods. The client can
55
+ ask to confirm a single message or a set of messages up to and including a specific message.
56
+
57
+ ==== OPTIONS:
58
+
59
+ * <tt>:delivery_tag</tt>
60
+ * <tt>:multiple => true or false (_default_)</tt> - If set to _true_, the delivery tag is treated
61
+ as "up to and including", so that the client can acknowledge multiple messages with a single
62
+ method. If set to _false_, the delivery tag refers to a single message. If the multiple field
63
+ is _true_, and the delivery tag is zero, tells the server to acknowledge all outstanding messages.
64
+
65
+ =end
66
+
67
+ def ack(opts={})
68
+ # Set delivery tag
69
+ if delivery_tag.nil? and opts[:delivery_tag].nil?
70
+ raise Bunny::AcknowledgementError, "No delivery tag received"
71
+ else
72
+ self.delivery_tag = opts[:delivery_tag] if delivery_tag.nil?
73
+ end
74
+
75
+ client.send_frame(
76
+ Qrack::Protocol::Basic::Ack.new({:delivery_tag => delivery_tag, :multiple => false}.merge(opts))
77
+ )
78
+
79
+ # reset delivery tag
80
+ self.delivery_tag = nil
81
+ end
82
+
83
+ =begin rdoc
84
+
85
+ === DESCRIPTION:
86
+
87
+ Binds a queue to an exchange. Until a queue is bound it will not receive any messages. Queues are
88
+ bound to the direct exchange '' by default. If error occurs, a _Bunny_::_ProtocolError_ is raised.
89
+
90
+ * <tt>:key => 'routing key'* <tt>:key => 'routing_key'</tt> - Specifies the routing key for
91
+ the binding. The routing key is used for routing messages depending on the exchange configuration.
92
+ * <tt>:nowait => true or false (_default_)</tt> - Ignored by Bunny, always _false_.
93
+
94
+ ==== RETURNS:
95
+
96
+ <tt>:bind_ok</tt> if successful.
97
+
98
+ =end
99
+
100
+ def bind(exchange, opts = {})
101
+ exchange = exchange.respond_to?(:name) ? exchange.name : exchange
102
+
103
+ # ignore the :nowait option if passed, otherwise program will hang waiting for a
104
+ # response that will not be sent by the server
105
+ opts.delete(:nowait)
106
+
107
+ client.send_frame(
108
+ Qrack::Protocol::Queue::Bind.new({ :queue => name,
109
+ :exchange => exchange,
110
+ :routing_key => opts.delete(:key),
111
+ :nowait => false }.merge(opts))
112
+ )
113
+
114
+ method = client.next_method
115
+
116
+ client.check_response(method, Qrack::Protocol::Queue::BindOk,
117
+ "Error binding queue: #{name} to exchange: #{exchange}")
118
+
119
+ # return message
120
+ :bind_ok
121
+ end
122
+
123
+ =begin rdoc
124
+
125
+ === DESCRIPTION:
126
+
127
+ Requests that a queue is deleted from broker/server. When a queue is deleted any pending messages
128
+ are sent to a dead-letter queue if this is defined in the server configuration. Removes reference
129
+ from queues if successful. If an error occurs raises _Bunny_::_ProtocolError_.
130
+
131
+ ==== Options:
132
+
133
+ * <tt>:if_unused => true or false (_default_)</tt> - If set to _true_, the server will only
134
+ delete the queue if it has no consumers. If the queue has consumers the server does not
135
+ delete it but raises a channel exception instead.
136
+ * <tt>:if_empty => true or false (_default_)</tt> - If set to _true_, the server will only
137
+ delete the queue if it has no messages. If the queue is not empty the server raises a channel
138
+ exception.
139
+ * <tt>:nowait => true or false (_default_)</tt> - Ignored by Bunny, always _false_.
140
+
141
+ ==== Returns:
142
+
143
+ <tt>:delete_ok</tt> if successful
144
+ =end
145
+
146
+ def delete(opts = {})
147
+ # ignore the :nowait option if passed, otherwise program will hang waiting for a
148
+ # response that will not be sent by the server
149
+ opts.delete(:nowait)
150
+
151
+ client.send_frame(
152
+ Qrack::Protocol::Queue::Delete.new({ :queue => name, :nowait => false }.merge(opts))
153
+ )
154
+
155
+ method = client.next_method
156
+
157
+ client.check_response(method, Qrack::Protocol::Queue::DeleteOk, "Error deleting queue #{name}")
158
+
159
+ client.queues.delete(name)
160
+
161
+ # return confirmation
162
+ :delete_ok
163
+ end
164
+
165
+ =begin rdoc
166
+
167
+ === DESCRIPTION:
168
+
169
+ Gets a message from a queue in a synchronous way. If error occurs, raises _Bunny_::_ProtocolError_.
170
+
171
+ ==== OPTIONS:
172
+
173
+ * <tt>:ack => false (_default_) or true</tt> - If set to _false_, the server does not expect an
174
+ acknowledgement message from the client. If set to _true_, the server expects an acknowledgement
175
+ message from the client and will re-queue the message if it does not receive one within a time specified
176
+ by the server.
177
+
178
+ ==== RETURNS:
179
+
180
+ Hash <tt>{:header, :payload, :delivery_details}</tt>. <tt>:delivery_details</tt> is
181
+ a hash <tt>{:consumer_tag, :delivery_tag, :redelivered, :exchange, :routing_key}</tt>.
182
+
183
+ If the queue is empty the returned hash will contain the values -
184
+
185
+ :header => nil
186
+ :payload => :queue_empty
187
+ :delivery_details => nil
188
+
189
+ N.B. If a block is provided then the hash will be passed into the block and the return value
190
+ will be nil.
191
+
192
+ =end
193
+
194
+ def pop(opts = {}, &blk)
195
+
196
+ # do we want to have to provide an acknowledgement?
197
+ ack = opts.delete(:ack)
198
+
199
+ client.send_frame(
200
+ Qrack::Protocol::Basic::Get.new({ :queue => name,
201
+ :consumer_tag => name,
202
+ :no_ack => !ack,
203
+ :nowait => true }.merge(opts))
204
+ )
205
+
206
+ method = client.next_method
207
+
208
+ if method.is_a?(Qrack::Protocol::Basic::GetEmpty) then
209
+ queue_empty = true
210
+ elsif !method.is_a?(Qrack::Protocol::Basic::GetOk)
211
+ raise Bunny::ProtocolError, "Error getting message from queue #{name}"
212
+ end
213
+
214
+ if !queue_empty
215
+ # get delivery tag to use for acknowledge
216
+ self.delivery_tag = method.delivery_tag if ack
217
+
218
+ header = client.next_payload
219
+
220
+ # If maximum frame size is smaller than message payload body then message
221
+ # will have a message header and several message bodies
222
+ msg = ''
223
+ while msg.length < header.size
224
+ msg += client.next_payload
225
+ end
226
+
227
+ msg_hash = {:header => header, :payload => msg, :delivery_details => method.arguments}
228
+
229
+ else
230
+ msg_hash = {:header => nil, :payload => :queue_empty, :delivery_details => nil}
231
+ end
232
+
233
+ # Pass message hash to block or return message hash
234
+ blk ? blk.call(msg_hash) : msg_hash
235
+
236
+ end
237
+
238
+ =begin rdoc
239
+
240
+ === DESCRIPTION:
241
+
242
+ Removes all messages from a queue. It does not cancel consumers. Purged messages are deleted
243
+ without any formal "undo" mechanism. If an error occurs raises _Bunny_::_ProtocolError_.
244
+
245
+ ==== Options:
246
+
247
+ * <tt>:nowait => true or false (_default_)</tt> - Ignored by Bunny, always _false_.
248
+
249
+ ==== Returns:
250
+
251
+ <tt>:purge_ok</tt> if successful
252
+ =end
253
+
254
+ def purge(opts = {})
255
+ # ignore the :nowait option if passed, otherwise program will hang waiting for a
256
+ # response that will not be sent by the server
257
+ opts.delete(:nowait)
258
+
259
+ client.send_frame(
260
+ Qrack::Protocol::Queue::Purge.new({ :queue => name, :nowait => false }.merge(opts))
261
+ )
262
+
263
+ method = client.next_method
264
+
265
+ client.check_response(method, Qrack::Protocol::Queue::PurgeOk, "Error purging queue #{name}")
266
+
267
+ # return confirmation
268
+ :purge_ok
269
+
270
+ end
271
+
272
+ =begin rdoc
273
+
274
+ === DESCRIPTION:
275
+
276
+ Returns hash {:message_count, :consumer_count}.
277
+
278
+ =end
279
+
280
+ def status
281
+ client.send_frame(
282
+ Qrack::Protocol::Queue::Declare.new({ :queue => name, :passive => true })
283
+ )
284
+ method = client.next_method
285
+ {:message_count => method.message_count, :consumer_count => method.consumer_count}
286
+ end
287
+
288
+
289
+ def subscribe(opts = {}, &blk)
290
+ # Create subscription
291
+ s = Bunny::Subscription.new(client, self, opts)
292
+ s.start(&blk)
293
+
294
+ # Reset when subscription finished
295
+ @subscription = nil
296
+ end
297
+
298
+ =begin rdoc
299
+
300
+ === DESCRIPTION:
301
+
302
+ Cancels a consumer. This does not affect already delivered messages, but it does mean
303
+ the server will not send any more messages for that consumer.
304
+
305
+ ==== OPTIONS:
306
+
307
+ * <tt>:consumer_tag => '_tag_'</tt> - Specifies the identifier for the consumer.
308
+ * <tt>:nowait => true or false (_default_)</tt> - Ignored by Bunny, always _false_.
309
+
310
+ ==== Returns:
311
+
312
+ <tt>:unsubscribe_ok</tt> if successful
313
+
314
+ =end
315
+
316
+ def unsubscribe(opts = {})
317
+ # Default consumer_tag from subscription if not passed in
318
+ consumer_tag = subscription ? subscription.consumer_tag : opts[:consumer_tag]
319
+
320
+ # Must have consumer tag to tell server what to unsubscribe
321
+ raise Bunny::UnsubscribeError,
322
+ "No consumer tag received" if !consumer_tag
323
+
324
+ # Cancel consumer
325
+ client.send_frame( Qrack::Protocol::Basic::Cancel.new(:consumer_tag => consumer_tag,
326
+ :nowait => false))
327
+
328
+ method = client.next_method
329
+
330
+ client.check_response(method, Qrack::Protocol::Basic::CancelOk,
331
+ "Error unsubscribing from queue #{name}")
332
+
333
+ # Reset subscription
334
+ @subscription = nil
335
+
336
+ # Return confirmation
337
+ :unsubscribe_ok
338
+
339
+ end
340
+
341
+ =begin rdoc
342
+
343
+ === DESCRIPTION:
344
+
345
+ Removes a queue binding from an exchange. If error occurs, a _Bunny_::_ProtocolError_ is raised.
346
+
347
+ ==== OPTIONS:
348
+ * <tt>:key => 'routing key'* <tt>:key => 'routing_key'</tt> - Specifies the routing key for
349
+ the binding.
350
+ * <tt>:nowait => true or false (_default_)</tt> - Ignored by Bunny, always _false_.
351
+
352
+ ==== RETURNS:
353
+
354
+ <tt>:unbind_ok</tt> if successful.
355
+
356
+ =end
357
+
358
+ def unbind(exchange, opts = {})
359
+ exchange = exchange.respond_to?(:name) ? exchange.name : exchange
360
+
361
+ # ignore the :nowait option if passed, otherwise program will hang waiting for a
362
+ # response that will not be sent by the server
363
+ opts.delete(:nowait)
364
+
365
+ client.send_frame(
366
+ Qrack::Protocol::Queue::Unbind.new({ :queue => name,
367
+ :exchange => exchange,
368
+ :routing_key => opts.delete(:key),
369
+ :nowait => false }.merge(opts)
370
+ )
371
+ )
372
+
373
+ method = client.next_method
374
+
375
+ client.check_response(method, Qrack::Protocol::Queue::UnbindOk, "Error unbinding queue #{name}")
376
+
377
+ # return message
378
+ :unbind_ok
379
+ end
380
+
381
+ private
382
+
383
+ def exchange
384
+ @exchange ||= Bunny::Exchange.new(client, '', {:type => :direct, :key => name})
385
+ end
386
+
387
+ end
388
+
389
+ end