ElmerFudd 0.0.16 → 0.0.17
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/ElmerFudd.gemspec +1 -1
- data/README.md +77 -1
- data/lib/ElmerFudd/version.rb +1 -1
- data/lib/ElmerFudd.rb +1 -1
- metadata +5 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f89c5aa3e2803b6edc3e45dd83d5ffc802cf9383
|
4
|
+
data.tar.gz: 6cd2713cfe25845a75b0ad6753d51eee8ce499e7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7009b94e28241492449ba49498c5e01f6cb6d55f2d3839cdd966cfcbfd976fe5e01bcea606a76ece1490fdd6139afaf3bad93794e562050a6687b2d9c699c48c
|
7
|
+
data.tar.gz: d4761b1312202cbe4359e980c3334fbdf4643cca6e0e16549cd03ad374f81a13a754584e95283c5f42aa8c677a93cab1e19e2327a7e61fc58a053e2dc6ba1d04
|
data/ElmerFudd.gemspec
CHANGED
@@ -18,7 +18,7 @@ Gem::Specification.new do |spec|
|
|
18
18
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
19
|
spec.require_paths = ["lib"]
|
20
20
|
|
21
|
-
spec.add_dependency "bunny"
|
21
|
+
spec.add_dependency "bunny", '>= 1.6.3'
|
22
22
|
spec.add_development_dependency "bundler", "~> 1.5"
|
23
23
|
spec.add_development_dependency "rake"
|
24
24
|
spec.add_development_dependency "rspec"
|
data/README.md
CHANGED
@@ -22,7 +22,83 @@ Or install it yourself as:
|
|
22
22
|
|
23
23
|
## Usage
|
24
24
|
|
25
|
-
|
25
|
+
### Consumer
|
26
|
+
|
27
|
+
```ruby
|
28
|
+
#!/usr/bin/env ruby
|
29
|
+
# Example app/worker/test_worker.rb in rails
|
30
|
+
|
31
|
+
require_relative "../../config/environment"
|
32
|
+
|
33
|
+
class TestLogger
|
34
|
+
def initialize(stream)
|
35
|
+
@stream = stream
|
36
|
+
end
|
37
|
+
|
38
|
+
def call(_env, message)
|
39
|
+
@stream.puts "[#{Time.now}] received on #{message.delivery_info.routing_key} payload: #{message.payload.inspect}"
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
class TestWorker < ElmerFudd::Worker
|
44
|
+
default_filters(ElmerFudd::JsonFilter)
|
45
|
+
|
46
|
+
handle_cast(Route('test.print')) do |env, message|
|
47
|
+
puts "message: #{message.payload["text"]"
|
48
|
+
end
|
49
|
+
|
50
|
+
handle_call(Route('test.ping')) do |env, message|
|
51
|
+
"pong: #{message.payload["text"]"
|
52
|
+
end
|
53
|
+
|
54
|
+
handle_call(Route('test.ping')) do |env, message|
|
55
|
+
"pong: #{message.payload["text"]"
|
56
|
+
end
|
57
|
+
|
58
|
+
handle_event(Route('test.log', 'a_topic_exchange' => 'test.#'),
|
59
|
+
handler: TestLogger.new($stdout))
|
60
|
+
end
|
61
|
+
|
62
|
+
if $PROGRAM_NAME == __FILE__
|
63
|
+
trap("TERM", "DEFAULT") { exit 0 }
|
64
|
+
$connection = Bunny.new
|
65
|
+
TestWorker.new($connection, concurrency: 4).start
|
66
|
+
loop { sleep(1) }
|
67
|
+
end
|
68
|
+
```
|
69
|
+
|
70
|
+
### Producer
|
71
|
+
|
72
|
+
```ruby
|
73
|
+
$connection = Bunny.new
|
74
|
+
$rabbit = ElmerFudd::JsonPublisher.new($connection)
|
75
|
+
|
76
|
+
$rabbit.cast('test.print', text: 'hello') # will print "message: hello"
|
77
|
+
|
78
|
+
$rabbit.call('test.ping', text: 'echo') #=> "pong: echo"
|
79
|
+
|
80
|
+
$rabbit.notify('a_topic_exchange', 'test.log.some.event', count: 1) # will print "[current time here] received on test.log.some.event payload: {count: 1}"
|
81
|
+
```
|
82
|
+
|
83
|
+
### Filters
|
84
|
+
|
85
|
+
Filters allow to mutate an incoming message in consumer before it hits appropiate handler or to modify return value (or handle errors) after the handler finishes its job. You can define default filters which will be applied to all handlers in consumer or activate them on handler level by passing filters list as a param, i.e.:
|
86
|
+
|
87
|
+
```ruby
|
88
|
+
handle_cast(Route('math.divide')
|
89
|
+
filter: [DropFailedFilter.new(exception: ZeroDivisionError)]) do |env, message|
|
90
|
+
puts "#{payload['a'] / payload['b']}"
|
91
|
+
end
|
92
|
+
```
|
93
|
+
|
94
|
+
#### Available filters
|
95
|
+
|
96
|
+
* `JsonFilter` - deserializes incoming messages using json and serializes call responses to json
|
97
|
+
* `DropFailedFilter.new(exception: Exception, exception_message_matches: /.*/)` - ignore the message if handler raises matching exception
|
98
|
+
* `AirbrakeFilter` - notify airbrake if handler raises exception and reraises it in filter chain
|
99
|
+
* `ActiveRecordConnectionPoolFilter` - allows to use worker with higher concurrency (takes a connection from pool for each message)
|
100
|
+
* `RetryFilter.new(2, exception: Exception, exception_message_matches: /.*/)` - retries 2 times if handler raises a matching exception
|
101
|
+
|
26
102
|
|
27
103
|
## Contributing
|
28
104
|
|
data/lib/ElmerFudd/version.rb
CHANGED
data/lib/ElmerFudd.rb
CHANGED
@@ -95,7 +95,7 @@ module ElmerFudd
|
|
95
95
|
|
96
96
|
def start
|
97
97
|
self.class.handlers.each do |handler|
|
98
|
-
handler.queue(@env).subscribe(
|
98
|
+
handler.queue(@env).subscribe(manual_ack: true, block: false) do |delivery_info, properties, payload|
|
99
99
|
message = Message.new(delivery_info, properties, payload, handler.route)
|
100
100
|
begin
|
101
101
|
handler.call(@env, message)
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ElmerFudd
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.17
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andrzej Sliwa
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-
|
12
|
+
date: 2014-12-10 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bunny
|
@@ -17,14 +17,14 @@ dependencies:
|
|
17
17
|
requirements:
|
18
18
|
- - '>='
|
19
19
|
- !ruby/object:Gem::Version
|
20
|
-
version:
|
20
|
+
version: 1.6.3
|
21
21
|
type: :runtime
|
22
22
|
prerelease: false
|
23
23
|
version_requirements: !ruby/object:Gem::Requirement
|
24
24
|
requirements:
|
25
25
|
- - '>='
|
26
26
|
- !ruby/object:Gem::Version
|
27
|
-
version:
|
27
|
+
version: 1.6.3
|
28
28
|
- !ruby/object:Gem::Dependency
|
29
29
|
name: bundler
|
30
30
|
requirement: !ruby/object:Gem::Requirement
|
@@ -109,7 +109,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
109
109
|
version: '0'
|
110
110
|
requirements: []
|
111
111
|
rubyforge_project:
|
112
|
-
rubygems_version: 2.
|
112
|
+
rubygems_version: 2.4.2
|
113
113
|
signing_key:
|
114
114
|
specification_version: 4
|
115
115
|
summary: RabbitMQ in OTP way
|