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.
- data/.document +5 -0
- data/.gitignore +21 -0
- data/LICENSE +20 -0
- data/README.rdoc +17 -0
- data/Rakefile +52 -0
- data/VERSION +1 -0
- data/lib/ext/README +1 -0
- data/lib/ext/bunny-0.6.0/LICENSE +20 -0
- data/lib/ext/bunny-0.6.0/README.rdoc +66 -0
- data/lib/ext/bunny-0.6.0/Rakefile +24 -0
- data/lib/ext/bunny-0.6.0/bunny.gemspec +65 -0
- data/lib/ext/bunny-0.6.0/examples/simple_08.rb +30 -0
- data/lib/ext/bunny-0.6.0/examples/simple_09.rb +30 -0
- data/lib/ext/bunny-0.6.0/examples/simple_ack_08.rb +33 -0
- data/lib/ext/bunny-0.6.0/examples/simple_ack_09.rb +33 -0
- data/lib/ext/bunny-0.6.0/examples/simple_consumer_08.rb +53 -0
- data/lib/ext/bunny-0.6.0/examples/simple_consumer_09.rb +53 -0
- data/lib/ext/bunny-0.6.0/examples/simple_fanout_08.rb +39 -0
- data/lib/ext/bunny-0.6.0/examples/simple_fanout_09.rb +39 -0
- data/lib/ext/bunny-0.6.0/examples/simple_headers_08.rb +40 -0
- data/lib/ext/bunny-0.6.0/examples/simple_headers_09.rb +40 -0
- data/lib/ext/bunny-0.6.0/examples/simple_publisher_08.rb +27 -0
- data/lib/ext/bunny-0.6.0/examples/simple_publisher_09.rb +27 -0
- data/lib/ext/bunny-0.6.0/examples/simple_topic_08.rb +59 -0
- data/lib/ext/bunny-0.6.0/examples/simple_topic_09.rb +59 -0
- data/lib/ext/bunny-0.6.0/lib/bunny/channel08.rb +39 -0
- data/lib/ext/bunny-0.6.0/lib/bunny/channel09.rb +39 -0
- data/lib/ext/bunny-0.6.0/lib/bunny/client08.rb +494 -0
- data/lib/ext/bunny-0.6.0/lib/bunny/client09.rb +460 -0
- data/lib/ext/bunny-0.6.0/lib/bunny/exchange08.rb +175 -0
- data/lib/ext/bunny-0.6.0/lib/bunny/exchange09.rb +177 -0
- data/lib/ext/bunny-0.6.0/lib/bunny/queue08.rb +389 -0
- data/lib/ext/bunny-0.6.0/lib/bunny/queue09.rb +395 -0
- data/lib/ext/bunny-0.6.0/lib/bunny/subscription08.rb +85 -0
- data/lib/ext/bunny-0.6.0/lib/bunny/subscription09.rb +85 -0
- data/lib/ext/bunny-0.6.0/lib/bunny.rb +87 -0
- data/lib/ext/bunny-0.6.0/lib/qrack/channel.rb +18 -0
- data/lib/ext/bunny-0.6.0/lib/qrack/client.rb +204 -0
- data/lib/ext/bunny-0.6.0/lib/qrack/protocol/protocol08.rb +132 -0
- data/lib/ext/bunny-0.6.0/lib/qrack/protocol/protocol09.rb +133 -0
- data/lib/ext/bunny-0.6.0/lib/qrack/protocol/spec08.rb +823 -0
- data/lib/ext/bunny-0.6.0/lib/qrack/protocol/spec09.rb +521 -0
- data/lib/ext/bunny-0.6.0/lib/qrack/qrack08.rb +23 -0
- data/lib/ext/bunny-0.6.0/lib/qrack/qrack09.rb +23 -0
- data/lib/ext/bunny-0.6.0/lib/qrack/queue.rb +53 -0
- data/lib/ext/bunny-0.6.0/lib/qrack/subscription.rb +102 -0
- data/lib/ext/bunny-0.6.0/lib/qrack/transport/buffer08.rb +276 -0
- data/lib/ext/bunny-0.6.0/lib/qrack/transport/buffer09.rb +276 -0
- data/lib/ext/bunny-0.6.0/lib/qrack/transport/frame08.rb +112 -0
- data/lib/ext/bunny-0.6.0/lib/qrack/transport/frame09.rb +94 -0
- data/lib/ext/bunny-0.6.0/spec/spec_08/bunny_spec.rb +65 -0
- data/lib/ext/bunny-0.6.0/spec/spec_08/connection_spec.rb +12 -0
- data/lib/ext/bunny-0.6.0/spec/spec_08/exchange_spec.rb +162 -0
- data/lib/ext/bunny-0.6.0/spec/spec_08/queue_spec.rb +206 -0
- data/lib/ext/bunny-0.6.0/spec/spec_09/bunny_spec.rb +65 -0
- data/lib/ext/bunny-0.6.0/spec/spec_09/connection_spec.rb +12 -0
- data/lib/ext/bunny-0.6.0/spec/spec_09/exchange_spec.rb +162 -0
- data/lib/ext/bunny-0.6.0/spec/spec_09/queue_spec.rb +205 -0
- data/lib/ext/eventmachine-0.12.10/.gitignore +14 -0
- data/lib/ext/eventmachine-0.12.10/README +82 -0
- data/lib/ext/eventmachine-0.12.10/Rakefile +374 -0
- data/lib/ext/eventmachine-0.12.10/docs/COPYING +60 -0
- data/lib/ext/eventmachine-0.12.10/docs/ChangeLog +211 -0
- data/lib/ext/eventmachine-0.12.10/docs/DEFERRABLES +133 -0
- data/lib/ext/eventmachine-0.12.10/docs/EPOLL +141 -0
- data/lib/ext/eventmachine-0.12.10/docs/GNU +281 -0
- data/lib/ext/eventmachine-0.12.10/docs/INSTALL +13 -0
- data/lib/ext/eventmachine-0.12.10/docs/KEYBOARD +38 -0
- data/lib/ext/eventmachine-0.12.10/docs/LEGAL +25 -0
- data/lib/ext/eventmachine-0.12.10/docs/LIGHTWEIGHT_CONCURRENCY +70 -0
- data/lib/ext/eventmachine-0.12.10/docs/PURE_RUBY +75 -0
- data/lib/ext/eventmachine-0.12.10/docs/RELEASE_NOTES +94 -0
- data/lib/ext/eventmachine-0.12.10/docs/SMTP +2 -0
- data/lib/ext/eventmachine-0.12.10/docs/SPAWNED_PROCESSES +89 -0
- data/lib/ext/eventmachine-0.12.10/docs/TODO +8 -0
- data/lib/ext/eventmachine-0.12.10/eventmachine.gemspec +40 -0
- data/lib/ext/eventmachine-0.12.10/examples/ex_channel.rb +43 -0
- data/lib/ext/eventmachine-0.12.10/examples/ex_queue.rb +2 -0
- data/lib/ext/eventmachine-0.12.10/examples/helper.rb +2 -0
- data/lib/ext/eventmachine-0.12.10/ext/binder.cpp +125 -0
- data/lib/ext/eventmachine-0.12.10/ext/binder.h +46 -0
- data/lib/ext/eventmachine-0.12.10/ext/cmain.cpp +827 -0
- data/lib/ext/eventmachine-0.12.10/ext/cplusplus.cpp +202 -0
- data/lib/ext/eventmachine-0.12.10/ext/ed.cpp +1893 -0
- data/lib/ext/eventmachine-0.12.10/ext/ed.h +424 -0
- data/lib/ext/eventmachine-0.12.10/ext/em.cpp +2282 -0
- data/lib/ext/eventmachine-0.12.10/ext/em.h +232 -0
- data/lib/ext/eventmachine-0.12.10/ext/emwin.cpp +300 -0
- data/lib/ext/eventmachine-0.12.10/ext/emwin.h +94 -0
- data/lib/ext/eventmachine-0.12.10/ext/epoll.cpp +26 -0
- data/lib/ext/eventmachine-0.12.10/ext/epoll.h +25 -0
- data/lib/ext/eventmachine-0.12.10/ext/eventmachine.h +122 -0
- data/lib/ext/eventmachine-0.12.10/ext/eventmachine_cpp.h +96 -0
- data/lib/ext/eventmachine-0.12.10/ext/extconf.rb +148 -0
- data/lib/ext/eventmachine-0.12.10/ext/fastfilereader/extconf.rb +83 -0
- data/lib/ext/eventmachine-0.12.10/ext/fastfilereader/mapper.cpp +214 -0
- data/lib/ext/eventmachine-0.12.10/ext/fastfilereader/mapper.h +59 -0
- data/lib/ext/eventmachine-0.12.10/ext/fastfilereader/rubymain.cpp +127 -0
- data/lib/ext/eventmachine-0.12.10/ext/files.cpp +94 -0
- data/lib/ext/eventmachine-0.12.10/ext/files.h +65 -0
- data/lib/ext/eventmachine-0.12.10/ext/kb.cpp +81 -0
- data/lib/ext/eventmachine-0.12.10/ext/page.cpp +107 -0
- data/lib/ext/eventmachine-0.12.10/ext/page.h +51 -0
- data/lib/ext/eventmachine-0.12.10/ext/pipe.cpp +349 -0
- data/lib/ext/eventmachine-0.12.10/ext/project.h +151 -0
- data/lib/ext/eventmachine-0.12.10/ext/rubymain.cpp +1166 -0
- data/lib/ext/eventmachine-0.12.10/ext/sigs.cpp +89 -0
- data/lib/ext/eventmachine-0.12.10/ext/sigs.h +32 -0
- data/lib/ext/eventmachine-0.12.10/ext/ssl.cpp +460 -0
- data/lib/ext/eventmachine-0.12.10/ext/ssl.h +94 -0
- data/lib/ext/eventmachine-0.12.10/java/.classpath +8 -0
- data/lib/ext/eventmachine-0.12.10/java/.project +17 -0
- data/lib/ext/eventmachine-0.12.10/java/src/com/rubyeventmachine/EmReactor.java +570 -0
- data/lib/ext/eventmachine-0.12.10/java/src/com/rubyeventmachine/EmReactorException.java +40 -0
- data/lib/ext/eventmachine-0.12.10/java/src/com/rubyeventmachine/EventableChannel.java +69 -0
- data/lib/ext/eventmachine-0.12.10/java/src/com/rubyeventmachine/EventableDatagramChannel.java +189 -0
- data/lib/ext/eventmachine-0.12.10/java/src/com/rubyeventmachine/EventableSocketChannel.java +364 -0
- data/lib/ext/eventmachine-0.12.10/java/src/com/rubyeventmachine/application/Application.java +194 -0
- data/lib/ext/eventmachine-0.12.10/java/src/com/rubyeventmachine/application/Connection.java +74 -0
- data/lib/ext/eventmachine-0.12.10/java/src/com/rubyeventmachine/application/ConnectionFactory.java +37 -0
- data/lib/ext/eventmachine-0.12.10/java/src/com/rubyeventmachine/application/DefaultConnectionFactory.java +46 -0
- data/lib/ext/eventmachine-0.12.10/java/src/com/rubyeventmachine/application/PeriodicTimer.java +38 -0
- data/lib/ext/eventmachine-0.12.10/java/src/com/rubyeventmachine/application/Timer.java +54 -0
- data/lib/ext/eventmachine-0.12.10/java/src/com/rubyeventmachine/tests/ApplicationTest.java +109 -0
- data/lib/ext/eventmachine-0.12.10/java/src/com/rubyeventmachine/tests/ConnectTest.java +148 -0
- data/lib/ext/eventmachine-0.12.10/java/src/com/rubyeventmachine/tests/EMTest.java +80 -0
- data/lib/ext/eventmachine-0.12.10/java/src/com/rubyeventmachine/tests/TestDatagrams.java +53 -0
- data/lib/ext/eventmachine-0.12.10/java/src/com/rubyeventmachine/tests/TestServers.java +75 -0
- data/lib/ext/eventmachine-0.12.10/java/src/com/rubyeventmachine/tests/TestTimers.java +90 -0
- data/lib/ext/eventmachine-0.12.10/lib/em/buftok.rb +138 -0
- data/lib/ext/eventmachine-0.12.10/lib/em/callback.rb +26 -0
- data/lib/ext/eventmachine-0.12.10/lib/em/channel.rb +57 -0
- data/lib/ext/eventmachine-0.12.10/lib/em/connection.rb +564 -0
- data/lib/ext/eventmachine-0.12.10/lib/em/deferrable.rb +192 -0
- data/lib/ext/eventmachine-0.12.10/lib/em/file_watch.rb +54 -0
- data/lib/ext/eventmachine-0.12.10/lib/em/future.rb +61 -0
- data/lib/ext/eventmachine-0.12.10/lib/em/messages.rb +66 -0
- data/lib/ext/eventmachine-0.12.10/lib/em/process_watch.rb +44 -0
- data/lib/ext/eventmachine-0.12.10/lib/em/processes.rb +119 -0
- data/lib/ext/eventmachine-0.12.10/lib/em/protocols/header_and_content.rb +138 -0
- data/lib/ext/eventmachine-0.12.10/lib/em/protocols/httpclient.rb +263 -0
- data/lib/ext/eventmachine-0.12.10/lib/em/protocols/httpclient2.rb +590 -0
- data/lib/ext/eventmachine-0.12.10/lib/em/protocols/line_and_text.rb +125 -0
- data/lib/ext/eventmachine-0.12.10/lib/em/protocols/linetext2.rb +161 -0
- data/lib/ext/eventmachine-0.12.10/lib/em/protocols/memcache.rb +323 -0
- data/lib/ext/eventmachine-0.12.10/lib/em/protocols/object_protocol.rb +45 -0
- data/lib/ext/eventmachine-0.12.10/lib/em/protocols/postgres3.rb +247 -0
- data/lib/ext/eventmachine-0.12.10/lib/em/protocols/saslauth.rb +175 -0
- data/lib/ext/eventmachine-0.12.10/lib/em/protocols/smtpclient.rb +357 -0
- data/lib/ext/eventmachine-0.12.10/lib/em/protocols/smtpserver.rb +547 -0
- data/lib/ext/eventmachine-0.12.10/lib/em/protocols/socks4.rb +66 -0
- data/lib/ext/eventmachine-0.12.10/lib/em/protocols/stomp.rb +200 -0
- data/lib/ext/eventmachine-0.12.10/lib/em/protocols/tcptest.rb +53 -0
- data/lib/ext/eventmachine-0.12.10/lib/em/protocols.rb +36 -0
- data/lib/ext/eventmachine-0.12.10/lib/em/queue.rb +61 -0
- data/lib/ext/eventmachine-0.12.10/lib/em/spawnable.rb +85 -0
- data/lib/ext/eventmachine-0.12.10/lib/em/streamer.rb +130 -0
- data/lib/ext/eventmachine-0.12.10/lib/em/timers.rb +56 -0
- data/lib/ext/eventmachine-0.12.10/lib/em/version.rb +3 -0
- data/lib/ext/eventmachine-0.12.10/lib/eventmachine.rb +1592 -0
- data/lib/ext/eventmachine-0.12.10/lib/evma/callback.rb +32 -0
- data/lib/ext/eventmachine-0.12.10/lib/evma/container.rb +75 -0
- data/lib/ext/eventmachine-0.12.10/lib/evma/factory.rb +77 -0
- data/lib/ext/eventmachine-0.12.10/lib/evma/protocol.rb +87 -0
- data/lib/ext/eventmachine-0.12.10/lib/evma/reactor.rb +48 -0
- data/lib/ext/eventmachine-0.12.10/lib/evma.rb +32 -0
- data/lib/ext/eventmachine-0.12.10/lib/jeventmachine.rb +257 -0
- data/lib/ext/eventmachine-0.12.10/lib/pr_eventmachine.rb +1022 -0
- data/lib/ext/eventmachine-0.12.10/setup.rb +1585 -0
- data/lib/ext/eventmachine-0.12.10/tasks/cpp.rake_example +77 -0
- data/lib/ext/eventmachine-0.12.10/tests/client.crt +31 -0
- data/lib/ext/eventmachine-0.12.10/tests/client.key +51 -0
- data/lib/ext/eventmachine-0.12.10/tests/test_attach.rb +126 -0
- data/lib/ext/eventmachine-0.12.10/tests/test_basic.rb +284 -0
- data/lib/ext/eventmachine-0.12.10/tests/test_channel.rb +63 -0
- data/lib/ext/eventmachine-0.12.10/tests/test_connection_count.rb +35 -0
- data/lib/ext/eventmachine-0.12.10/tests/test_defer.rb +47 -0
- data/lib/ext/eventmachine-0.12.10/tests/test_epoll.rb +160 -0
- data/lib/ext/eventmachine-0.12.10/tests/test_error_handler.rb +35 -0
- data/lib/ext/eventmachine-0.12.10/tests/test_errors.rb +82 -0
- data/lib/ext/eventmachine-0.12.10/tests/test_exc.rb +55 -0
- data/lib/ext/eventmachine-0.12.10/tests/test_file_watch.rb +49 -0
- data/lib/ext/eventmachine-0.12.10/tests/test_futures.rb +198 -0
- data/lib/ext/eventmachine-0.12.10/tests/test_get_sock_opt.rb +30 -0
- data/lib/ext/eventmachine-0.12.10/tests/test_handler_check.rb +37 -0
- data/lib/ext/eventmachine-0.12.10/tests/test_hc.rb +218 -0
- data/lib/ext/eventmachine-0.12.10/tests/test_httpclient.rb +218 -0
- data/lib/ext/eventmachine-0.12.10/tests/test_httpclient2.rb +153 -0
- data/lib/ext/eventmachine-0.12.10/tests/test_inactivity_timeout.rb +50 -0
- data/lib/ext/eventmachine-0.12.10/tests/test_kb.rb +60 -0
- data/lib/ext/eventmachine-0.12.10/tests/test_ltp.rb +182 -0
- data/lib/ext/eventmachine-0.12.10/tests/test_ltp2.rb +317 -0
- data/lib/ext/eventmachine-0.12.10/tests/test_next_tick.rb +133 -0
- data/lib/ext/eventmachine-0.12.10/tests/test_object_protocol.rb +37 -0
- data/lib/ext/eventmachine-0.12.10/tests/test_pause.rb +70 -0
- data/lib/ext/eventmachine-0.12.10/tests/test_pending_connect_timeout.rb +48 -0
- data/lib/ext/eventmachine-0.12.10/tests/test_process_watch.rb +48 -0
- data/lib/ext/eventmachine-0.12.10/tests/test_processes.rb +128 -0
- data/lib/ext/eventmachine-0.12.10/tests/test_proxy_connection.rb +92 -0
- data/lib/ext/eventmachine-0.12.10/tests/test_pure.rb +125 -0
- data/lib/ext/eventmachine-0.12.10/tests/test_queue.rb +44 -0
- data/lib/ext/eventmachine-0.12.10/tests/test_running.rb +42 -0
- data/lib/ext/eventmachine-0.12.10/tests/test_sasl.rb +72 -0
- data/lib/ext/eventmachine-0.12.10/tests/test_send_file.rb +242 -0
- data/lib/ext/eventmachine-0.12.10/tests/test_servers.rb +76 -0
- data/lib/ext/eventmachine-0.12.10/tests/test_smtpclient.rb +83 -0
- data/lib/ext/eventmachine-0.12.10/tests/test_smtpserver.rb +85 -0
- data/lib/ext/eventmachine-0.12.10/tests/test_spawn.rb +322 -0
- data/lib/ext/eventmachine-0.12.10/tests/test_ssl_args.rb +79 -0
- data/lib/ext/eventmachine-0.12.10/tests/test_ssl_methods.rb +50 -0
- data/lib/ext/eventmachine-0.12.10/tests/test_ssl_verify.rb +82 -0
- data/lib/ext/eventmachine-0.12.10/tests/test_timers.rb +162 -0
- data/lib/ext/eventmachine-0.12.10/tests/test_ud.rb +36 -0
- data/lib/ext/eventmachine-0.12.10/tests/testem.rb +31 -0
- data/lib/ext/eventmachine-0.12.10/web/whatis +7 -0
- data/lib/ext/misc/README +1 -0
- data/lib/ext/misc/indifferent_access.rb +131 -0
- data/lib/ext/uuidtools-2.1.1/CHANGELOG +56 -0
- data/lib/ext/uuidtools-2.1.1/LICENSE +20 -0
- data/lib/ext/uuidtools-2.1.1/README +13 -0
- data/lib/ext/uuidtools-2.1.1/Rakefile +48 -0
- data/lib/ext/uuidtools-2.1.1/lib/compat/securerandom.rb +202 -0
- data/lib/ext/uuidtools-2.1.1/lib/uuidtools/version.rb +35 -0
- data/lib/ext/uuidtools-2.1.1/lib/uuidtools.rb +618 -0
- data/lib/ext/uuidtools-2.1.1/spec/spec.opts +1 -0
- data/lib/ext/uuidtools-2.1.1/spec/spec_helper.rb +7 -0
- data/lib/ext/uuidtools-2.1.1/spec/uuidtools/mac_address_spec.rb +15 -0
- data/lib/ext/uuidtools-2.1.1/spec/uuidtools/utility_spec.rb +21 -0
- data/lib/ext/uuidtools-2.1.1/spec/uuidtools/uuid_creation_spec.rb +121 -0
- data/lib/ext/uuidtools-2.1.1/spec/uuidtools/uuid_parsing_spec.rb +127 -0
- data/lib/ext/uuidtools-2.1.1/tasks/benchmark.rake +38 -0
- data/lib/ext/uuidtools-2.1.1/tasks/clobber.rake +2 -0
- data/lib/ext/uuidtools-2.1.1/tasks/gem.rake +68 -0
- data/lib/ext/uuidtools-2.1.1/tasks/git.rake +40 -0
- data/lib/ext/uuidtools-2.1.1/tasks/metrics.rake +22 -0
- data/lib/ext/uuidtools-2.1.1/tasks/rdoc.rake +29 -0
- data/lib/ext/uuidtools-2.1.1/tasks/rubyforge.rake +89 -0
- data/lib/ext/uuidtools-2.1.1/tasks/spec.rake +64 -0
- data/lib/ext/uuidtools-2.1.1/website/index.html +95 -0
- data/lib/sidekick/client/sidekick_client.rb +46 -0
- data/lib/sidekick/shared/sidekick_logger.rb +14 -0
- data/lib/sidekick/shared/sidekick_queue_publisher.rb +91 -0
- data/lib/sidekick-client.rb +7 -0
- data/sidekick-client.gemspec +289 -0
- data/test/helper.rb +10 -0
- data/test/test_sidekick-client.rb +7 -0
- 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
|