amqp 0.7.0.pre → 0.7.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/.gitignore +4 -0
- data/.rspec +2 -0
- data/CHANGELOG +8 -2
- data/CONTRIBUTORS +22 -0
- data/Gemfile +3 -3
- data/README.md +20 -11
- data/Rakefile +30 -6
- data/amqp.gemspec +1 -1
- data/bin/cleanify.rb +50 -0
- data/examples/amqp/simple.rb +6 -4
- data/examples/mq/ack.rb +8 -6
- data/examples/mq/automatic_binding_for_default_direct_exchange.rb +65 -0
- data/examples/mq/callbacks.rb +9 -1
- data/examples/mq/clock.rb +17 -17
- data/examples/mq/hashtable.rb +19 -10
- data/examples/mq/internal.rb +13 -11
- data/examples/mq/logger.rb +38 -36
- data/examples/mq/multiclock.rb +16 -7
- data/examples/mq/pingpong.rb +16 -7
- data/examples/mq/pop.rb +8 -6
- data/examples/mq/primes-simple.rb +2 -0
- data/examples/mq/primes.rb +7 -5
- data/examples/mq/stocks.rb +14 -5
- data/lib/amqp.rb +12 -8
- data/lib/amqp/buffer.rb +35 -158
- data/lib/amqp/client.rb +34 -22
- data/lib/amqp/frame.rb +8 -64
- data/lib/amqp/protocol.rb +21 -70
- data/lib/amqp/server.rb +11 -9
- data/lib/amqp/spec.rb +8 -6
- data/lib/amqp/version.rb +2 -0
- data/lib/ext/blankslate.rb +3 -1
- data/lib/ext/em.rb +2 -0
- data/lib/ext/emfork.rb +13 -11
- data/lib/mq.rb +253 -156
- data/lib/mq/collection.rb +6 -88
- data/lib/mq/exchange.rb +70 -13
- data/lib/mq/header.rb +12 -6
- data/lib/mq/logger.rb +9 -7
- data/lib/mq/queue.rb +42 -30
- data/lib/mq/rpc.rb +6 -4
- data/protocol/codegen.rb +20 -18
- data/research/api.rb +10 -46
- data/research/primes-forked.rb +9 -7
- data/research/primes-processes.rb +74 -72
- data/research/primes-threaded.rb +9 -7
- data/spec/integration/automatic_binding_for_default_direct_exchange_spec.rb +61 -0
- data/spec/mq_helper.rb +70 -0
- data/spec/spec_helper.rb +84 -29
- data/spec/unit/amqp/buffer_spec.rb +178 -0
- data/spec/unit/amqp/client_spec.rb +472 -0
- data/spec/unit/amqp/frame_spec.rb +60 -0
- data/spec/unit/amqp/misc_spec.rb +123 -0
- data/spec/unit/amqp/protocol_spec.rb +53 -0
- data/spec/unit/mq/channel_close_spec.rb +15 -0
- data/spec/unit/mq/collection_spec.rb +129 -0
- data/spec/unit/mq/exchange_declaration_spec.rb +524 -0
- data/spec/unit/mq/misc_spec.rb +228 -0
- data/spec/unit/mq/mq_basic_spec.rb +39 -0
- data/spec/unit/mq/queue_declaration_spec.rb +97 -0
- data/spec/unit/mq/queue_spec.rb +71 -0
- metadata +33 -21
- data/Gemfile.lock +0 -16
- data/old/README +0 -30
- data/old/Rakefile +0 -12
- data/old/amqp-0.8.json +0 -606
- data/old/amqp_spec.rb +0 -796
- data/old/amqpc.rb +0 -695
- data/old/codegen.rb +0 -148
- data/spec/channel_close_spec.rb +0 -13
- data/spec/sync_async_spec.rb +0 -52
data/examples/mq/hashtable.rb
CHANGED
@@ -1,21 +1,30 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
1
3
|
$:.unshift File.dirname(__FILE__) + '/../../lib'
|
2
4
|
require 'mq'
|
3
5
|
|
4
|
-
AMQP.start(:host => 'localhost') do
|
6
|
+
AMQP.start(:host => 'localhost') do |connection|
|
5
7
|
|
6
|
-
|
8
|
+
# Send Connection.Close on Ctrl+C
|
9
|
+
trap(:INT) do
|
10
|
+
unless connection.closing?
|
11
|
+
connection.close { exit! }
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def log(*args)
|
7
16
|
p args
|
8
17
|
end
|
9
18
|
|
10
19
|
# AMQP.logging = true
|
11
20
|
|
12
21
|
class HashTable < Hash
|
13
|
-
def get
|
22
|
+
def get(key)
|
14
23
|
log 'HashTable', :get, key
|
15
24
|
self[key]
|
16
25
|
end
|
17
|
-
|
18
|
-
def set
|
26
|
+
|
27
|
+
def set(key, value)
|
19
28
|
log 'HashTable', :set, key => value
|
20
29
|
self[key] = value
|
21
30
|
end
|
@@ -37,16 +46,16 @@ AMQP.start(:host => 'localhost') do
|
|
37
46
|
client.set(:one, 1)
|
38
47
|
client.keys do |res|
|
39
48
|
log 'client', :keys => res
|
40
|
-
AMQP.stop{ EM.stop }
|
49
|
+
AMQP.stop { EM.stop }
|
41
50
|
end
|
42
51
|
|
43
52
|
end
|
44
53
|
|
45
54
|
__END__
|
46
55
|
|
47
|
-
["HashTable", :set, {:now=>Thu Jul 17 21:04:53 -0700 2008}]
|
56
|
+
["HashTable", :set, {:now => Thu Jul 17 21:04:53 -0700 2008}]
|
48
57
|
["HashTable", :get, :now]
|
49
|
-
["HashTable", :set, {:one=>1}]
|
58
|
+
["HashTable", :set, {:one => 1}]
|
50
59
|
["HashTable", :keys]
|
51
|
-
["client", {:eql
|
52
|
-
["client", {:keys=>[:one, :now]}]
|
60
|
+
["client", {:eql? => true, :now => Thu Jul 17 21:04:53 -0700 2008}]
|
61
|
+
["client", {:keys => [:one, :now]}]
|
data/examples/mq/internal.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
1
3
|
$:.unshift File.dirname(__FILE__) + '/../../lib'
|
2
4
|
require 'mq'
|
3
5
|
require 'pp'
|
@@ -6,7 +8,7 @@ EM.run do
|
|
6
8
|
|
7
9
|
# connect to the amqp server
|
8
10
|
connection = AMQP.connect(:host => 'localhost', :logging => false)
|
9
|
-
|
11
|
+
|
10
12
|
# open a channel on the AMQP connection
|
11
13
|
channel = MQ.new(connection)
|
12
14
|
|
@@ -25,9 +27,9 @@ EM.run do
|
|
25
27
|
# subscribe to messages in the queue
|
26
28
|
queue.subscribe do |headers, msg|
|
27
29
|
pp [:got, headers, msg]
|
28
|
-
connection.close{ EM.stop_event_loop }
|
30
|
+
connection.close { EM.stop_event_loop }
|
29
31
|
end
|
30
|
-
|
32
|
+
|
31
33
|
end
|
32
34
|
|
33
35
|
__END__
|
@@ -36,14 +38,14 @@ __END__
|
|
36
38
|
#<AMQP::Protocol::Header:0x1186270
|
37
39
|
@klass=AMQP::Protocol::Basic,
|
38
40
|
@properties=
|
39
|
-
{:priority=>0,
|
40
|
-
:exchange=>"all queues",
|
41
|
-
:consumer_tag=>"queue name",
|
42
|
-
:delivery_tag=>1,
|
43
|
-
:delivery_mode=>1,
|
44
|
-
:redelivered=>false,
|
45
|
-
:content_type=>"application/octet-stream",
|
46
|
-
:routing_key=>""},
|
41
|
+
{:priority => 0,
|
42
|
+
:exchange => "all queues",
|
43
|
+
:consumer_tag => "queue name",
|
44
|
+
:delivery_tag => 1,
|
45
|
+
:delivery_mode => 1,
|
46
|
+
:redelivered => false,
|
47
|
+
:content_type => "application/octet-stream",
|
48
|
+
:routing_key => ""},
|
47
49
|
@size=11,
|
48
50
|
@weight=0>,
|
49
51
|
"hello world"]
|
data/examples/mq/logger.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
1
3
|
$:.unshift File.dirname(__FILE__) + '/../../lib'
|
2
4
|
require 'mq'
|
3
5
|
require 'mq/logger'
|
@@ -7,7 +9,7 @@ Logger = MQ::Logger
|
|
7
9
|
AMQP.start(:host => 'localhost') do
|
8
10
|
if ARGV[0] == 'server'
|
9
11
|
|
10
|
-
MQ.queue('logger').bind(MQ.fanout('logging', :durable => true)).subscribe{|msg|
|
12
|
+
MQ.queue('logger').bind(MQ.fanout('logging', :durable => true)).subscribe { |msg|
|
11
13
|
msg = Marshal.load(msg)
|
12
14
|
require 'pp'
|
13
15
|
pp(msg)
|
@@ -18,7 +20,7 @@ AMQP.start(:host => 'localhost') do
|
|
18
20
|
|
19
21
|
log = Logger.new
|
20
22
|
log.debug 'its working!'
|
21
|
-
|
23
|
+
|
22
24
|
log = Logger.new do |msg|
|
23
25
|
require 'pp'
|
24
26
|
pp msg
|
@@ -26,7 +28,7 @@ AMQP.start(:host => 'localhost') do
|
|
26
28
|
end
|
27
29
|
|
28
30
|
log.info '123'
|
29
|
-
log.debug [1,2,3]
|
31
|
+
log.debug [1, 2, 3]
|
30
32
|
log.debug :one => 1, :two => 2
|
31
33
|
log.error Exception.new('123')
|
32
34
|
|
@@ -37,7 +39,7 @@ AMQP.start(:host => 'localhost') do
|
|
37
39
|
log = Logger.new(:webserver, :timestamp, :hostname, &log.printer)
|
38
40
|
log.info 'Request for /', :GET, :session => 'abc'
|
39
41
|
|
40
|
-
AMQP.stop{ EM.stop }
|
42
|
+
AMQP.stop { EM.stop }
|
41
43
|
|
42
44
|
else
|
43
45
|
|
@@ -54,35 +56,35 @@ end
|
|
54
56
|
|
55
57
|
__END__
|
56
58
|
|
57
|
-
{:data=>"123", :timestamp=>1216846102, :severity
|
58
|
-
|
59
|
-
{:data=>[1, 2, 3], :timestamp=>1216846102, :severity
|
60
|
-
|
61
|
-
{:data=>
|
62
|
-
{:type
|
63
|
-
:timestamp=>1216846102,
|
64
|
-
:severity
|
65
|
-
|
66
|
-
{:data=>"123", :timestamp=>1216846102, :process_id=>1814, :severity
|
67
|
-
|
68
|
-
{:process=>
|
69
|
-
{:thread_id=>109440,
|
70
|
-
:process_id=>1814,
|
71
|
-
:process_name=>"/Users/aman/code/amqp/examples/logger.rb",
|
72
|
-
:process_parent_id=>1813},
|
73
|
-
:data=>"123",
|
74
|
-
:timestamp=>1216846102,
|
75
|
-
:severity
|
76
|
-
|
77
|
-
{:session=>"abc",
|
78
|
-
:data=>"login",
|
79
|
-
:timestamp=>1216846102,
|
80
|
-
:severity
|
81
|
-
:user=>123}
|
82
|
-
|
83
|
-
{:session=>"abc",
|
84
|
-
:tags=>[:webserver, :GET],
|
85
|
-
:data=>"Request for /",
|
86
|
-
:timestamp=>1216846102,
|
87
|
-
:severity
|
88
|
-
:hostname=>"gc"}
|
59
|
+
{:data => "123", :timestamp => 1216846102, :severity => :info}
|
60
|
+
|
61
|
+
{:data => [1, 2, 3], :timestamp => 1216846102, :severity => :debug}
|
62
|
+
|
63
|
+
{:data =>
|
64
|
+
{:type => :exception, :name => :Exception, :message => "123", :backtrace => nil},
|
65
|
+
:timestamp => 1216846102,
|
66
|
+
:severity => :error}
|
67
|
+
|
68
|
+
{:data => "123", :timestamp => 1216846102, :process_id => 1814, :severity => :info}
|
69
|
+
|
70
|
+
{:process =>
|
71
|
+
{:thread_id => 109440,
|
72
|
+
:process_id => 1814,
|
73
|
+
:process_name => "/Users/aman/code/amqp/examples/logger.rb",
|
74
|
+
:process_parent_id => 1813},
|
75
|
+
:data => "123",
|
76
|
+
:timestamp => 1216846102,
|
77
|
+
:severity => :info}
|
78
|
+
|
79
|
+
{:session => "abc",
|
80
|
+
:data => "login",
|
81
|
+
:timestamp => 1216846102,
|
82
|
+
:severity => :debug,
|
83
|
+
:user => 123}
|
84
|
+
|
85
|
+
{:session => "abc",
|
86
|
+
:tags => [:webserver, :GET],
|
87
|
+
:data => "Request for /",
|
88
|
+
:timestamp => 1216846102,
|
89
|
+
:severity => :info,
|
90
|
+
:hostname => "gc"}
|
data/examples/mq/multiclock.rb
CHANGED
@@ -1,30 +1,39 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
1
3
|
$:.unshift File.dirname(__FILE__) + '/../../lib'
|
2
4
|
require 'mq'
|
3
5
|
require 'time'
|
4
6
|
|
5
|
-
AMQP.start(:host => 'localhost') do
|
7
|
+
AMQP.start(:host => 'localhost') do |connection|
|
8
|
+
|
9
|
+
# Send Connection.Close on Ctrl+C
|
10
|
+
trap(:INT) do
|
11
|
+
unless connection.closing?
|
12
|
+
connection.close { exit! }
|
13
|
+
end
|
14
|
+
end
|
6
15
|
|
7
|
-
def log
|
16
|
+
def log(*args)
|
8
17
|
p args
|
9
18
|
end
|
10
19
|
|
11
20
|
#AMQP.logging = true
|
12
21
|
|
13
22
|
clock = MQ.new.headers('multiformat_clock')
|
14
|
-
EM.add_periodic_timer(1){
|
23
|
+
EM.add_periodic_timer(1) {
|
15
24
|
puts
|
16
25
|
|
17
26
|
time = Time.new
|
18
|
-
["iso8601","rfc2822"].each do |format|
|
27
|
+
["iso8601", "rfc2822"].each do |format|
|
19
28
|
formatted_time = time.send(format)
|
20
29
|
log :publish, format, formatted_time
|
21
30
|
clock.publish "#{formatted_time}", :headers => {"format" => format}
|
22
31
|
end
|
23
32
|
}
|
24
33
|
|
25
|
-
["iso8601","rfc2822"].each do |format|
|
34
|
+
["iso8601", "rfc2822"].each do |format|
|
26
35
|
amq = MQ.new
|
27
|
-
amq.queue(format.to_s).bind(amq.headers('multiformat_clock'), :arguments => {"format" => format}).subscribe{ |time|
|
36
|
+
amq.queue(format.to_s).bind(amq.headers('multiformat_clock'), :arguments => {"format" => format}).subscribe { |time|
|
28
37
|
log "received #{format}", time
|
29
38
|
}
|
30
39
|
end
|
@@ -46,4 +55,4 @@ __END__
|
|
46
55
|
[:publish, "iso8601", "2009-02-13T19:55:42-08:00"]
|
47
56
|
[:publish, "rfc2822", "Fri, 13 Feb 2009 19:55:42 -0800"]
|
48
57
|
["received iso8601", "2009-02-13T19:55:42-08:00"]
|
49
|
-
["received rfc2822", "Fri, 13 Feb 2009 19:55:42 -0800"]
|
58
|
+
["received rfc2822", "Fri, 13 Feb 2009 19:55:42 -0800"]
|
data/examples/mq/pingpong.rb
CHANGED
@@ -1,16 +1,25 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
1
3
|
$:.unshift File.dirname(__FILE__) + '/../../lib'
|
2
4
|
require 'mq'
|
3
5
|
|
4
|
-
AMQP.start(:host => 'localhost') do
|
6
|
+
AMQP.start(:host => 'localhost') do |connection|
|
7
|
+
|
8
|
+
# Send Connection.Close on Ctrl+C
|
9
|
+
trap(:INT) do
|
10
|
+
unless connection.closing?
|
11
|
+
connection.close { exit! }
|
12
|
+
end
|
13
|
+
end
|
5
14
|
|
6
|
-
def log
|
15
|
+
def log(*args)
|
7
16
|
p [ Time.now, *args ]
|
8
17
|
end
|
9
|
-
|
18
|
+
|
10
19
|
# AMQP.logging = true
|
11
20
|
|
12
21
|
amq = MQ.new
|
13
|
-
EM.add_periodic_timer(1){
|
22
|
+
EM.add_periodic_timer(1) {
|
14
23
|
puts
|
15
24
|
|
16
25
|
log :sending, 'ping'
|
@@ -18,13 +27,13 @@ AMQP.start(:host => 'localhost') do
|
|
18
27
|
}
|
19
28
|
|
20
29
|
amq = MQ.new
|
21
|
-
amq.queue('one').subscribe{ |msg|
|
30
|
+
amq.queue('one').subscribe { |msg|
|
22
31
|
log 'one', :received, msg, :sending, 'pong'
|
23
32
|
amq.queue('two').publish('pong')
|
24
33
|
}
|
25
|
-
|
34
|
+
|
26
35
|
amq = MQ.new
|
27
|
-
amq.queue('two').subscribe{ |msg|
|
36
|
+
amq.queue('two').subscribe { |msg|
|
28
37
|
log 'two', :received, msg
|
29
38
|
}
|
30
39
|
|
data/examples/mq/pop.rb
CHANGED
@@ -1,24 +1,26 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
1
3
|
$:.unshift File.dirname(__FILE__) + '/../../lib'
|
2
4
|
require 'mq'
|
3
5
|
require 'pp'
|
4
6
|
|
5
|
-
Signal.trap('INT') { AMQP.stop{ EM.stop } }
|
6
|
-
Signal.trap('TERM'){ AMQP.stop{ EM.stop } }
|
7
|
+
Signal.trap('INT') { AMQP.stop { EM.stop } }
|
8
|
+
Signal.trap('TERM') { AMQP.stop { EM.stop } }
|
7
9
|
|
8
10
|
AMQP.start do
|
9
11
|
queue = MQ.queue('awesome')
|
10
12
|
|
11
13
|
queue.publish('Totally rad 1')
|
12
14
|
queue.publish('Totally rad 2')
|
13
|
-
EM.add_timer(5){ queue.publish('Totally rad 3') }
|
15
|
+
EM.add_timer(5) { queue.publish('Totally rad 3') }
|
14
16
|
|
15
|
-
queue.pop{ |msg|
|
17
|
+
queue.pop { |msg|
|
16
18
|
unless msg
|
17
19
|
# queue was empty
|
18
20
|
p [Time.now, :queue_empty!]
|
19
21
|
|
20
22
|
# try again in 1 second
|
21
|
-
EM.add_timer(1){ queue.pop }
|
23
|
+
EM.add_timer(1) { queue.pop }
|
22
24
|
else
|
23
25
|
# process this message
|
24
26
|
p [Time.now, msg]
|
@@ -40,4 +42,4 @@ __END__
|
|
40
42
|
[Wed Oct 15 15:24:34 -0700 2008, :queue_empty!]
|
41
43
|
[Wed Oct 15 15:24:35 -0700 2008, "Totally rad 3"]
|
42
44
|
[Wed Oct 15 15:24:35 -0700 2008, :queue_empty!]
|
43
|
-
[Wed Oct 15 15:24:36 -0700 2008, :queue_empty!]
|
45
|
+
[Wed Oct 15 15:24:36 -0700 2008, :queue_empty!]
|
data/examples/mq/primes.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
1
3
|
$:.unshift File.dirname(__FILE__) + '/../../lib'
|
2
4
|
require 'mq'
|
3
5
|
|
@@ -5,7 +7,7 @@ require 'mq'
|
|
5
7
|
MAX = 1000
|
6
8
|
|
7
9
|
# logging
|
8
|
-
def log
|
10
|
+
def log(*args)
|
9
11
|
p args
|
10
12
|
end
|
11
13
|
|
@@ -34,7 +36,7 @@ end
|
|
34
36
|
|
35
37
|
# use workers to check which numbers are prime
|
36
38
|
AMQP.start(:host => 'localhost') do
|
37
|
-
|
39
|
+
|
38
40
|
prime_checker = MQ.rpc('prime checker')
|
39
41
|
|
40
42
|
(10_000...(10_000+MAX)).each do |num|
|
@@ -43,7 +45,7 @@ AMQP.start(:host => 'localhost') do
|
|
43
45
|
prime_checker.is_prime?(num) { |is_prime|
|
44
46
|
log :prime?, num, is_prime
|
45
47
|
(@primes||=[]) << num if is_prime
|
46
|
-
|
48
|
+
|
47
49
|
if (@responses = (@responses || 0) + 1) == MAX
|
48
50
|
log :primes=, @primes
|
49
51
|
EM.stop_event_loop
|
@@ -51,7 +53,7 @@ AMQP.start(:host => 'localhost') do
|
|
51
53
|
}
|
52
54
|
|
53
55
|
end
|
54
|
-
|
56
|
+
|
55
57
|
end
|
56
58
|
|
57
59
|
__END__
|
@@ -62,7 +64,7 @@ Linux gc 2.6.24-ARCH #1 SMP PREEMPT Sun Mar 30 10:50:22 CEST 2008 x86_64 Intel(R
|
|
62
64
|
$ cat /proc/cpuinfo | grep processor | wc -l
|
63
65
|
4
|
64
66
|
|
65
|
-
$ time ruby primes-simple.rb
|
67
|
+
$ time ruby primes-simple.rb
|
66
68
|
|
67
69
|
real 0m16.055s
|
68
70
|
user 0m16.052s
|
data/examples/mq/stocks.rb
CHANGED
@@ -1,15 +1,24 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
1
3
|
$:.unshift File.dirname(__FILE__) + '/../../lib'
|
2
4
|
require 'mq'
|
3
5
|
|
4
|
-
AMQP.start(:host => 'localhost') do
|
6
|
+
AMQP.start(:host => 'localhost') do |connection|
|
7
|
+
|
8
|
+
# Send Connection.Close on Ctrl+C
|
9
|
+
trap(:INT) do
|
10
|
+
unless connection.closing?
|
11
|
+
connection.close { exit! }
|
12
|
+
end
|
13
|
+
end
|
5
14
|
|
6
|
-
def log
|
15
|
+
def log(*args)
|
7
16
|
p [ Time.now, *args ]
|
8
17
|
end
|
9
18
|
|
10
19
|
def publish_stock_prices
|
11
20
|
mq = MQ.new
|
12
|
-
EM.add_periodic_timer(1){
|
21
|
+
EM.add_periodic_timer(1) {
|
13
22
|
puts
|
14
23
|
|
15
24
|
{ :appl => 170+rand(1000)/100.0,
|
@@ -25,14 +34,14 @@ AMQP.start(:host => 'localhost') do
|
|
25
34
|
|
26
35
|
def watch_appl_stock
|
27
36
|
mq = MQ.new
|
28
|
-
mq.queue('apple stock').bind(mq.topic('stocks'), :key => 'usd.appl').subscribe{ |price|
|
37
|
+
mq.queue('apple stock').bind(mq.topic('stocks'), :key => 'usd.appl').subscribe { |price|
|
29
38
|
log 'apple stock', price
|
30
39
|
}
|
31
40
|
end
|
32
41
|
|
33
42
|
def watch_us_stocks
|
34
43
|
mq = MQ.new
|
35
|
-
mq.queue('us stocks').bind(mq.topic('stocks'), :key => 'usd.*').subscribe{ |info, price|
|
44
|
+
mq.queue('us stocks').bind(mq.topic('stocks'), :key => 'usd.*').subscribe { |info, price|
|
36
45
|
log 'us stock', info.routing_key, price
|
37
46
|
}
|
38
47
|
end
|