droid 1.0.2pre → 1.0.2

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.
@@ -1,8 +1,8 @@
1
1
  module AMQP
2
- module Client
3
- def reconnect(*args)
4
- sleep 10
5
- exit 1
6
- end
7
- end
2
+ module Client
3
+ def reconnect(*args)
4
+ sleep 10
5
+ exit 1
6
+ end
7
+ end
8
8
  end
@@ -1,31 +1,28 @@
1
1
  require 'droid/utils'
2
2
 
3
3
  class Droid
4
- # publish to queue directly
5
- def self.publish_to_q(queue_name, data, opts={}, popts={})
6
- q = ::MQ.queue(queue_name)
7
- json, popts = Droid::Utils.format_publish(data, opts, popts)
8
- q.publish(json, popts)
9
- log.info "amqp_publish queue=#{queue_name} #{Droid::Utils.format_data_summary(data, popts[:headers])}" unless opts[:log] == false
10
- end
4
+ # publish to queue directly
5
+ def self.publish_to_q(queue_name, data, opts={}, popts={})
6
+ json, popts = Droid::Utils.format_publish(data, opts, popts)
7
+ # specifying passive on the queue does not declare the queue
8
+ # but will throw an error if the queue does not already exist
9
+ # this is ok for our purposes since if no one is listening
10
+ # nothing would really happen anyways.
11
+ q = ::MQ.queue(queue_name, :passive => true)
12
+ q.publish(json, popts)
13
+ log.info "amqp_publish queue=#{queue_name} #{Droid::Utils.format_data_summary(data, popts[:headers])}" unless opts[:log] == false
14
+ end
11
15
 
12
- def self.reply_to_q(queue_name, data, opts={}, popts={})
13
- q = ::MQ.queue(queue_name, :auto_delete => true)
14
- json, popts = Droid::Utils.format_publish(data, opts, popts)
15
- q.publish(json, popts)
16
- log.info "amqp_reply queue=#{queue_name} #{Droid::Utils.format_data_summary(data, popts[:headers])}" unless opts[:log] == false
17
- end
16
+ # publish to exchange directly
17
+ def self.publish_to_ex(ex_name, data, opts={}, popts={})
18
+ ex = ::MQ.direct(ex_name)
19
+ json, popts = Droid::Utils.format_publish(data, opts, popts)
20
+ ex.publish(json, popts)
21
+ log.info "amqp_publish exchange=#{ex_name} #{Droid::Utils.format_data_summary(data, popts[:headers])}" unless opts[:log] == false
22
+ end
18
23
 
19
- # publish to exchange directly
20
- def self.publish_to_ex(ex_name, data, opts={}, popts={})
21
- ex = ::MQ.direct(ex_name)
22
- json, popts = Droid::Utils.format_publish(data, opts, popts)
23
- ex.publish(json, popts)
24
- log.info "amqp_publish exchange=#{ex_name} #{Droid::Utils.format_data_summary(data, popts[:headers])}" unless opts[:log] == false
25
- end
26
-
27
- # default is publish to exchange
28
- def self.publish(ex_name, data, opts={}, popts={})
29
- publish_to_ex(ex_name, data, opts, popts)
30
- end
24
+ # default is publish to exchange
25
+ def self.publish(ex_name, data, opts={}, popts={})
26
+ publish_to_ex(ex_name, data, opts, popts)
27
+ end
31
28
  end
@@ -1,196 +1,196 @@
1
1
  class Droid
2
- class ExpiredMessage < RuntimeError; end
3
-
4
- class BaseQueue
5
- attr_reader :queue_name, :opts
6
- attr_reader :q, :ex, :mq
7
-
8
- def initialize(queue_name, opts={})
9
- opts[:auto_delete] = true unless opts.has_key?(:auto_delete) and opts[:auto_delete] === false
10
-
11
- @queue_name, @opts = queue_name, opts
12
- end
13
-
14
- def setup
15
- @mq = MQ.new
16
- @q = @mq.queue(queue_name, opts)
17
- # if we don't specify an exchange name it defaults to the queue_name
18
- @ex = @mq.direct(opts[:exchange_name] || queue_name)
19
- end
20
-
21
- def temp?
22
- false
23
- end
24
-
25
- def log
26
- Droid.log
27
- end
28
-
29
- def tag
30
- s = "queue=#{q.name}"
31
- s += " exchange=#{ex.name}" if ex
32
- end
33
-
34
- def subscribe(amqp_opts={}, opts={})
35
- setup
36
-
37
- q.bind(ex) if ex
38
- q.subscribe(amqp_opts) do |header, message|
39
- Droid::Utilization.monitor(q.name, :temp => temp?) do
40
- request = Droid::Request.new(self, header, message)
41
- log.info "amqp_message #{tag} action=received ttl=#{request.ttl} age=#{request.age} #{request.data_summary}"
42
- begin
43
- raise Droid::ExpiredMessage if request.expired?
44
- yield request if block_given?
45
- finished = Time.now.getgm.to_i
46
- log.info "amqp_message action=processed #{tag} elapsed=#{finished-request.start} ttl=#{request.ttl} age=#{request.age} #{request.data_summary}"
47
- rescue Droid::ExpiredMessage
48
- log.info "amqp_message action=timeout #{tag} ttl=#{request.ttl} age=#{request.age} #{request.data_summary}"
49
- request.ack if amqp_opts[:ack]
50
- rescue => e
51
- request.ack if amqp_opts[:ack]
52
- Droid.handle_error(e)
53
- end
54
- end
55
- end
56
- log.info "amqp_subscribe #{tag}"
57
- self
58
- end
59
-
60
- def teardown
61
- @q.unsubscribe
62
- @mq.close
63
- log.info "amqp_unsubscribe #{tag}"
64
- end
65
-
66
- def destroy
67
- teardown
68
- end
69
- end
70
-
71
- class WorkerQueue < BaseQueue
72
- attr_reader :prefetch
73
-
74
- def initialize(queue_name, opts={})
75
- @prefetch = opts.delete(:prefetch) || 1
76
- opts[:auto_delete] = false
77
-
78
- super(queue_name, opts)
79
- end
80
-
81
- def setup
82
- super
83
- @mq.prefetch(self.prefetch)
84
- end
85
-
86
- def subscribe(amqp_opts={}, opts={})
87
- amqp_opts[:ack] = true
88
- super(amqp_opts, opts) do |request|
89
- begin
90
- yield request if block_given?
91
- ensure
92
- request.ack unless amqp_opts[:auto_ack] == false
93
- end
94
- end
95
- end
96
- end
97
-
98
- class ListenQueue < BaseQueue
99
- def initialize(exchange_name, opts={})
100
- opts[:exchange_name] = exchange_name
101
- queue_name = opts.delete(:queue) || Droid::Utils.generate_queue(exchange_name)
102
- super(queue_name, opts)
103
- end
104
- end
105
-
106
- class ReplyQueue < BaseQueue
107
- def initialize(queue_name, opts={})
108
- opts[:auto_delete] = true
109
- super
110
- end
111
-
112
- def setup
113
- @mq = MQ.new
114
- @q = @mq.queue(queue_name, opts)
115
- @ex = nil
116
- end
117
-
118
- def temp?
119
- true
120
- end
121
-
122
- def subscribe(amqp_opts={}, opts={})
123
- super(amqp_opts, opts) do |request|
124
- yield request if block_given?
125
- self.destroy
126
- end
127
- end
128
-
129
- def teardown
130
- @q.delete
131
- super
132
- end
133
- end
134
-
135
- module QueueMethods
136
- def worker(queue_name, opts={})
137
- WorkerQueue.new(queue_name, opts)
138
- end
139
-
140
- def listener(exchange_name, opts={})
141
- ListenQueue.new(exchange_name, opts)
142
- end
143
- end
144
-
145
- class BackwardsCompatibleQueue < BaseQueue
146
- def initialize(exchange_name, opts={})
147
- opts[:auto_delete] = true unless opts.has_key?(:auto_delete) and opts[:auto_delete] === false
148
- opts[:exchange_name] = exchange_name
149
- queue_name = opts.delete(:queue) || Droid::Utils.generate_queue(exchange_name)
150
- @queue_name, @opts = queue_name, opts
151
- end
152
-
153
- def setup
154
- @mq = MQ.new
155
- @q = @mq.queue(queue_name, opts)
156
- @ex = @mq.direct(opts[:exchange_name])
157
-
158
- @mq.prefetch(opts[:prefetch]) if opts[:prefetch]
159
- end
160
-
161
- def subscribe(amqp_opts={}, opts={})
162
- super(amqp_opts, opts) do |request|
163
- if block_given?
164
- if opts[:detail]
165
- yield request, request.header, request.raw_message if block_given?
166
- else
167
- yield request if block_given?
168
- end
169
- end
170
- end
171
-
172
- self
173
- end
174
- end
175
-
176
- module BackwardsCompatibleMethods
177
- def listen4(key, orig_opts={}, &block)
178
- opts = {}
179
- amqp_opts = {}
180
- subscribe_opts = {}
181
-
182
- if orig_opts[:prefetch] || orig_opts[:ack]
183
- opts[:prefetch] = orig_opts[:prefetch] || 1
184
- opts[:ack] = true
185
- end
186
- if orig_opts[:queue]
187
- opts[:queue] = orig_opts[:queue]
188
- end
189
- if orig_opts[:detail]
190
- subscribe_opts[:detail] = true
191
- end
192
-
193
- BackwardsCompatibleQueue.new(key, opts).subscribe(amqp_opts, subscribe_opts, &block)
194
- end
195
- end
2
+ class ExpiredMessage < RuntimeError; end
3
+
4
+ class BaseQueue
5
+ attr_reader :queue_name, :opts
6
+ attr_reader :q, :ex, :mq
7
+
8
+ def initialize(queue_name, opts={})
9
+ opts[:auto_delete] = true unless opts.has_key?(:auto_delete) and opts[:auto_delete] === false
10
+
11
+ @queue_name, @opts = queue_name, opts
12
+ end
13
+
14
+ def setup
15
+ @mq = MQ.new
16
+ @q = @mq.queue(queue_name, opts)
17
+ # if we don't specify an exchange name it defaults to the queue_name
18
+ @ex = @mq.direct(opts[:exchange_name] || queue_name)
19
+ end
20
+
21
+ def temp?
22
+ false
23
+ end
24
+
25
+ def log
26
+ Droid.log
27
+ end
28
+
29
+ def tag
30
+ s = "queue=#{q.name}"
31
+ s += " exchange=#{ex.name}" if ex
32
+ end
33
+
34
+ def subscribe(amqp_opts={}, opts={})
35
+ setup
36
+
37
+ q.bind(ex) if ex
38
+ q.subscribe(amqp_opts) do |header, message|
39
+ Droid::Utilization.monitor(q.name, :temp => temp?) do
40
+ request = Droid::Request.new(self, header, message)
41
+ log.info "amqp_message #{tag} action=received ttl=#{request.ttl} age=#{request.age} #{request.data_summary}"
42
+ begin
43
+ raise Droid::ExpiredMessage if request.expired?
44
+ yield request if block_given?
45
+ finished = Time.now.getgm.to_i
46
+ log.info "amqp_message action=processed #{tag} elapsed=#{finished-request.start} ttl=#{request.ttl} age=#{request.age} #{request.data_summary}"
47
+ rescue Droid::ExpiredMessage
48
+ log.info "amqp_message action=timeout #{tag} ttl=#{request.ttl} age=#{request.age} #{request.data_summary}"
49
+ request.ack if amqp_opts[:ack]
50
+ rescue => e
51
+ request.ack if amqp_opts[:ack]
52
+ Droid.handle_error(e)
53
+ end
54
+ end
55
+ end
56
+ log.info "amqp_subscribe #{tag}"
57
+ self
58
+ end
59
+
60
+ def teardown
61
+ @q.unsubscribe
62
+ @mq.close
63
+ log.info "amqp_unsubscribe #{tag}"
64
+ end
65
+
66
+ def destroy
67
+ teardown
68
+ end
69
+ end
70
+
71
+ class WorkerQueue < BaseQueue
72
+ attr_reader :prefetch
73
+
74
+ def initialize(queue_name, opts={})
75
+ @prefetch = opts.delete(:prefetch) || 1
76
+ opts[:auto_delete] = false
77
+
78
+ super(queue_name, opts)
79
+ end
80
+
81
+ def setup
82
+ super
83
+ @mq.prefetch(self.prefetch)
84
+ end
85
+
86
+ def subscribe(amqp_opts={}, opts={})
87
+ amqp_opts[:ack] = true
88
+ super(amqp_opts, opts) do |request|
89
+ begin
90
+ yield request if block_given?
91
+ ensure
92
+ request.ack unless amqp_opts[:auto_ack] == false
93
+ end
94
+ end
95
+ end
96
+ end
97
+
98
+ class ListenQueue < BaseQueue
99
+ def initialize(exchange_name, opts={})
100
+ opts[:exchange_name] = exchange_name
101
+ queue_name = opts.delete(:queue) || Droid::Utils.generate_queue(exchange_name)
102
+ super(queue_name, opts)
103
+ end
104
+ end
105
+
106
+ class ReplyQueue < BaseQueue
107
+ def initialize(queue_name, opts={})
108
+ opts[:auto_delete] = true
109
+ super
110
+ end
111
+
112
+ def setup
113
+ @mq = MQ.new
114
+ @q = @mq.queue(queue_name, opts)
115
+ @ex = nil
116
+ end
117
+
118
+ def temp?
119
+ true
120
+ end
121
+
122
+ def subscribe(amqp_opts={}, opts={})
123
+ super(amqp_opts, opts) do |request|
124
+ yield request if block_given?
125
+ self.destroy
126
+ end
127
+ end
128
+
129
+ def teardown
130
+ @q.delete
131
+ super
132
+ end
133
+ end
134
+
135
+ module QueueMethods
136
+ def worker(queue_name, opts={})
137
+ WorkerQueue.new(queue_name, opts)
138
+ end
139
+
140
+ def listener(exchange_name, opts={})
141
+ ListenQueue.new(exchange_name, opts)
142
+ end
143
+ end
144
+
145
+ class BackwardsCompatibleQueue < BaseQueue
146
+ def initialize(exchange_name, opts={})
147
+ opts[:auto_delete] = true unless opts.has_key?(:auto_delete) and opts[:auto_delete] === false
148
+ opts[:exchange_name] = exchange_name
149
+ queue_name = opts.delete(:queue) || Droid::Utils.generate_queue(exchange_name)
150
+ @queue_name, @opts = queue_name, opts
151
+ end
152
+
153
+ def setup
154
+ @mq = MQ.new
155
+ @q = @mq.queue(queue_name, opts)
156
+ @ex = @mq.direct(opts[:exchange_name])
157
+
158
+ @mq.prefetch(opts[:prefetch]) if opts[:prefetch]
159
+ end
160
+
161
+ def subscribe(amqp_opts={}, opts={})
162
+ super(amqp_opts, opts) do |request|
163
+ if block_given?
164
+ if opts[:detail]
165
+ yield request, request.header, request.raw_message if block_given?
166
+ else
167
+ yield request if block_given?
168
+ end
169
+ end
170
+ end
171
+
172
+ self
173
+ end
174
+ end
175
+
176
+ module BackwardsCompatibleMethods
177
+ def listen4(key, orig_opts={}, &block)
178
+ opts = {}
179
+ amqp_opts = {}
180
+ subscribe_opts = {}
181
+
182
+ if orig_opts[:prefetch] || orig_opts[:ack]
183
+ opts[:prefetch] = orig_opts[:prefetch] || 1
184
+ opts[:ack] = true
185
+ end
186
+ if orig_opts[:queue]
187
+ opts[:queue] = orig_opts[:queue]
188
+ end
189
+ if orig_opts[:detail]
190
+ subscribe_opts[:detail] = true
191
+ end
192
+
193
+ BackwardsCompatibleQueue.new(key, opts).subscribe(amqp_opts, subscribe_opts, &block)
194
+ end
195
+ end
196
196
  end