forked from jondot/sneakers
/
max_retry_handler.rb
78 lines (69 loc) · 2.17 KB
/
max_retry_handler.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
$: << File.expand_path('../lib', File.dirname(__FILE__))
require 'sneakers'
require 'sneakers/runner'
require 'sneakers/handlers/maxretry'
require 'logger'
Sneakers.configure(:handler => Sneakers::Handlers::Maxretry,
:workers => 1,
:threads => 1,
:prefetch => 1,
:exchange => 'sneakers',
:exchange_type => 'topic',
:routing_key => ['#', 'something'],
:durable => true,
)
Sneakers.logger.level = Logger::DEBUG
WORKER_OPTIONS = {
:ack => true,
:threads => 1,
:prefetch => 1,
:timeout_job_after => 60,
:heartbeat => 5,
:retry_timeout => 5000
}
# Example of how to write a retry worker. If your rabbit system is empty, then
# you must run this twice. Once to setup the exchanges, queues and bindings a
# second time to have the sent message end up on the downloads queue.
#
# Run this via:
# bundle exec ruby examples/max_retry_handler.rb
#
class MaxRetryWorker
include Sneakers::Worker
from_queue 'downloads',
WORKER_OPTIONS.merge({
:arguments => {
:'x-dead-letter-exchange' => 'downloads-retry'
},
})
def work(msg)
logger.info("MaxRetryWorker rejecting msg: #{msg.inspect}")
# We always want to reject to see if we do the proper timeout
reject!
end
end
# Example of a worker on the same exchange that does not fail, so it should only
# see the message once.
class SucceedingWorker
include Sneakers::Worker
from_queue 'uploads',
WORKER_OPTIONS.merge({
:arguments => {
:'x-dead-letter-exchange' => 'uploads-retry'
},
})
def work(msg)
logger.info("SucceedingWorker succeeding on msg: #{msg.inspect}")
ack!
end
end
messages = 1
puts "feeding messages in"
messages.times {
Sneakers.publish(" -- message -- ",
:to_queue => 'anywhere',
:persistence => true)
}
puts "done"
r = Sneakers::Runner.new([MaxRetryWorker, SucceedingWorker])
r.run