amqp-boilerplate 1.0.0 → 1.1.0

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.
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: