amqp-boilerplate 1.0.0 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG CHANGED
@@ -1,3 +1,12 @@
1
+ = version 1.1.0
2
+
3
+ * [FEATURE] Added on_unhandled_consumer_exception option to allow for more
4
+ flexible exception handling (consumer exceptions)
5
+
6
+ = version 1.0.0
7
+
8
+ First stable release
9
+
1
10
  = version 0.0.8
2
11
 
3
12
  * [FEATURE] Do not start consumers when server type is unknown
data/README.rdoc CHANGED
@@ -21,6 +21,7 @@ Add a initializer +amqp.rb+ to your config/initializer folder with the following
21
21
  config.logger = ::Rails.logger
22
22
  config.consumer_paths += %W( #{Rails.root}/app/consumers )
23
23
  config.connection_options = { :host => "localhost", :port => 5672, :vhost => Rails.env }
24
+ config.on_unhandled_exception = Proc.new { |exception| puts "Do something with exceptions: #{exception}" }
24
25
  end
25
26
 
26
27
  # Require all files that are no longer auto-loaded when Rails is in thread-safe mode
@@ -61,6 +61,7 @@ module AMQP
61
61
  # config.logger = ::Rails.logger
62
62
  # config.consumer_paths += %W( #{Rails.root}/app/consumers )
63
63
  # config.connection_options = { :host => "localhost", :port => 5672, :vhost => Rails.env }
64
+ # config.on_unhandled_exception = Proc.new { |exception| puts "Do something with exceptions: #{exception}" }
64
65
  # end
65
66
  def self.configure
66
67
  yield self if block_given?
@@ -77,6 +78,16 @@ module AMQP
77
78
  @connection_options = options
78
79
  end
79
80
 
81
+ def self.on_unhandled_consumer_exception
82
+ @on_unhandled_consumer_exception
83
+ end
84
+
85
+ # Pass a +Proc+ object to this option that will function as a handler for
86
+ # uncaught exceptions in a consumer.
87
+ def self.on_unhandled_consumer_exception=(handler)
88
+ @on_unhandled_consumer_exception = handler
89
+ end
90
+
80
91
  def self.start
81
92
  AMQP.start self.connection_options
82
93
  end
@@ -88,16 +88,14 @@ module AMQP
88
88
  def handle_message_wrapper(metadata, payload)
89
89
  AMQP::Boilerplate.logger.debug("[#{self.class}#handle_message_wrapper] Received message: #{payload}")
90
90
  handle_message(metadata, payload)
91
- rescue StandardError => e
92
- message = <<-MSG
93
- [#{self.class}] An exception occurred while processing a message
94
- Payload: #{payload}
95
- Exception: #{e.message}
96
- Backtrace: #{e.backtrace.join("\n")}
97
- MSG
98
-
99
- AMQP::Boilerplate.logger.error(message)
91
+ rescue Exception => e
92
+ if AMQP::Boilerplate.on_unhandled_consumer_exception.is_a?(Proc)
93
+ AMQP::Boilerplate.on_unhandled_consumer_exception.call(e)
94
+ else
95
+ raise e
96
+ end
100
97
  end
98
+
101
99
  end
102
100
  end
103
101
  end
@@ -1,5 +1,5 @@
1
1
  module AMQP
2
2
  module Boilerplate
3
- VERSION = "1.0.0"
3
+ VERSION = "1.1.0"
4
4
  end
5
5
  end
@@ -144,32 +144,34 @@ describe AMQP::Boilerplate::Consumer do
144
144
  @consumer.handle_message_wrapper(@metadata, @payload)
145
145
  end
146
146
 
147
- describe "when a StandardError-like error is raised" do
148
- before(:each) do
149
- @consumer.stub(:handle_message).and_raise(StandardError)
147
+ context "when on_unhandled_consumer_exception option set" do
148
+ before do
149
+ AMQP::Boilerplate.stub(:on_unhandled_consumer_exception).and_return(Proc.new { |e|
150
+ AMQP::Boilerplate.logger.error("foo: #{e.message}")
151
+ })
150
152
  end
151
153
 
152
- it "should be caught" do
154
+ it "should not raise the exception" do
153
155
  expect {
154
156
  @consumer.handle_message_wrapper(@metadata, @payload)
155
157
  }.to_not raise_error
156
158
  end
157
159
 
158
- it "should log" do
160
+ it "should yield the on_unhandled_consumer_exception" do
159
161
  AMQP::Boilerplate.logger.should_receive(:error)
160
162
  @consumer.handle_message_wrapper(@metadata, @payload)
161
163
  end
162
164
  end
163
165
 
164
- describe "when a NotImplementedError is raised" do
165
- before(:each) do
166
- @consumer.stub(:handle_message).and_raise(NotImplementedError)
166
+ context "when on_unhandled_consumer_exception option set" do
167
+ before do
168
+ AMQP::Boilerplate.stub(:on_unhandled_consumer_exception).and_return(nil)
167
169
  end
168
170
 
169
- it "should not be caught" do
171
+ it "should re-raise the exception" do
170
172
  expect {
171
173
  @consumer.handle_message_wrapper(@metadata, @payload)
172
- }.to raise_error(NotImplementedError)
174
+ }.to raise_error
173
175
  end
174
176
  end
175
177
  end
@@ -132,6 +132,12 @@ describe AMQP::Boilerplate do
132
132
  AMQP::Boilerplate.configure { |config| config.connection_options = connection_options }
133
133
  AMQP::Boilerplate.connection_options.should == connection_options
134
134
  end
135
+
136
+ it "should let us set a handler for uncaught exceptions" do
137
+ on_unhandled_consumer_exception = Proc.new {}
138
+ AMQP::Boilerplate.configure { |config| config.on_unhandled_consumer_exception = on_unhandled_consumer_exception }
139
+ AMQP::Boilerplate.on_unhandled_consumer_exception.should == on_unhandled_consumer_exception
140
+ end
135
141
  end
136
142
 
137
143
  describe ".start" do
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: amqp-boilerplate
3
3
  version: !ruby/object:Gem::Version
4
- hash: 23
4
+ hash: 19
5
5
  prerelease:
6
6
  segments:
7
7
  - 1
8
+ - 1
8
9
  - 0
9
- - 0
10
- version: 1.0.0
10
+ version: 1.1.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Patrick Baselier
@@ -16,10 +16,12 @@ autorequire:
16
16
  bindir: bin
17
17
  cert_chain: []
18
18
 
19
- date: 2012-04-20 00:00:00 Z
19
+ date: 2012-05-08 00:00:00 +02:00
20
+ default_executable:
20
21
  dependencies:
21
22
  - !ruby/object:Gem::Dependency
22
23
  name: rake
24
+ prerelease: false
23
25
  version_requirements: &id001 !ruby/object:Gem::Requirement
24
26
  none: false
25
27
  requirements:
@@ -31,10 +33,10 @@ dependencies:
31
33
  - 9
32
34
  version: "0.9"
33
35
  type: :development
34
- prerelease: false
35
36
  requirement: *id001
36
37
  - !ruby/object:Gem::Dependency
37
38
  name: rspec
39
+ prerelease: false
38
40
  version_requirements: &id002 !ruby/object:Gem::Requirement
39
41
  none: false
40
42
  requirements:
@@ -46,10 +48,10 @@ dependencies:
46
48
  - 6
47
49
  version: "2.6"
48
50
  type: :development
49
- prerelease: false
50
51
  requirement: *id002
51
52
  - !ruby/object:Gem::Dependency
52
53
  name: yard
54
+ prerelease: false
53
55
  version_requirements: &id003 !ruby/object:Gem::Requirement
54
56
  none: false
55
57
  requirements:
@@ -61,10 +63,10 @@ dependencies:
61
63
  - 7
62
64
  version: "0.7"
63
65
  type: :development
64
- prerelease: false
65
66
  requirement: *id003
66
67
  - !ruby/object:Gem::Dependency
67
68
  name: amqp
69
+ prerelease: false
68
70
  version_requirements: &id004 !ruby/object:Gem::Requirement
69
71
  none: false
70
72
  requirements:
@@ -76,7 +78,6 @@ dependencies:
76
78
  - 8
77
79
  version: "0.8"
78
80
  type: :runtime
79
- prerelease: false
80
81
  requirement: *id004
81
82
  description: Collection of modules that aid in setting up AMQP producers and consumers.
82
83
  email:
@@ -113,6 +114,7 @@ files:
113
114
  - spec/amqp/boilerplate_spec.rb
114
115
  - spec/fixtures/consumers/dummy_consumer.rb
115
116
  - spec/spec_helper.rb
117
+ has_rdoc: true
116
118
  homepage: ""
117
119
  licenses: []
118
120
 
@@ -142,7 +144,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
142
144
  requirements: []
143
145
 
144
146
  rubyforge_project: amqp-boilerplate
145
- rubygems_version: 1.8.22
147
+ rubygems_version: 1.6.2
146
148
  signing_key:
147
149
  specification_version: 3
148
150
  summary: Helper modules for quickly setting up AMQP producers/consumers
@@ -155,4 +157,3 @@ test_files:
155
157
  - spec/amqp/boilerplate_spec.rb
156
158
  - spec/fixtures/consumers/dummy_consumer.rb
157
159
  - spec/spec_helper.rb
158
- has_rdoc: