pebbles-river 0.3.4 → 0.3.5
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.
- checksums.yaml +4 -4
- data/lib/pebbles/river/river.rb +4 -6
- data/lib/pebbles/river/version.rb +1 -1
- data/lib/pebbles/river/worker.rb +10 -17
- data/lib/pebbles/river.rb +0 -6
- data/spec/lib/river_spec.rb +0 -78
- data/spec/lib/worker_spec.rb +23 -58
- data/spec/spec_helper.rb +0 -15
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b095f1ed2b6aff2c1d4916c73503981169c7ac5a
|
4
|
+
data.tar.gz: f69bdbd2bc4cef2a857bc84555eb83342b1ed699
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e8e8da724df5dcaafd4d1f1acdb9a0b5dc7fa2a93e2cb01af110f5522a42b203bc011e8c2953f4f50057840cee1a9e0d1aa6a9f659c99f01a80926c67def385a
|
7
|
+
data.tar.gz: 49e9212ea4c0b3db87894dc15f6d9b2769e8f947f164cdcc1213dd7bf5d71321c9f27de4baccf078e0da9b85b64684baaadea8cbf9fac4fe95fe162ecaf9246c
|
data/lib/pebbles/river/river.rb
CHANGED
@@ -46,9 +46,7 @@ module Pebbles
|
|
46
46
|
if @channel
|
47
47
|
begin
|
48
48
|
@channel.close
|
49
|
-
rescue Bunny::
|
50
|
-
# Ignore
|
51
|
-
rescue *CONNECTION_EXCEPTIONS
|
49
|
+
rescue Bunny::Exception
|
52
50
|
# Ignore
|
53
51
|
end
|
54
52
|
@channel = nil
|
@@ -56,7 +54,7 @@ module Pebbles
|
|
56
54
|
if @session
|
57
55
|
begin
|
58
56
|
@session.stop
|
59
|
-
rescue
|
57
|
+
rescue Bunny::Exception
|
60
58
|
# Ignore
|
61
59
|
end
|
62
60
|
@session = nil
|
@@ -112,9 +110,9 @@ module Pebbles
|
|
112
110
|
retry_count = 0
|
113
111
|
begin
|
114
112
|
yield
|
115
|
-
rescue
|
113
|
+
rescue Bunny::Exception => e
|
116
114
|
disconnect
|
117
|
-
last_exception =
|
115
|
+
last_exception = e
|
118
116
|
retry_count += 1
|
119
117
|
backoff(retry_count)
|
120
118
|
retry
|
data/lib/pebbles/river/worker.rb
CHANGED
@@ -136,23 +136,23 @@ module Pebbles
|
|
136
136
|
def process_message(delivery_info, properties, content)
|
137
137
|
begin
|
138
138
|
message = Message.new(content, delivery_info, queue)
|
139
|
-
rescue =>
|
139
|
+
rescue => e
|
140
140
|
ignore_exceptions do
|
141
141
|
reject(delivery_info)
|
142
142
|
end
|
143
|
-
raise
|
143
|
+
raise e
|
144
144
|
else
|
145
145
|
begin
|
146
146
|
result = @handler.call(message)
|
147
|
-
rescue
|
147
|
+
rescue Bunny::Exception
|
148
148
|
raise
|
149
|
-
rescue =>
|
149
|
+
rescue => e
|
150
150
|
if @managed_acking
|
151
151
|
ignore_exceptions do
|
152
152
|
reject(delivery_info)
|
153
153
|
end
|
154
154
|
end
|
155
|
-
raise
|
155
|
+
raise e
|
156
156
|
else
|
157
157
|
if @managed_acking
|
158
158
|
case result
|
@@ -177,26 +177,19 @@ module Pebbles
|
|
177
177
|
def with_exceptions(&block)
|
178
178
|
begin
|
179
179
|
yield
|
180
|
-
rescue
|
181
|
-
|
182
|
-
@logger.error("Connection error (#{exception.class}): #{exception}")
|
183
|
-
end
|
184
|
-
@rate_limiter.increment
|
185
|
-
@queue = nil
|
186
|
-
@river.disconnect
|
180
|
+
rescue Bunny::Exception
|
181
|
+
raise
|
187
182
|
rescue Timeout::Error
|
188
183
|
if @logger
|
189
184
|
@logger.error("Timeout polling for messages (ignoring)")
|
190
185
|
end
|
191
|
-
rescue =>
|
186
|
+
rescue => e
|
192
187
|
if @logger
|
193
|
-
@logger.error("Exception (#{
|
188
|
+
@logger.error("Exception (#{e.class}) while handling message: #{e}")
|
194
189
|
end
|
195
|
-
|
196
190
|
@rate_limiter.increment
|
197
|
-
|
198
191
|
ignore_exceptions do
|
199
|
-
@on_exception.call(
|
192
|
+
@on_exception.call(e)
|
200
193
|
end
|
201
194
|
end
|
202
195
|
end
|
data/lib/pebbles/river.rb
CHANGED
@@ -18,12 +18,6 @@ require_relative "river/daemon_helper"
|
|
18
18
|
|
19
19
|
module Pebbles::River
|
20
20
|
|
21
|
-
CONNECTION_EXCEPTIONS = [
|
22
|
-
Bunny::Exception,
|
23
|
-
# These should be caught by Bunny, but apparently aren't.
|
24
|
-
Errno::ECONNRESET
|
25
|
-
].freeze
|
26
|
-
|
27
21
|
def self.rabbitmq_options
|
28
22
|
@rabbitmq_options ||= {}.freeze
|
29
23
|
end
|
data/spec/lib/river_spec.rb
CHANGED
@@ -11,17 +11,6 @@ describe Pebbles::River::River do
|
|
11
11
|
Pebbles::River::River.new(environment: 'whatever')
|
12
12
|
end
|
13
13
|
|
14
|
-
CONNECTION_EXCEPTIONS = [
|
15
|
-
Bunny::ConnectionError,
|
16
|
-
Bunny::ConnectionClosedError,
|
17
|
-
Bunny::ChannelAlreadyClosed,
|
18
|
-
Bunny::ForcedChannelCloseError,
|
19
|
-
Bunny::ForcedConnectionCloseError,
|
20
|
-
Bunny::ServerDownError,
|
21
|
-
Bunny::ProtocolError,
|
22
|
-
Errno::ECONNRESET
|
23
|
-
]
|
24
|
-
|
25
14
|
after(:each) do
|
26
15
|
if (channel = subject.channel)
|
27
16
|
channel.queues.each do |name, queue|
|
@@ -100,73 +89,6 @@ describe Pebbles::River::River do
|
|
100
89
|
JSON.parse(payload)['uid'].should eq('klass:path$1')
|
101
90
|
end
|
102
91
|
|
103
|
-
CONNECTION_EXCEPTIONS.each do |exception_class|
|
104
|
-
context "on temporary failure with #{exception_class}" do
|
105
|
-
it "reconnects and retries sending until success" do
|
106
|
-
exchange = double('exchange')
|
107
|
-
|
108
|
-
count = 0
|
109
|
-
exchange.stub(:publish) do
|
110
|
-
count += 1
|
111
|
-
if count < 3
|
112
|
-
raise create_exception(exception_class)
|
113
|
-
end
|
114
|
-
end
|
115
|
-
|
116
|
-
subject.stub(:connect) { }
|
117
|
-
subject.stub(:exchange) { exchange }
|
118
|
-
subject.stub(:sleep) { }
|
119
|
-
Timeout.stub(:timeout) { |&block|
|
120
|
-
block.call
|
121
|
-
}
|
122
|
-
expect(Timeout).to receive(:timeout).at_least(1).times
|
123
|
-
|
124
|
-
expect(subject).to receive(:sleep).at_least(2).times
|
125
|
-
expect(subject).to receive(:connect).exactly(3).times
|
126
|
-
expect(subject).to receive(:disconnect).exactly(3).times
|
127
|
-
|
128
|
-
expect(exchange).to receive(:publish).at_least(2).times
|
129
|
-
|
130
|
-
subject.publish(event: 'explode', uid: 'thing:rspec$1')
|
131
|
-
end
|
132
|
-
end
|
133
|
-
end
|
134
|
-
|
135
|
-
CONNECTION_EXCEPTIONS.each do |exception_class|
|
136
|
-
context "on permanent failure with #{exception_class}" do
|
137
|
-
it "retries with exponential backoff until timeout and gives up with SendFailure" do
|
138
|
-
exchange = double('exchange')
|
139
|
-
exchange.stub(:publish) do
|
140
|
-
raise create_exception(exception_class)
|
141
|
-
end
|
142
|
-
subject.stub(:exchange) { exchange }
|
143
|
-
|
144
|
-
count, sleeps = 0, []
|
145
|
-
subject.stub(:sleep) { |t|
|
146
|
-
count += 1
|
147
|
-
if count >= 10
|
148
|
-
raise Timeout::Error
|
149
|
-
end
|
150
|
-
sleeps.push(t)
|
151
|
-
}
|
152
|
-
|
153
|
-
Timeout.stub(:timeout) { |&block|
|
154
|
-
block.call
|
155
|
-
}
|
156
|
-
expect(Timeout).to receive(:timeout).at_least(1).times
|
157
|
-
|
158
|
-
expect(subject).to receive(:disconnect).at_least(11).times
|
159
|
-
|
160
|
-
expect(-> { subject.publish({event: 'explode', uid: 'thing:rspec$1'})}).to raise_error do |e|
|
161
|
-
expect(e).to be_instance_of Pebbles::River::SendFailure
|
162
|
-
expect(e.connection_exception.class).to eq exception_class
|
163
|
-
end
|
164
|
-
|
165
|
-
expect(sleeps[0, 9]).to eq [1, 2, 4, 8, 10, 10, 10, 10, 10]
|
166
|
-
end
|
167
|
-
end
|
168
|
-
end
|
169
|
-
|
170
92
|
context 'on connection timeout' do
|
171
93
|
it "gives up with SendFailure" do
|
172
94
|
exchange = double('exchange')
|
data/spec/lib/worker_spec.rb
CHANGED
@@ -203,71 +203,36 @@ describe Worker do
|
|
203
203
|
end
|
204
204
|
end
|
205
205
|
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
Bunny::ForcedConnectionCloseError,
|
211
|
-
Bunny::ServerDownError,
|
212
|
-
Bunny::ProtocolError,
|
213
|
-
Errno::ECONNRESET
|
214
|
-
].each do |exception_class|
|
215
|
-
context "connection exception #{exception_class}" do
|
216
|
-
let :exception do
|
217
|
-
create_exception(exception_class)
|
218
|
-
end
|
219
|
-
|
220
|
-
let :handler do
|
221
|
-
handler = double('handler')
|
222
|
-
allow(handler).to receive(:call) {
|
223
|
-
raise exception
|
224
|
-
}
|
225
|
-
handler
|
226
|
-
end
|
227
|
-
|
228
|
-
it "performs connection reset on #{exception_class}" do
|
229
|
-
expect(handler).to receive(:call).with(message)
|
206
|
+
context "connection exception" do
|
207
|
+
let :exception do
|
208
|
+
Bunny::ConnectionError.new("error!")
|
209
|
+
end
|
230
210
|
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
211
|
+
let :handler do
|
212
|
+
handler = double('handler')
|
213
|
+
allow(handler).to receive(:call) {
|
214
|
+
raise exception
|
215
|
+
}
|
216
|
+
handler
|
217
|
+
end
|
235
218
|
|
219
|
+
it "re-raises exception" do
|
220
|
+
expect(handler).to receive(:call).with(message)
|
221
|
+
expect(->() {
|
236
222
|
subject.new(handler, queue: {name: 'foo'}).run_once
|
237
|
-
|
238
|
-
|
239
|
-
it "does not call #on_exception on connection error" do
|
240
|
-
on_exception_callback = double('on_connection_error')
|
241
|
-
on_exception_callback.stub(:call) { }
|
242
|
-
expect(on_exception_callback).to_not receive(:call)
|
243
|
-
|
244
|
-
expect(handler).to receive(:call).at_least(1).times
|
245
|
-
|
246
|
-
expect(river).to receive(:connected?).with(no_args).at_least(1).times
|
247
|
-
expect(river).to_not receive(:connect)
|
248
|
-
expect(river).to receive(:disconnect).at_least(1).times
|
223
|
+
}).to raise_error(Bunny::ConnectionError)
|
224
|
+
end
|
249
225
|
|
226
|
+
it "does not call #on_exception on connection error" do
|
227
|
+
on_exception_callback = double('on_connection_error')
|
228
|
+
on_exception_callback.stub(:call) { }
|
229
|
+
expect(on_exception_callback).to_not receive(:call)
|
230
|
+
expect(handler).to receive(:call).at_least(1).times
|
231
|
+
expect(->() {
|
250
232
|
subject.new(handler,
|
251
233
|
queue: {name: 'foo'},
|
252
234
|
on_exception: on_exception_callback).run_once
|
253
|
-
|
254
|
-
|
255
|
-
it "logs error to logger" do
|
256
|
-
expect(handler).to receive(:call).with(message)
|
257
|
-
|
258
|
-
logger = double('logger')
|
259
|
-
logger.stub(:error) { }
|
260
|
-
|
261
|
-
# TODO: Test exception contents here
|
262
|
-
expect(logger).to receive(:error).
|
263
|
-
with(/.*/).at_least(1).times
|
264
|
-
|
265
|
-
river.stub(:disconnect)
|
266
|
-
|
267
|
-
subject.new(handler,
|
268
|
-
queue: {name: 'foo'},
|
269
|
-
logger: logger).run_once
|
270
|
-
end
|
235
|
+
}).to raise_error(Bunny::ConnectionError)
|
271
236
|
end
|
272
237
|
end
|
273
238
|
|
data/spec/spec_helper.rb
CHANGED
@@ -8,21 +8,6 @@ SimpleCov.start
|
|
8
8
|
|
9
9
|
require_relative '../lib/pebbles/river'
|
10
10
|
|
11
|
-
module SpecHelpers
|
12
|
-
def create_exception(exception_class)
|
13
|
-
# TODO: Using #allocate here because Bunny has a whole bunch
|
14
|
-
# of exceptions; the one comparison against ECONNRESET is sad
|
15
|
-
# and could be generalized
|
16
|
-
if exception_class == Errno::ECONNRESET
|
17
|
-
raise exception_class.new
|
18
|
-
else
|
19
|
-
raise exception_class.allocate
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
11
|
RSpec.configure do |config|
|
25
12
|
config.mock_with :rspec
|
26
|
-
config.include SpecHelpers
|
27
13
|
end
|
28
|
-
|