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,85 @@
1
+ module Bunny
2
+
3
+ =begin rdoc
4
+
5
+ === DESCRIPTION:
6
+
7
+ Asks the server to start a "consumer", which is a transient request for messages from a specific
8
+ queue. Consumers last as long as the channel they were created on, or until the client cancels them
9
+ with an _unsubscribe_. Every time a message reaches the queue it is passed to the _blk_ for
10
+ processing. If error occurs, _Bunny_::_ProtocolError_ is raised.
11
+
12
+ ==== OPTIONS:
13
+ * <tt>:consumer_tag => '_tag_'</tt> - Specifies the identifier for the consumer. The consumer tag is
14
+ local to a connection, so two clients can use the same consumer tags. If this option is not
15
+ specified a server generated name is used.
16
+ * <tt>:ack => false (_default_) or true</tt> - If set to _false_, the server does not expect an
17
+ acknowledgement message from the client. If set to _true_, the server expects an acknowledgement
18
+ message from the client and will re-queue the message if it does not receive one within a time specified
19
+ by the server.
20
+ * <tt>:exclusive => true or false (_default_)</tt> - Request exclusive consumer access, meaning
21
+ only this consumer can access the queue.
22
+ * <tt>:nowait => true or false (_default_)</tt> - Ignored by Bunny, always _false_.
23
+ * <tt>:timeout => number of seconds - The subscribe loop will continue to wait for
24
+ messages until terminated (Ctrl-C or kill command) or this timeout interval is reached.
25
+ * <tt>:message_max => max number messages to process</tt> - When the required number of messages
26
+ is processed subscribe loop is exited.
27
+
28
+ ==== OPERATION:
29
+
30
+ Passes a hash of message information to the block, if one has been supplied. The hash contains
31
+ :header, :payload and :delivery_details. The structure of the data is as follows -
32
+
33
+ :header has instance variables -
34
+ @klass
35
+ @size
36
+ @weight
37
+ @properties is a hash containing -
38
+ :content_type
39
+ :delivery_mode
40
+ :priority
41
+
42
+ :payload contains the message contents
43
+
44
+ :delivery details is a hash containing -
45
+ :consumer_tag
46
+ :delivery_tag
47
+ :redelivered
48
+ :exchange
49
+ :routing_key
50
+
51
+ If the :timeout option is specified then Qrack::ClientTimeout is raised if method times out
52
+ waiting to receive the next message from the queue.
53
+
54
+ ==== EXAMPLES
55
+
56
+ my_queue.subscribe(:timeout => 5) {|msg| puts msg[:payload]}
57
+
58
+ my_queue.subscribe(:message_max => 10, :ack => true) {|msg| puts msg[:payload]}
59
+
60
+ =end
61
+
62
+ class Subscription09 < Qrack::Subscription
63
+
64
+ def setup_consumer
65
+ client.send_frame(
66
+ Qrack::Protocol09::Basic::Consume.new({ :reserved_1 => 0,
67
+ :queue => queue.name,
68
+ :consumer_tag => consumer_tag,
69
+ :no_ack => !ack,
70
+ :exclusive => exclusive,
71
+ :nowait => false}.merge(@opts))
72
+ )
73
+
74
+ method = client.next_method
75
+
76
+ client.check_response(method, Qrack::Protocol09::Basic::ConsumeOk,
77
+ "Error subscribing to queue #{queue.name}")
78
+
79
+ @consumer_tag = method.consumer_tag
80
+
81
+ end
82
+
83
+ end
84
+
85
+ end
@@ -0,0 +1,87 @@
1
+ $:.unshift File.expand_path(File.dirname(__FILE__))
2
+
3
+ # Ruby standard libraries
4
+ %w[socket thread timeout logger].each do |file|
5
+ require file
6
+ end
7
+
8
+ module Bunny
9
+
10
+ class ConnectionError < StandardError; end
11
+ class ForcedChannelCloseError < StandardError; end
12
+ class ForcedConnectionCloseError < StandardError; end
13
+ class MessageError < StandardError; end
14
+ class ProtocolError < StandardError; end
15
+ class ServerDownError < StandardError; end
16
+ class UnsubscribeError < StandardError; end
17
+ class AcknowledgementError < StandardError; end
18
+
19
+ VERSION = '0.6.0'
20
+
21
+ # Returns the Bunny version number
22
+
23
+ def self.version
24
+ VERSION
25
+ end
26
+
27
+ # Instantiates new Bunny::Client
28
+
29
+ def self.new(opts = {})
30
+ # Set up Bunny according to AMQP spec version required
31
+ spec_version = opts[:spec] || '08'
32
+
33
+ # Return client
34
+ setup(spec_version, opts)
35
+ end
36
+
37
+ # Runs a code block using a short-lived connection
38
+
39
+ def self.run(opts = {}, &block)
40
+ raise ArgumentError, 'Bunny#run requires a block' unless block
41
+
42
+ # Set up Bunny according to AMQP spec version required
43
+ spec_version = opts[:spec] || '08'
44
+ client = setup(spec_version, opts)
45
+
46
+ begin
47
+ client.start
48
+ block.call(client)
49
+ ensure
50
+ client.stop
51
+ end
52
+
53
+ # Return success
54
+ :run_ok
55
+ end
56
+
57
+ private
58
+
59
+ def self.setup(version, opts)
60
+ if version == '08'
61
+ # AMQP 0-8 specification
62
+ require 'qrack/qrack08'
63
+ require 'bunny/client08'
64
+ require 'bunny/exchange08'
65
+ require 'bunny/queue08'
66
+ require 'bunny/channel08'
67
+ require 'bunny/subscription08'
68
+
69
+ client = Bunny::Client.new(opts)
70
+ else
71
+ # AMQP 0-9-1 specification
72
+ require 'qrack/qrack09'
73
+ require 'bunny/client09'
74
+ require 'bunny/exchange09'
75
+ require 'bunny/queue09'
76
+ require 'bunny/channel09'
77
+ require 'bunny/subscription09'
78
+
79
+ client = Bunny::Client09.new(opts)
80
+ end
81
+
82
+ include Qrack
83
+
84
+ client
85
+ end
86
+
87
+ end
@@ -0,0 +1,18 @@
1
+ module Qrack
2
+ # Channel ancestor class
3
+ class Channel
4
+
5
+ attr_accessor :number, :active, :frame_buffer
6
+ attr_reader :client
7
+
8
+ def initialize(client)
9
+ @frame_buffer = []
10
+ @client = client
11
+ @number = client.channels.size
12
+ @active = false
13
+ client.channels[@number] = self
14
+ end
15
+
16
+ end
17
+
18
+ end
@@ -0,0 +1,204 @@
1
+ module Qrack
2
+
3
+ class ClientTimeout < Timeout::Error; end
4
+ class ConnectionTimeout < Timeout::Error; end
5
+
6
+ # Client ancestor class
7
+ class Client
8
+
9
+ CONNECT_TIMEOUT = 5.0
10
+ RETRY_DELAY = 10.0
11
+
12
+ attr_reader :status, :host, :vhost, :port, :logging, :spec, :heartbeat
13
+ attr_accessor :channel, :logfile, :exchanges, :queues, :channels, :message_in, :message_out,
14
+ :connecting
15
+
16
+ def initialize(opts = {})
17
+ @host = opts[:host] || 'localhost'
18
+ @user = opts[:user] || 'guest'
19
+ @pass = opts[:pass] || 'guest'
20
+ @vhost = opts[:vhost] || '/'
21
+ @logfile = opts[:logfile] || nil
22
+ @logging = opts[:logging] || false
23
+ @ssl = opts[:ssl] || false
24
+ @verify_ssl = opts[:verify_ssl].nil? || opts[:verify_ssl]
25
+ @status = :not_connected
26
+ @frame_max = opts[:frame_max] || 131072
27
+ @channel_max = opts[:channel_max] || 0
28
+ @heartbeat = opts[:heartbeat] || 0
29
+ @connect_timeout = opts[:connect_timeout] || CONNECT_TIMEOUT
30
+ @logger = nil
31
+ create_logger if @logging
32
+ @message_in = false
33
+ @message_out = false
34
+ @connecting = false
35
+ @channels ||= []
36
+ # Create channel 0
37
+ @channel = create_channel()
38
+ @exchanges ||= {}
39
+ @queues ||= {}
40
+ end
41
+
42
+ =begin rdoc
43
+
44
+ === DESCRIPTION:
45
+
46
+ Closes all active communication channels and connection. If an error occurs a
47
+ _Bunny_::_ProtocolError_ is raised. If successful, _Client_._status_ is set to <tt>:not_connected</tt>.
48
+
49
+ ==== RETURNS:
50
+
51
+ <tt>:not_connected</tt> if successful.
52
+
53
+ =end
54
+
55
+ def close
56
+ # Close all active channels
57
+ channels.each do |c|
58
+ c.close if c.open?
59
+ end
60
+
61
+ # Close connection to AMQP server
62
+ close_connection
63
+
64
+ # Close TCP Socket
65
+ close_socket
66
+ end
67
+
68
+ alias stop close
69
+
70
+ def connected?
71
+ status == :connected
72
+ end
73
+
74
+ def connecting?
75
+ connecting
76
+ end
77
+
78
+ def logging=(bool)
79
+ @logging = bool
80
+ create_logger if @logging
81
+ end
82
+
83
+ def next_payload(options = {})
84
+ next_frame(options).payload
85
+ end
86
+
87
+ alias next_method next_payload
88
+
89
+ def read(*args)
90
+ send_command(:read, *args)
91
+ end
92
+
93
+ =begin rdoc
94
+
95
+ === DESCRIPTION:
96
+
97
+ Checks to see whether or not an undeliverable message has been returned as a result of a publish
98
+ with the <tt>:immediate</tt> or <tt>:mandatory</tt> options.
99
+
100
+ ==== OPTIONS:
101
+
102
+ * <tt>:timeout => number of seconds (default = 0.1) - The method will wait for a return
103
+ message until this timeout interval is reached.
104
+
105
+ ==== RETURNS:
106
+
107
+ <tt>{:header => nil, :payload => :no_return, :return_details => nil}</tt> if message is
108
+ not returned before timeout.
109
+ <tt>{:header, :return_details, :payload}</tt> if message is returned. <tt>:return_details</tt> is
110
+ a hash <tt>{:reply_code, :reply_text, :exchange, :routing_key}</tt>.
111
+
112
+ =end
113
+
114
+ def returned_message(opts = {})
115
+
116
+ begin
117
+ frame = next_frame(:timeout => opts[:timeout] || 0.1)
118
+ rescue Qrack::ClientTimeout
119
+ return {:header => nil, :payload => :no_return, :return_details => nil}
120
+ end
121
+
122
+ method = frame.payload
123
+ header = next_payload
124
+
125
+ # If maximum frame size is smaller than message payload body then message
126
+ # will have a message header and several message bodies
127
+ msg = ''
128
+ while msg.length < header.size
129
+ msg += next_payload
130
+ end
131
+
132
+ # Return the message and related info
133
+ {:header => header, :payload => msg, :return_details => method.arguments}
134
+ end
135
+
136
+ def switch_channel(chann)
137
+ if (0...channels.size).include? chann
138
+ @channel = channels[chann]
139
+ chann
140
+ else
141
+ raise RuntimeError, "Invalid channel number - #{chann}"
142
+ end
143
+ end
144
+
145
+ def write(*args)
146
+ send_command(:write, *args)
147
+ end
148
+
149
+ private
150
+
151
+ def close_socket(reason=nil)
152
+ # Close the socket. The server is not considered dead.
153
+ @socket.close if @socket and not @socket.closed?
154
+ @socket = nil
155
+ @status = :not_connected
156
+ end
157
+
158
+ def create_logger
159
+ @logfile ? @logger = Logger.new("#{logfile}") : @logger = Logger.new(STDOUT)
160
+ @logger.level = Logger::INFO
161
+ @logger.datetime_format = "%Y-%m-%d %H:%M:%S"
162
+ end
163
+
164
+ def send_command(cmd, *args)
165
+ begin
166
+ raise Bunny::ConnectionError, 'No connection - socket has not been created' if !@socket
167
+ @socket.__send__(cmd, *args)
168
+ rescue Errno::EPIPE, IOError => e
169
+ raise Bunny::ServerDownError, e.message
170
+ end
171
+ end
172
+
173
+ def socket
174
+ return @socket if @socket and (@status == :connected) and not @socket.closed?
175
+
176
+ begin
177
+ # Attempt to connect.
178
+ @socket = timeout(@connect_timeout, ConnectionTimeout) do
179
+ TCPSocket.new(host, port)
180
+ end
181
+
182
+ if Socket.constants.include? 'TCP_NODELAY'
183
+ @socket.setsockopt Socket::IPPROTO_TCP, Socket::TCP_NODELAY, 1
184
+ end
185
+
186
+ if @ssl
187
+ require 'openssl' unless defined? OpenSSL::SSL
188
+ @socket = OpenSSL::SSL::SSLSocket.new(@socket)
189
+ @socket.sync_close = true
190
+ @socket.connect
191
+ @socket.post_connection_check(host) if @verify_ssl
192
+ @socket
193
+ end
194
+ rescue => e
195
+ @status = :not_connected
196
+ raise Bunny::ServerDownError, e.message
197
+ end
198
+
199
+ @socket
200
+ end
201
+
202
+ end
203
+
204
+ end
@@ -0,0 +1,132 @@
1
+ module Qrack
2
+ module Protocol
3
+ #:stopdoc:
4
+ class Class::Method
5
+ def initialize *args
6
+ opts = args.pop if args.last.is_a? Hash
7
+ opts ||= {}
8
+
9
+ if args.size == 1 and args.first.is_a? Transport::Buffer
10
+ buf = args.shift
11
+ else
12
+ buf = nil
13
+ end
14
+
15
+ self.class.arguments.each do |type, name|
16
+ val = buf ? buf.read(type) :
17
+ args.shift || opts[name] || opts[name.to_s]
18
+ instance_variable_set("@#{name}", val)
19
+ end
20
+ end
21
+
22
+ def arguments
23
+ self.class.arguments.inject({}) do |hash, (type, name)|
24
+ hash.update name => instance_variable_get("@#{name}")
25
+ end
26
+ end
27
+
28
+ def to_binary
29
+ buf = Transport::Buffer.new
30
+ buf.write :short, self.class.parent.id
31
+ buf.write :short, self.class.id
32
+
33
+ bits = []
34
+
35
+ self.class.arguments.each do |type, name|
36
+ val = instance_variable_get("@#{name}")
37
+ if type == :bit
38
+ bits << (val || false)
39
+ else
40
+ unless bits.empty?
41
+ buf.write :bit, bits
42
+ bits = []
43
+ end
44
+ buf.write type, val
45
+ end
46
+ end
47
+
48
+ buf.write :bit, bits unless bits.empty?
49
+ buf.rewind
50
+
51
+ buf
52
+ end
53
+
54
+ def to_s
55
+ to_binary.to_s
56
+ end
57
+
58
+ def to_frame channel = 0
59
+ Transport::Method.new(self, channel)
60
+ end
61
+ end
62
+
63
+ class Header
64
+ def initialize *args
65
+ opts = args.pop if args.last.is_a? Hash
66
+ opts ||= {}
67
+
68
+ first = args.shift
69
+
70
+ if first.is_a? ::Class and first.ancestors.include? Protocol::Class
71
+ @klass = first
72
+ @size = args.shift || 0
73
+ @weight = args.shift || 0
74
+ @properties = opts
75
+
76
+ elsif first.is_a? Transport::Buffer or first.is_a? String
77
+ buf = first
78
+ buf = Transport::Buffer.new(buf) unless buf.is_a? Transport::Buffer
79
+
80
+ @klass = Protocol.classes[buf.read(:short)]
81
+ @weight = buf.read(:short)
82
+ @size = buf.read(:longlong)
83
+
84
+ props = buf.read(:properties, *klass.properties.map{|type,_| type })
85
+ @properties = Hash[*klass.properties.map{|_,name| name }.zip(props).reject{|k,v| v.nil? }.flatten]
86
+
87
+ else
88
+ raise ArgumentError, 'Invalid argument'
89
+ end
90
+
91
+ end
92
+ attr_accessor :klass, :size, :weight, :properties
93
+
94
+ def to_binary
95
+ buf = Transport::Buffer.new
96
+ buf.write :short, klass.id
97
+ buf.write :short, weight # XXX rabbitmq only supports weight == 0
98
+ buf.write :longlong, size
99
+ buf.write :properties, (klass.properties.map do |type, name|
100
+ [ type, properties[name] || properties[name.to_s] ]
101
+ end)
102
+ buf.rewind
103
+ buf
104
+ end
105
+
106
+ def to_s
107
+ to_binary.to_s
108
+ end
109
+
110
+ def to_frame channel = 0
111
+ Transport::Header.new(self, channel)
112
+ end
113
+
114
+ def == header
115
+ [ :klass, :size, :weight, :properties ].inject(true) do |eql, field|
116
+ eql and __send__(field) == header.__send__(field)
117
+ end
118
+ end
119
+
120
+ def method_missing meth, *args, &blk
121
+ @properties.has_key?(meth) || @klass.properties.find{|_,name| name == meth } ? @properties[meth] : super
122
+ end
123
+ end
124
+
125
+ def self.parse buf
126
+ buf = Transport::Buffer.new(buf) unless buf.is_a? Transport::Buffer
127
+ class_id, method_id = buf.read(:short, :short)
128
+ classes[class_id].methods[method_id].new(buf)
129
+ end
130
+
131
+ end
132
+ end