sneakers_handlers 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 7a3e5a73cc16eed57ed53952d2989b5d9dc18e47
4
+ data.tar.gz: ba629ecd84e6b69f8477746bbb57dd360c2cc06b
5
+ SHA512:
6
+ metadata.gz: c81a40929c55500b25f811f62f1620c8b5df1202d6cba891896ec3225f8d6f5bcdfe557b55b0375cf71c9c5fda2a901fde613690f4a61b5ab1567d43530ebe5f
7
+ data.tar.gz: d483161d7bc28c32ab53e34ca349b5f80d955ae869907877ebe15be10d7539317ce7865b0cc0c18ceaf8f7e81fe39d15d50fd1132031429b618f37921a1638a7
@@ -0,0 +1,2 @@
1
+ RABBITMQ_VHOST="/"
2
+ RABBITMQ_URL=amqp://guest:guest@localhost
@@ -0,0 +1,10 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ .env
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in sneakers_handlers.gemspec
4
+ gemspec
@@ -0,0 +1,63 @@
1
+ # SneakersHandlers
2
+
3
+ Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/sneakers_handlers`. To experiment with that code, run `bin/console` for an interactive prompt.
4
+
5
+ TODO: Delete this and the text above, and describe your gem
6
+
7
+ ## Installation
8
+
9
+ Add this line to your application's Gemfile:
10
+
11
+ ```ruby
12
+ gem 'sneakers_handlers'
13
+ ```
14
+
15
+ And then execute:
16
+
17
+ $ bundle
18
+
19
+ Or install it yourself as:
20
+
21
+ $ gem install sneakers_handlers
22
+
23
+ ## Usage
24
+
25
+ The gem introduces two handlers you can use as part of your sneaker workers: `SneakersHandlers::DeadLetter` and `SneakersHandlers::RetryHandler`
26
+
27
+ ## Using the `SneakersHandlers::RetryHandler` handler
28
+
29
+ When defining your worker, you have the following extra options:
30
+
31
+ `max_retry` [optional] : The number of times a message will be processed after a rejection
32
+
33
+ `x-dead-letter-routing-key` [mandatory] : The routing key that the retry queue will be bound to, usually it is the name of the original queue, for example:
34
+
35
+ ```ruby
36
+ class MyWorker
37
+ include Sneakers::Worker
38
+ from_queue "my-app.resource_processor",
39
+ durable: true,
40
+ ack: true,
41
+ exchange: "domain_events",
42
+ exchange_type: :topic,
43
+ routing_key: "resources.lifecycle.*",
44
+ handler: Sneakers::Handlers::RetryHandler,
45
+ max_retry: 6,
46
+ arguments: { "x-dead-letter-exchange" => "domain_events.dlx",
47
+ "x-dead-letter-routing-key" => "my-app.resource_processor" }
48
+
49
+ def work(payload)
50
+ ...
51
+ end
52
+ end
53
+ ```
54
+
55
+ ## Development
56
+
57
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
58
+
59
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
60
+
61
+ ## Contributing
62
+
63
+ Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/sneakers_handlers.
@@ -0,0 +1,10 @@
1
+ require "bundler/gem_tasks"
2
+ require "rake/testtask"
3
+
4
+ Rake::TestTask.new(:test) do |t|
5
+ t.libs << "test"
6
+ t.libs << "lib"
7
+ t.test_files = FileList['test/**/*_test.rb']
8
+ end
9
+
10
+ task :default => :spec
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "sneakers_handlers"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,5 @@
1
+ machine:
2
+ services:
3
+ - rabbitmq-server
4
+ ruby:
5
+ version: 2.3.0
@@ -0,0 +1,7 @@
1
+ require "sneakers_handlers/version"
2
+ require 'sneakers'
3
+ require 'sneakers_handlers/dead_letter'
4
+ require 'sneakers_handlers/retry_handler'
5
+ module SneakersHandlers
6
+ # Your code goes here...
7
+ end
@@ -0,0 +1,23 @@
1
+ module SneakersHandlers
2
+ class DeadLetter < ::Sneakers::Handlers::Oneshot
3
+ def initialize(channel, queue, options)
4
+ super
5
+
6
+ create_dead_letter_exchange!(channel, queue, options)
7
+ end
8
+
9
+ private
10
+
11
+ def create_dead_letter_exchange!(channel, queue, options)
12
+ arguments = options[:queue_options][:arguments]
13
+
14
+ dlx = channel.exchange(arguments.fetch("x-dead-letter-exchange"), {
15
+ type: options[:exchange_options][:type],
16
+ durable: options[:exchange_options][:durable],
17
+ })
18
+
19
+ dlx_queue = channel.queue("#{queue.name}.dlx", durable: options[:queue_options][:durable])
20
+ dlx_queue.bind(dlx, routing_key: arguments.fetch("x-dead-letter-routing-key"))
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,86 @@
1
+ # Using this handler, failed messages will be retried a certain number of times,
2
+ # until they are dead-lettered.
3
+ #
4
+ # To use it you need to defined this handler in your worker:
5
+ #
6
+ # from_queue "my-app.queue_name",
7
+ # exchange: "domain_events",
8
+ # routing_key: "my_routing_key",
9
+ # handler: Sneakers::Handlers::RetryHandler,
10
+ # arguments: { "x-dead-letter-exchange" => "dlx.domain_events",
11
+ # "x-dead-letter-routing-key" => "my-app.queue_name" }}
12
+ #
13
+ # By default it will retry 5 times before dead-lettering a message, but you can
14
+ # also customize that with the `max_retry` option:
15
+ #
16
+ # from_queue "my-app.queue_name",
17
+ # exchange: "domain_events",
18
+ # routing_key: "my_routing_key",
19
+ # handler: Sneakers::Handlers::RetryHandler,
20
+ # max_retry: 10,
21
+ # arguments: { "x-dead-letter-exchange" => "dlx.domain_events",
22
+ # "x-dead-letter-routing-key" => "my-app.queue_name" }}
23
+
24
+ module SneakersHandlers
25
+ class RetryHandler
26
+
27
+ def initialize(channel, queue, options)
28
+ @channel = channel
29
+ @queue = queue
30
+ @routing_key = options[:routing_key]
31
+ @max_retry = options[:max_retry] || 5
32
+
33
+ create_dlx(channel, queue, options)
34
+ end
35
+
36
+ def acknowledge(hdr, _props, _msg)
37
+ @channel.acknowledge(hdr.delivery_tag, false)
38
+ end
39
+
40
+ def reject(hdr, props, msg, requeue = false)
41
+ retry_message(hdr, props, msg)
42
+ end
43
+
44
+ def error(hdr, props, msg, _err)
45
+ retry_message(hdr, props, msg)
46
+ end
47
+
48
+ def timeout(hdr, props, msg)
49
+ retry_message(hdr, props, msg)
50
+ end
51
+
52
+ def noop(_hdr, _props, _msg)
53
+ end
54
+
55
+ private
56
+
57
+ def create_dlx(channel, queue, options)
58
+ arguments = options[:queue_options][:arguments]
59
+
60
+ dlx_exchange_name = arguments.fetch("x-dead-letter-exchange")
61
+ dlx_exchange = channel.exchange(dlx_exchange_name, {
62
+ type: options[:exchange_options][:type],
63
+ durable: options[:exchange_options][:durable],
64
+ })
65
+
66
+ @dlx_queue = channel.queue("#{queue.name}.dlx", durable: options[:queue_options][:durable])
67
+ @dlx_queue.bind(dlx_exchange, routing_key: arguments.fetch("x-dead-letter-routing-key"))
68
+ end
69
+
70
+ def retry_message(hdr, props, msg)
71
+ headers = props[:headers] || {}
72
+ retry_count = headers["x-retry-count"] || 1
73
+ if retry_count >= @max_retry
74
+ @channel.reject(hdr.delivery_tag)
75
+ else
76
+ Sneakers.logger.info do
77
+ "Retrying message: queue=#{@queue.name} retry_count=#{retry_count}."
78
+ end
79
+ @channel.default_exchange.publish(msg,
80
+ routing_key: @queue.name,
81
+ headers: { "x-retry-count": retry_count + 1 })
82
+ @channel.acknowledge(hdr.delivery_tag, false)
83
+ end
84
+ end
85
+ end
86
+ end
@@ -0,0 +1,3 @@
1
+ module SneakersHandlers
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,28 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'sneakers_handlers/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "sneakers_handlers"
8
+ spec.version = SneakersHandlers::VERSION
9
+ spec.authors = ["John Bohn, Abe Petrillo, Brian Storti"]
10
+ spec.email = ["abe.petrillo@gmail.com"]
11
+
12
+ spec.summary = %q{Adds Handlers to use with Sneakers}
13
+ spec.description = %q{Adds handlers to support retry and custom shoveling}
14
+ spec.homepage = "https://github.com/alphasights/sneakers_handlers"
15
+
16
+ spec.metadata['allowed_push_host'] = 'https://rubygems.org'
17
+
18
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
19
+ spec.bindir = "exe"
20
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
21
+ spec.require_paths = ["lib"]
22
+
23
+ spec.add_dependency "sneakers"
24
+ spec.add_development_dependency "bundler"
25
+ spec.add_development_dependency "rake", "~> 10.0"
26
+ spec.add_development_dependency "minitest", "~> 5.0"
27
+ spec.add_development_dependency "dotenv"
28
+ end
metadata ADDED
@@ -0,0 +1,128 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: sneakers_handlers
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - John Bohn, Abe Petrillo, Brian Storti
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2016-04-12 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: sneakers
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '10.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '10.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: minitest
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '5.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '5.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: dotenv
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ description: Adds handlers to support retry and custom shoveling
84
+ email:
85
+ - abe.petrillo@gmail.com
86
+ executables: []
87
+ extensions: []
88
+ extra_rdoc_files: []
89
+ files:
90
+ - ".env-example"
91
+ - ".gitignore"
92
+ - Gemfile
93
+ - README.md
94
+ - Rakefile
95
+ - bin/console
96
+ - bin/setup
97
+ - circle.yml
98
+ - lib/sneakers_handlers.rb
99
+ - lib/sneakers_handlers/dead_letter.rb
100
+ - lib/sneakers_handlers/retry_handler.rb
101
+ - lib/sneakers_handlers/version.rb
102
+ - sneakers_handlers.gemspec
103
+ homepage: https://github.com/alphasights/sneakers_handlers
104
+ licenses: []
105
+ metadata:
106
+ allowed_push_host: https://rubygems.org
107
+ post_install_message:
108
+ rdoc_options: []
109
+ require_paths:
110
+ - lib
111
+ required_ruby_version: !ruby/object:Gem::Requirement
112
+ requirements:
113
+ - - ">="
114
+ - !ruby/object:Gem::Version
115
+ version: '0'
116
+ required_rubygems_version: !ruby/object:Gem::Requirement
117
+ requirements:
118
+ - - ">="
119
+ - !ruby/object:Gem::Version
120
+ version: '0'
121
+ requirements: []
122
+ rubyforge_project:
123
+ rubygems_version: 2.4.5.1
124
+ signing_key:
125
+ specification_version: 4
126
+ summary: Adds Handlers to use with Sneakers
127
+ test_files: []
128
+ has_rdoc: