amqp-boilerplate 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +2 -0
- data/amqp-boilerplate.gemspec +1 -0
- data/lib/amqp/boilerplate/consumer.rb +3 -0
- data/lib/amqp/boilerplate/consumer_registry.rb +32 -0
- data/lib/amqp/boilerplate/producer.rb +61 -4
- data/lib/amqp/boilerplate/version.rb +1 -1
- data/lib/amqp/boilerplate.rb +44 -0
- data/spec/amqp/boilerplate/consumer_registry_spec.rb +72 -0
- data/spec/amqp/boilerplate/consumer_spec.rb +13 -20
- data/spec/amqp/boilerplate/logging_spec.rb +1 -1
- data/spec/amqp/boilerplate/producer_spec.rb +5 -27
- data/spec/amqp/boilerplate_spec.rb +81 -0
- data/spec/fixtures/consumers/dummy_consumer.rb +3 -0
- data/spec/spec_helper.rb +35 -0
- metadata +26 -6
data/.gitignore
CHANGED
data/amqp-boilerplate.gemspec
CHANGED
@@ -22,5 +22,6 @@ Gem::Specification.new do |s|
|
|
22
22
|
# specify any dependencies here; for example:
|
23
23
|
s.add_development_dependency "rake", "~> 0.9"
|
24
24
|
s.add_development_dependency "rspec", "~> 2.6"
|
25
|
+
s.add_development_dependency "yard", "~> 0.7"
|
25
26
|
s.add_runtime_dependency "amqp", "~> 0.8"
|
26
27
|
end
|
@@ -5,6 +5,7 @@ module AMQP
|
|
5
5
|
def amqp_queue(name=AMQ::Protocol::EMPTY_STRING, options={})
|
6
6
|
@queue_name = name
|
7
7
|
@queue_options = options
|
8
|
+
AMQP::Boilerplate.register_consumer(self)
|
8
9
|
end
|
9
10
|
|
10
11
|
def amqp_subscription(options={})
|
@@ -19,6 +20,8 @@ module AMQP
|
|
19
20
|
|
20
21
|
queue = channel.queue(@queue_name, @queue_options)
|
21
22
|
queue.subscribe(@subscription_options, &consumer.method(:handle_message))
|
23
|
+
|
24
|
+
AMQP::Boilerplate.logger.info("[#{self.name}.start] Started consumer '#{self.name}'")
|
22
25
|
end
|
23
26
|
end
|
24
27
|
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module AMQP
|
2
|
+
module Boilerplate
|
3
|
+
module ConsumerRegistry
|
4
|
+
attr_writer :consumer_paths
|
5
|
+
|
6
|
+
def consumer_paths
|
7
|
+
@consumer_paths ||= []
|
8
|
+
end
|
9
|
+
|
10
|
+
def load_consumers
|
11
|
+
consumer_paths.each do |dir|
|
12
|
+
Dir[File.join(dir, "*.rb")].each {|f| require f}
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def registry
|
17
|
+
@registry ||= []
|
18
|
+
end
|
19
|
+
|
20
|
+
def register_consumer(klass)
|
21
|
+
AMQP::Boilerplate.logger.info("[#{self.name}#register_consumer] Registered consumer '#{klass.name}'")
|
22
|
+
registry << klass
|
23
|
+
end
|
24
|
+
|
25
|
+
def start_consumers
|
26
|
+
registry.each do |consumer|
|
27
|
+
consumer.start
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -1,32 +1,84 @@
|
|
1
1
|
module AMQP
|
2
2
|
module Boilerplate
|
3
|
+
# Use this module to turn a class into a potential producer that can
|
4
|
+
# deliver messages to an AMQP exchange.
|
5
|
+
#
|
6
|
+
# @example Getting started
|
7
|
+
# class MyProducer
|
8
|
+
# extend AMQP::Boilerplate::Producer
|
9
|
+
#
|
10
|
+
# amqp :routing_key => "hello.world"
|
11
|
+
# amqp_message :message
|
12
|
+
#
|
13
|
+
# def message
|
14
|
+
# "Look! I am a string that will be posted to the exchange."
|
15
|
+
# end
|
16
|
+
# end
|
17
|
+
#
|
18
|
+
# @example Configuring exchange
|
19
|
+
# class MyProducer
|
20
|
+
# extend AMQP::Boilerplate::Producer
|
21
|
+
#
|
22
|
+
# amqp :routing_key => "hello.world"
|
23
|
+
# amqp_exchange :fanout, "amq.fanout", :durable => true
|
24
|
+
# amqp_message :message
|
25
|
+
#
|
26
|
+
# def message
|
27
|
+
# "Look! I am a string that will be posted to the exchange."
|
28
|
+
# end
|
29
|
+
# end
|
3
30
|
module Producer
|
4
|
-
|
31
|
+
# Macro that sets up amqp for a class.
|
32
|
+
#
|
33
|
+
# @param [Hash] opts Options that will be passed to +AMQP::Exchange#publish
|
34
|
+
# @return [void]
|
35
|
+
def amqp(opts={})
|
5
36
|
send :include, InstanceMethods
|
6
|
-
@amqp_boilerplate_options =
|
37
|
+
@amqp_boilerplate_options = opts
|
7
38
|
end
|
8
39
|
|
9
|
-
|
10
|
-
|
40
|
+
# Configuration for the exchange to be used
|
41
|
+
#
|
42
|
+
# @param [Symbol] type Exchange type
|
43
|
+
# @param [String] name Exchange name
|
44
|
+
# @param [Hash] opts a customizable set of options
|
45
|
+
# @see AMQP::Exchange#initialize
|
46
|
+
# @return [void]
|
47
|
+
def amqp_exchange(type=:direct, name=AMQ::Protocol::EMPTY_STRING, opts={})
|
48
|
+
@amqp_boilerplate_exchange = [type, name, opts]
|
11
49
|
end
|
12
50
|
|
51
|
+
# Choose the method that will return the actual message (payload) to be
|
52
|
+
# delivered to the exchange
|
53
|
+
#
|
54
|
+
# This method SHOULD return a string.
|
55
|
+
#
|
56
|
+
# @param [Symbol] method_name Name of method that generates message
|
57
|
+
# @return [void]
|
13
58
|
def amqp_message(method_name)
|
14
59
|
@amqp_boilerplate_message = method_name
|
15
60
|
end
|
16
61
|
|
62
|
+
# TODO Can we do this in a nicer way?
|
17
63
|
def amqp_boilerplate_options
|
18
64
|
@amqp_boilerplate_options
|
19
65
|
end
|
20
66
|
|
67
|
+
# TODO Can we do this in a nicer way?
|
21
68
|
def amqp_boilerplate_exchange
|
22
69
|
@amqp_boilerplate_exchange || amqp_exchange
|
23
70
|
end
|
24
71
|
|
72
|
+
# TODO Can we do this in a nicer way?
|
25
73
|
def amqp_boilerplate_message
|
26
74
|
@amqp_boilerplate_message
|
27
75
|
end
|
28
76
|
|
29
77
|
module InstanceMethods
|
78
|
+
# Publishes a message to the exchange
|
79
|
+
#
|
80
|
+
# @see AMQP::Exchange#publish
|
81
|
+
# @return [void]
|
30
82
|
def publish
|
31
83
|
message = send(self.class.amqp_boilerplate_message.to_sym)
|
32
84
|
exchange.publish(message, self.class.amqp_boilerplate_options) do
|
@@ -36,6 +88,11 @@ module AMQP
|
|
36
88
|
|
37
89
|
private
|
38
90
|
|
91
|
+
# Instantiates a new exchange, additional configuration can be given
|
92
|
+
# through the +amqp_exchange+ class macro.
|
93
|
+
#
|
94
|
+
# @see AMQP::Exchange#initialize
|
95
|
+
# @return [AMQP::Exchange]
|
39
96
|
def exchange
|
40
97
|
AMQP::Exchange.new(AMQP.channel, *self.class.amqp_boilerplate_exchange)
|
41
98
|
end
|
data/lib/amqp/boilerplate.rb
CHANGED
@@ -1,17 +1,61 @@
|
|
1
1
|
require 'amqp'
|
2
|
+
require 'amqp/utilities/event_loop_helper'
|
2
3
|
|
3
4
|
require 'amqp/boilerplate/version'
|
4
5
|
|
5
6
|
require 'amqp/boilerplate/consumer'
|
7
|
+
require 'amqp/boilerplate/consumer_registry'
|
6
8
|
require 'amqp/boilerplate/logging'
|
7
9
|
require 'amqp/boilerplate/producer'
|
8
10
|
|
9
11
|
module AMQP
|
10
12
|
module Boilerplate
|
13
|
+
extend ConsumerRegistry
|
11
14
|
extend Logging
|
12
15
|
|
16
|
+
def self.boot
|
17
|
+
if defined?(PhusionPassenger)
|
18
|
+
PhusionPassenger.on_event(:starting_worker_process) do |forked|
|
19
|
+
if forked
|
20
|
+
amqp_thread = Thread.new {
|
21
|
+
AMQP::Boilerplate.start
|
22
|
+
}
|
23
|
+
amqp_thread.abort_on_exception = true
|
24
|
+
end
|
25
|
+
end
|
26
|
+
else
|
27
|
+
AMQP::Utilities::EventLoopHelper.run do
|
28
|
+
AMQP::Boilerplate.start
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
sleep(0.25)
|
33
|
+
|
34
|
+
AMQP::Boilerplate.logger.info("[#{self.name}.boot] Started AMQP (Server Type: #{AMQP::Utilities::EventLoopHelper.server_type})")
|
35
|
+
|
36
|
+
EventMachine.next_tick do
|
37
|
+
AMQP.channel ||= AMQP::Channel.new(AMQP.connection)
|
38
|
+
|
39
|
+
load_consumers
|
40
|
+
start_consumers
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
# TODO Documentation!
|
13
45
|
def self.configure
|
14
46
|
yield self if block_given?
|
15
47
|
end
|
48
|
+
|
49
|
+
def self.connection_options
|
50
|
+
@connection_options
|
51
|
+
end
|
52
|
+
|
53
|
+
def self.connection_options=(options)
|
54
|
+
@connection_options = options
|
55
|
+
end
|
56
|
+
|
57
|
+
def self.start
|
58
|
+
AMQP.start self.connection_options
|
59
|
+
end
|
16
60
|
end
|
17
61
|
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe AMQP::Boilerplate::ConsumerRegistry do
|
4
|
+
before(:each) do
|
5
|
+
AMQP::Boilerplate.stub(:logger).and_return(mock.as_null_object)
|
6
|
+
end
|
7
|
+
|
8
|
+
describe "#consumer_paths" do
|
9
|
+
it "should be an Array" do
|
10
|
+
AMQP::Boilerplate.consumer_paths.should be_an(Array)
|
11
|
+
end
|
12
|
+
|
13
|
+
it "should always return the same Array" do
|
14
|
+
consumer_paths = AMQP::Boilerplate.consumer_paths
|
15
|
+
AMQP::Boilerplate.consumer_paths.should equal(consumer_paths)
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should default to an empty Array" do
|
19
|
+
AMQP::Boilerplate.consumer_paths.should be_empty
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
describe "#load_consumers" do
|
24
|
+
before(:each) do
|
25
|
+
AMQP::Boilerplate.stub(:registry).and_return([])
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should require all files in configured consumer_paths" do
|
29
|
+
AMQP::Boilerplate.consumer_paths << File.expand_path(File.join(File.dirname(__FILE__), '..', '..', "fixtures/consumers"))
|
30
|
+
|
31
|
+
defined?(DummyConsumer).should be_nil
|
32
|
+
AMQP::Boilerplate.load_consumers
|
33
|
+
defined?(DummyConsumer).should_not be_nil
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
describe "#register_consumer" do
|
38
|
+
before(:each) do
|
39
|
+
AMQP::Boilerplate.stub(:registry).and_return(Array.new)
|
40
|
+
end
|
41
|
+
|
42
|
+
it "should call #registry" do
|
43
|
+
AMQP::Boilerplate.should_receive(:registry).once
|
44
|
+
AMQP::Boilerplate.register_consumer(mock.as_null_object)
|
45
|
+
end
|
46
|
+
|
47
|
+
it "should add classes to registry" do
|
48
|
+
expect {
|
49
|
+
AMQP::Boilerplate.register_consumer(mock.as_null_object)
|
50
|
+
}.to change(AMQP::Boilerplate.registry, :size).by(1)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
describe "#registry" do
|
55
|
+
it "should return an Array" do
|
56
|
+
AMQP::Boilerplate.registry.should be_an(Array)
|
57
|
+
end
|
58
|
+
|
59
|
+
it "should always return the same array" do
|
60
|
+
registry = AMQP::Boilerplate.registry
|
61
|
+
AMQP::Boilerplate.registry.should equal(registry)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
describe "#start_consumers" do
|
66
|
+
it "should call .start on all registered consumer classes" do
|
67
|
+
FooConsumer.should_receive(:start)
|
68
|
+
BarConsumer.should_receive(:start)
|
69
|
+
AMQP::Boilerplate.start_consumers
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
@@ -1,16 +1,9 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
|
4
|
-
amqp_queue "queue.name.here", :durable => true
|
5
|
-
amqp_subscription :ack => true
|
6
|
-
end
|
7
|
-
|
8
|
-
class FooConsumer < AMQP::Boilerplate::Consumer
|
9
|
-
amqp_queue
|
10
|
-
end
|
11
|
-
|
3
|
+
# NOTE See spec_helper for Consumer definitions
|
12
4
|
describe AMQP::Boilerplate::Consumer do
|
13
5
|
before(:each) do
|
6
|
+
AMQP::Boilerplate.stub(:logger).and_return(mock.as_null_object)
|
14
7
|
@channel = mock(AMQP::Channel)
|
15
8
|
@channel.stub(:on_error).and_return(true)
|
16
9
|
end
|
@@ -21,9 +14,9 @@ describe AMQP::Boilerplate::Consumer do
|
|
21
14
|
end
|
22
15
|
|
23
16
|
it "should log the code and message" do
|
24
|
-
AMQP::Boilerplate.logger.should_receive(:error).with("[
|
17
|
+
AMQP::Boilerplate.logger.should_receive(:error).with("[BarConsumer#handle_channel_error] Code = #{@channel_close.reply_code}, message = #{@channel_close.reply_text}")
|
25
18
|
|
26
|
-
|
19
|
+
BarConsumer.new.handle_channel_error(@channel, @channel_close)
|
27
20
|
end
|
28
21
|
end
|
29
22
|
|
@@ -58,8 +51,8 @@ describe AMQP::Boilerplate::Consumer do
|
|
58
51
|
|
59
52
|
describe ".start" do
|
60
53
|
before(:each) do
|
61
|
-
@consumer =
|
62
|
-
|
54
|
+
@consumer = BarConsumer.new
|
55
|
+
BarConsumer.stub(:new).and_return(@consumer)
|
63
56
|
|
64
57
|
AMQP.stub(:channel).and_return(@channel)
|
65
58
|
|
@@ -70,32 +63,32 @@ describe AMQP::Boilerplate::Consumer do
|
|
70
63
|
|
71
64
|
it "should use a channel" do
|
72
65
|
AMQP.should_receive(:channel).and_return(@channel)
|
73
|
-
|
66
|
+
BarConsumer.start
|
74
67
|
end
|
75
68
|
|
76
69
|
it "should instantiate a consumer" do
|
77
|
-
|
78
|
-
|
70
|
+
BarConsumer.should_receive(:new).and_return(@consumer)
|
71
|
+
BarConsumer.start
|
79
72
|
end
|
80
73
|
|
81
74
|
it "should register a channel error handler" do
|
82
75
|
@channel.should_receive(:on_error)
|
83
|
-
|
76
|
+
BarConsumer.start
|
84
77
|
end
|
85
78
|
|
86
79
|
it "should instantiate a queue with the proper queue name" do
|
87
80
|
@channel.should_receive(:queue).with("queue.name.here", anything)
|
88
|
-
|
81
|
+
BarConsumer.start
|
89
82
|
end
|
90
83
|
|
91
84
|
it "should instantiate a queue provided with options" do
|
92
85
|
@channel.should_receive(:queue).with(anything, :durable => true)
|
93
|
-
|
86
|
+
BarConsumer.start
|
94
87
|
end
|
95
88
|
|
96
89
|
it "should subscribe to the queue" do
|
97
90
|
@queue.should_receive(:subscribe).with(:ack => true)
|
98
|
-
|
91
|
+
BarConsumer.start
|
99
92
|
end
|
100
93
|
end
|
101
94
|
end
|
@@ -9,7 +9,7 @@ describe AMQP::Boilerplate::Logging do
|
|
9
9
|
describe "#logger" do
|
10
10
|
it "should set the logger to use" do
|
11
11
|
MyLogger = Class.new
|
12
|
-
AMQP::Boilerplate.logger = MyLogger
|
12
|
+
AMQP::Boilerplate.logger = MyLogger
|
13
13
|
AMQP::Boilerplate.logger.should == MyLogger
|
14
14
|
end
|
15
15
|
|
@@ -1,28 +1,6 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
|
4
|
-
extend AMQP::Boilerplate::Producer
|
5
|
-
|
6
|
-
amqp :routing_key => "some.routing.key"
|
7
|
-
amqp_exchange :fanout, "amq.fanout", { :durable => true }
|
8
|
-
amqp_message :message
|
9
|
-
|
10
|
-
def message
|
11
|
-
"hello world!"
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
class FooProducer
|
16
|
-
extend AMQP::Boilerplate::Producer
|
17
|
-
|
18
|
-
amqp :routing_key => "another.routing.key"
|
19
|
-
amqp_message :some_method
|
20
|
-
|
21
|
-
def some_method
|
22
|
-
'Foo Bar'
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
3
|
+
# NOTE See spec_helper for Producer definitions
|
26
4
|
describe AMQP::Boilerplate::Producer do
|
27
5
|
before(:each) do
|
28
6
|
AMQP::Boilerplate.stub(:logger).and_return(mock.as_null_object)
|
@@ -31,7 +9,7 @@ describe AMQP::Boilerplate::Producer do
|
|
31
9
|
@exchange.stub(:publish).and_yield
|
32
10
|
AMQP::Exchange.stub!(:new).and_return(@exchange)
|
33
11
|
|
34
|
-
@producer =
|
12
|
+
@producer = BarProducer.new
|
35
13
|
end
|
36
14
|
|
37
15
|
describe ".amqp_exchange" do
|
@@ -63,11 +41,11 @@ describe AMQP::Boilerplate::Producer do
|
|
63
41
|
end
|
64
42
|
|
65
43
|
it "should pass options to AMQP::Exchange#publish" do
|
66
|
-
|
44
|
+
BarProducer.amqp({ :routing_key => "some.routing.key", :mandatory => true })
|
67
45
|
@exchange.should_receive(:publish).with(@producer.message, :routing_key => "some.routing.key", :mandatory => true)
|
68
46
|
@producer.publish
|
69
47
|
|
70
|
-
|
48
|
+
BarProducer.amqp({ :routing_key => "some.routing.key", :mandatory => true, :immediate => true })
|
71
49
|
@exchange.should_receive(:publish).with(@producer.message, :routing_key => "some.routing.key", :mandatory => true, :immediate => true)
|
72
50
|
@producer.publish
|
73
51
|
end
|
@@ -89,7 +67,7 @@ describe AMQP::Boilerplate::Producer do
|
|
89
67
|
end
|
90
68
|
|
91
69
|
it "should use defaults for exchange configuration" do
|
92
|
-
|
70
|
+
BarProducer.amqp_exchange()
|
93
71
|
|
94
72
|
AMQP::Exchange.should_receive(:new).with(@channel, :direct, AMQ::Protocol::EMPTY_STRING, {})
|
95
73
|
@producer.publish
|
@@ -1,6 +1,62 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe AMQP::Boilerplate do
|
4
|
+
describe ".boot" do
|
5
|
+
before(:each) do
|
6
|
+
AMQP::Boilerplate.stub(:logger).and_return(mock.as_null_object)
|
7
|
+
|
8
|
+
EventMachine.stub(:next_tick).and_yield
|
9
|
+
|
10
|
+
AMQP::Boilerplate.stub(:start_consumers)
|
11
|
+
AMQP::Boilerplate.stub(:load_consumers)
|
12
|
+
end
|
13
|
+
|
14
|
+
it "should load all consumers" do
|
15
|
+
AMQP::Boilerplate.should_receive(:load_consumers)
|
16
|
+
AMQP::Boilerplate.boot
|
17
|
+
end
|
18
|
+
|
19
|
+
it "should start all consumers" do
|
20
|
+
AMQP::Boilerplate.should_receive(:start_consumers)
|
21
|
+
AMQP::Boilerplate.boot
|
22
|
+
end
|
23
|
+
|
24
|
+
it "should connect to AMQP" do
|
25
|
+
AMQP::Boilerplate.should_receive(:start)
|
26
|
+
AMQP::Boilerplate.boot
|
27
|
+
end
|
28
|
+
|
29
|
+
describe "when using passenger" do
|
30
|
+
before(:each) do
|
31
|
+
PhusionPassenger = Class.new
|
32
|
+
PhusionPassenger.stub(:on_event).and_yield(true)
|
33
|
+
|
34
|
+
@thread = mock(Thread, :abort_on_exception= => nil)
|
35
|
+
Thread.stub(:new).and_yield.and_return(@thread)
|
36
|
+
end
|
37
|
+
|
38
|
+
# Don't try this at home!
|
39
|
+
after(:each) do
|
40
|
+
Object.send(:remove_const, "PhusionPassenger")
|
41
|
+
end
|
42
|
+
|
43
|
+
it "should register to starting_worker_process event" do
|
44
|
+
PhusionPassenger.should_receive(:on_event).with(:starting_worker_process)
|
45
|
+
AMQP::Boilerplate.boot
|
46
|
+
end
|
47
|
+
|
48
|
+
it "should start new thread after process forked" do
|
49
|
+
Thread.should_receive(:new)
|
50
|
+
AMQP::Boilerplate.boot
|
51
|
+
end
|
52
|
+
|
53
|
+
it "should abort thread on exception" do
|
54
|
+
@thread.should_receive(:abort_on_exception=).with(true)
|
55
|
+
AMQP::Boilerplate.boot
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
4
60
|
describe ".configure" do
|
5
61
|
after(:each) do
|
6
62
|
AMQP::Boilerplate.logger = nil
|
@@ -11,5 +67,30 @@ describe AMQP::Boilerplate do
|
|
11
67
|
AMQP::Boilerplate.configure { |config| config.logger = MyFunkyLogger }
|
12
68
|
AMQP::Boilerplate.logger.should == MyFunkyLogger
|
13
69
|
end
|
70
|
+
|
71
|
+
it "should let us choose where consumers can be found" do
|
72
|
+
consumer_path = 'app/consumers'
|
73
|
+
AMQP::Boilerplate.configure { |config| config.consumer_paths << consumer_path }
|
74
|
+
AMQP::Boilerplate.consumer_paths.should include(consumer_path)
|
75
|
+
end
|
76
|
+
|
77
|
+
it "should allow us to set connection options" do
|
78
|
+
connection_options = { :host => "localhost", :port => 5672 }
|
79
|
+
AMQP::Boilerplate.configure { |config| config.connection_options = connection_options }
|
80
|
+
AMQP::Boilerplate.connection_options.should == connection_options
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
describe ".start" do
|
85
|
+
it "should start AMQP" do
|
86
|
+
AMQP.should_receive(:start)
|
87
|
+
AMQP::Boilerplate.start
|
88
|
+
end
|
89
|
+
|
90
|
+
it "should use the connection options" do
|
91
|
+
AMQP::Boilerplate.connection_options = { :host => "localhost", :port => 5672 }
|
92
|
+
AMQP.should_receive(:start).with(AMQP::Boilerplate.connection_options)
|
93
|
+
AMQP::Boilerplate.start
|
94
|
+
end
|
14
95
|
end
|
15
96
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -5,3 +5,38 @@ require 'amqp/boilerplate'
|
|
5
5
|
RSpec.configure do |c|
|
6
6
|
c.mock_with :rspec
|
7
7
|
end
|
8
|
+
|
9
|
+
# "Test" consumers
|
10
|
+
class FooConsumer < AMQP::Boilerplate::Consumer
|
11
|
+
amqp_queue
|
12
|
+
end
|
13
|
+
|
14
|
+
class BarConsumer < AMQP::Boilerplate::Consumer
|
15
|
+
amqp_queue "queue.name.here", :durable => true
|
16
|
+
amqp_subscription :ack => true
|
17
|
+
end
|
18
|
+
|
19
|
+
# "Test" producers
|
20
|
+
class FooProducer
|
21
|
+
extend AMQP::Boilerplate::Producer
|
22
|
+
|
23
|
+
amqp :routing_key => "another.routing.key"
|
24
|
+
amqp_message :some_method
|
25
|
+
|
26
|
+
def some_method
|
27
|
+
'Foo Bar'
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
class BarProducer
|
32
|
+
extend AMQP::Boilerplate::Producer
|
33
|
+
|
34
|
+
amqp :routing_key => "some.routing.key"
|
35
|
+
amqp_exchange :fanout, "amq.fanout", { :durable => true }
|
36
|
+
amqp_message :message
|
37
|
+
|
38
|
+
def message
|
39
|
+
"hello world!"
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
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:
|
4
|
+
hash: 27
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 2
|
10
|
+
version: 0.0.2
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Patrick Baselier
|
@@ -16,7 +16,7 @@ autorequire:
|
|
16
16
|
bindir: bin
|
17
17
|
cert_chain: []
|
18
18
|
|
19
|
-
date: 2011-09-
|
19
|
+
date: 2011-09-13 00:00:00 +02:00
|
20
20
|
default_executable:
|
21
21
|
dependencies:
|
22
22
|
- !ruby/object:Gem::Dependency
|
@@ -49,10 +49,25 @@ dependencies:
|
|
49
49
|
version: "2.6"
|
50
50
|
prerelease: false
|
51
51
|
requirement: *id002
|
52
|
+
- !ruby/object:Gem::Dependency
|
53
|
+
name: yard
|
54
|
+
type: :development
|
55
|
+
version_requirements: &id003 !ruby/object:Gem::Requirement
|
56
|
+
none: false
|
57
|
+
requirements:
|
58
|
+
- - ~>
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
hash: 5
|
61
|
+
segments:
|
62
|
+
- 0
|
63
|
+
- 7
|
64
|
+
version: "0.7"
|
65
|
+
prerelease: false
|
66
|
+
requirement: *id003
|
52
67
|
- !ruby/object:Gem::Dependency
|
53
68
|
name: amqp
|
54
69
|
type: :runtime
|
55
|
-
version_requirements: &
|
70
|
+
version_requirements: &id004 !ruby/object:Gem::Requirement
|
56
71
|
none: false
|
57
72
|
requirements:
|
58
73
|
- - ~>
|
@@ -63,7 +78,7 @@ dependencies:
|
|
63
78
|
- 8
|
64
79
|
version: "0.8"
|
65
80
|
prerelease: false
|
66
|
-
requirement: *
|
81
|
+
requirement: *id004
|
67
82
|
description: Collection of modules that aid in setting up AMQP producers and consumers.
|
68
83
|
email:
|
69
84
|
- patrick@kabisa.nl
|
@@ -84,13 +99,16 @@ files:
|
|
84
99
|
- lib/amqp-boilerplate.rb
|
85
100
|
- lib/amqp/boilerplate.rb
|
86
101
|
- lib/amqp/boilerplate/consumer.rb
|
102
|
+
- lib/amqp/boilerplate/consumer_registry.rb
|
87
103
|
- lib/amqp/boilerplate/logging.rb
|
88
104
|
- lib/amqp/boilerplate/producer.rb
|
89
105
|
- lib/amqp/boilerplate/version.rb
|
106
|
+
- spec/amqp/boilerplate/consumer_registry_spec.rb
|
90
107
|
- spec/amqp/boilerplate/consumer_spec.rb
|
91
108
|
- spec/amqp/boilerplate/logging_spec.rb
|
92
109
|
- spec/amqp/boilerplate/producer_spec.rb
|
93
110
|
- spec/amqp/boilerplate_spec.rb
|
111
|
+
- spec/fixtures/consumers/dummy_consumer.rb
|
94
112
|
- spec/spec_helper.rb
|
95
113
|
has_rdoc: true
|
96
114
|
homepage: ""
|
@@ -127,8 +145,10 @@ signing_key:
|
|
127
145
|
specification_version: 3
|
128
146
|
summary: Helper modules for quickly setting up AMQP producers/consumers
|
129
147
|
test_files:
|
148
|
+
- spec/amqp/boilerplate/consumer_registry_spec.rb
|
130
149
|
- spec/amqp/boilerplate/consumer_spec.rb
|
131
150
|
- spec/amqp/boilerplate/logging_spec.rb
|
132
151
|
- spec/amqp/boilerplate/producer_spec.rb
|
133
152
|
- spec/amqp/boilerplate_spec.rb
|
153
|
+
- spec/fixtures/consumers/dummy_consumer.rb
|
134
154
|
- spec/spec_helper.rb
|