bmabey-rosetta_queue 0.2.0 → 0.3.3
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/History.txt +6 -3
- data/README.rdoc +1 -193
- data/Rakefile +7 -1
- data/cucumber.yml +1 -1
- data/examples/sample_amqp_consumer.rb +13 -3
- data/examples/sample_amqp_fanout_consumer.rb +6 -3
- data/examples/sample_amqp_fanout_producer.rb +3 -2
- data/examples/sample_amqp_producer.rb +2 -1
- data/features/filtering.feature +13 -13
- data/features/messaging.feature +28 -20
- data/features/step_definitions/common_messaging_steps.rb +54 -17
- data/features/step_definitions/filtering_steps.rb +2 -2
- data/features/step_definitions/point_to_point_steps.rb +19 -9
- data/features/step_definitions/publish_subscribe_steps.rb +22 -8
- data/features/support/env.rb +2 -0
- data/features/support/sample_consumers.rb +6 -6
- data/lib/rosetta_queue.rb +1 -0
- data/lib/rosetta_queue/adapter.rb +6 -6
- data/lib/rosetta_queue/adapters/amqp.rb +6 -3
- data/lib/rosetta_queue/adapters/amqp_evented.rb +22 -22
- data/lib/rosetta_queue/adapters/amqp_synch.rb +42 -36
- data/lib/rosetta_queue/adapters/base.rb +3 -3
- data/lib/rosetta_queue/adapters/beanstalk.rb +5 -5
- data/lib/rosetta_queue/adapters/fake.rb +5 -5
- data/lib/rosetta_queue/adapters/null.rb +9 -9
- data/lib/rosetta_queue/adapters/stomp.rb +25 -12
- data/lib/rosetta_queue/base.rb +2 -2
- data/lib/rosetta_queue/consumer.rb +4 -4
- data/lib/rosetta_queue/consumer_managers/base.rb +8 -6
- data/lib/rosetta_queue/consumer_managers/evented.rb +5 -5
- data/lib/rosetta_queue/consumer_managers/threaded.rb +4 -4
- data/lib/rosetta_queue/core_ext/string.rb +3 -3
- data/lib/rosetta_queue/core_ext/time.rb +20 -0
- data/lib/rosetta_queue/destinations.rb +6 -6
- data/lib/rosetta_queue/filters.rb +8 -8
- data/lib/rosetta_queue/logger.rb +2 -2
- data/lib/rosetta_queue/message_handler.rb +10 -4
- data/lib/rosetta_queue/producer.rb +2 -2
- data/lib/rosetta_queue/spec_helpers/hash.rb +3 -3
- data/lib/rosetta_queue/spec_helpers/helpers.rb +8 -8
- data/lib/rosetta_queue/spec_helpers/publishing_matchers.rb +26 -26
- data/spec/rosetta_queue/adapter_spec.rb +27 -27
- data/spec/rosetta_queue/adapters/amqp_synchronous_spec.rb +21 -1
- data/spec/rosetta_queue/adapters/beanstalk_spec.rb +3 -3
- data/spec/rosetta_queue/adapters/fake_spec.rb +6 -6
- data/spec/rosetta_queue/adapters/null_spec.rb +5 -5
- data/spec/rosetta_queue/adapters/shared_adapter_behavior.rb +4 -4
- data/spec/rosetta_queue/adapters/shared_fanout_behavior.rb +1 -1
- data/spec/rosetta_queue/adapters/stomp_spec.rb +39 -18
- data/spec/rosetta_queue/consumer_managers/evented_spec.rb +6 -6
- data/spec/rosetta_queue/consumer_managers/shared_manager_behavior.rb +3 -3
- data/spec/rosetta_queue/consumer_managers/threaded_spec.rb +5 -5
- data/spec/rosetta_queue/consumer_spec.rb +13 -13
- data/spec/rosetta_queue/core_ext/string_spec.rb +3 -3
- data/spec/rosetta_queue/destinations_spec.rb +8 -8
- data/spec/rosetta_queue/filters_spec.rb +16 -16
- data/spec/rosetta_queue/producer_spec.rb +15 -15
- data/spec/rosetta_queue/shared_messaging_behavior.rb +6 -6
- metadata +3 -2
@@ -1,3 +1,44 @@
|
|
1
|
+
def eval_consumer_class(queue, log_file="point-to-point.log", klass_name=nil)
|
2
|
+
klass_name = "#{queue.to_s.capitalize}Consumer" if klass_name.nil?
|
3
|
+
return if Object.const_defined?(klass_name)
|
4
|
+
options = {}
|
5
|
+
unless @adapter_type == "stomp"
|
6
|
+
options = ":ack => true"
|
7
|
+
else
|
8
|
+
options = ":ack => 'client'"
|
9
|
+
end
|
10
|
+
|
11
|
+
str = <<-EOC
|
12
|
+
class #{klass_name}
|
13
|
+
include RosettaQueue::MessageHandler
|
14
|
+
subscribes_to :#{queue}
|
15
|
+
options #{options}
|
16
|
+
|
17
|
+
def on_message(msg)
|
18
|
+
begin
|
19
|
+
file_path = "#{CONSUMER_LOG_DIR}/#{log_file}"
|
20
|
+
File.open(file_path, "w+") do |f|
|
21
|
+
f << msg + " from #{klass_name}"
|
22
|
+
end
|
23
|
+
rescue Exception => e
|
24
|
+
puts e.message
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
EOC
|
29
|
+
|
30
|
+
eval(str)
|
31
|
+
Object.const_get(klass_name)
|
32
|
+
end
|
33
|
+
|
34
|
+
Given /^consumer logs have been cleared$/ do
|
35
|
+
%w[point-to-point pub-sub fooconsumer barconsumer].each do |file_name|
|
36
|
+
file_path = "#{CONSUMER_LOG_DIR}/#{file_name}.log"
|
37
|
+
File.delete(file_path) if File.exists?(file_path)
|
38
|
+
File.open(file_path, "a+")
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
1
42
|
Given /^RosettaQueue is configured for '(\w+)'$/ do |adapter_type|
|
2
43
|
@adapter_type = adapter_type
|
3
44
|
RosettaQueue::Adapter.define do |a|
|
@@ -16,30 +57,26 @@ Given /^RosettaQueue is configured for '(\w+)'$/ do |adapter_type|
|
|
16
57
|
end
|
17
58
|
end
|
18
59
|
|
19
|
-
Given /^a
|
60
|
+
Given /^a destination is set with queue '(.*)' and queue address '(.*)'$/ do |key, queue|
|
20
61
|
RosettaQueue::Destinations.define do |dest|
|
21
|
-
dest.map
|
22
|
-
end
|
62
|
+
dest.map key.to_sym, queue
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
Given /^the message '(.+)' is published to queue '(.+)'$/ do |message, queue_name|
|
67
|
+
publish_message(message, {:to => queue_name})
|
23
68
|
end
|
24
69
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
RosettaQueue::Destinations.define do |dest|
|
29
|
-
dest.map :foobar, "/fanout/foobar"
|
30
|
-
end
|
31
|
-
when /topic/
|
32
|
-
RosettaQueue::Destinations.define do |dest|
|
33
|
-
dest.map :foobar, "/topic/foobar"
|
34
|
-
end
|
35
|
-
end
|
70
|
+
When /^a message is published to '(\w+)'$/ do |q|
|
71
|
+
RosettaQueue::Producer.publish(q.to_sym, "Hello World!")
|
72
|
+
# publish_message("Hello World!", {:options => {:to => q}})
|
36
73
|
end
|
37
74
|
|
38
75
|
When /^the queue '(.*)' is deleted$/ do |queue|
|
39
|
-
system("rabbitmqctl list_queues | grep
|
76
|
+
system("rabbitmqctl list_queues | grep #{queue}").should be_true
|
40
77
|
RosettaQueue::Consumer.delete(queue.to_sym)
|
41
78
|
end
|
42
79
|
|
43
|
-
Then /^the queue '
|
44
|
-
system("rabbitmqctl list_queues | grep
|
80
|
+
Then /^the queue '(.*)' should no longer exist$/ do |queue|
|
81
|
+
system("rabbitmqctl list_queues | grep #{queue}").should be_false
|
45
82
|
end
|
@@ -5,9 +5,9 @@ Then /^a (receiving|sending) filter is defined to prepend 'Foo' to all messages$
|
|
5
5
|
end
|
6
6
|
end
|
7
7
|
|
8
|
-
When /^the message on
|
8
|
+
When /^the message on '(.+)' is consumed$/ do |queue_name|
|
9
9
|
# TODO
|
10
|
-
# @consumed_message = queue(:foo_queue).pop
|
10
|
+
# @consumed_message = queue(:foo_queue).pop
|
11
11
|
@consumed_message = consume_once(queue_name.to_sym)
|
12
12
|
end
|
13
13
|
|
@@ -1,12 +1,22 @@
|
|
1
|
-
Given /^
|
2
|
-
|
1
|
+
Given /^a consumer is listening to queue '(.*)'$/ do |queue|
|
2
|
+
klass = eval_consumer_class(queue)
|
3
|
+
@thread = Thread.new do
|
4
|
+
cons = klass.new
|
5
|
+
case @adapter_type
|
6
|
+
when /evented/
|
7
|
+
EM.run do
|
8
|
+
RosettaQueue::Consumer.new(cons).receive
|
9
|
+
end
|
10
|
+
else
|
11
|
+
RosettaQueue::Consumer.new(cons).receive
|
12
|
+
end
|
13
|
+
end
|
3
14
|
end
|
4
15
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
# consume_once_with(SampleConsumer).should =~ /Hello World!/
|
16
|
+
Then /^the message should be consumed from '(.*)'$/ do |queue|
|
17
|
+
sleep 1
|
18
|
+
file_path = "#{CONSUMER_LOG_DIR}/point-to-point.log"
|
19
|
+
# sleep 1 unless File.exists?(file_path)
|
20
|
+
File.readlines(file_path).last.should =~ /Hello World! from #{queue.capitalize}Consumer/
|
21
|
+
@thread.kill
|
12
22
|
end
|
@@ -1,11 +1,25 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
1
|
+
Given /^multiple consumers are listening to queue '(.*)'$/ do |queue|
|
2
|
+
@managers = []
|
3
|
+
Thread.new do
|
4
|
+
@managers << RosettaQueue::ThreadedManager.create do |m|
|
5
|
+
m.add(eval_consumer_class(queue, "fooconsumer.log", "FooConsumer").new)
|
6
|
+
m.start
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
Thread.new do
|
11
|
+
@managers << RosettaQueue::ThreadedManager.create do |m|
|
12
|
+
m.add(eval_consumer_class(queue, "barconsumer.log", "BarConsumer").new)
|
13
|
+
m.start
|
14
|
+
end
|
15
|
+
end
|
16
|
+
sleep 5
|
4
17
|
end
|
5
18
|
|
6
|
-
Then /^multiple messages should be consumed from
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
19
|
+
Then /^multiple messages should be consumed from '(\w+)'$/ do |queue|
|
20
|
+
["FooConsumer", "BarConsumer"].each do |class_name, value|
|
21
|
+
file_path = "#{CONSUMER_LOG_DIR}/#{class_name.downcase}.log"
|
22
|
+
File.readlines(file_path).last.should =~ /Hello World! from #{class_name}/
|
23
|
+
end
|
24
|
+
@managers.each {|m| m.stop_threads }
|
11
25
|
end
|
data/features/support/env.rb
CHANGED
@@ -5,6 +5,8 @@ require 'rosetta_queue/spec_helpers'
|
|
5
5
|
require 'spec/expectations'
|
6
6
|
require 'rosetta_queue/spec_helpers'
|
7
7
|
|
8
|
+
CONSUMER_LOG_DIR = File.expand_path(File.dirname(__FILE__) + "/../support/tmp")
|
9
|
+
|
8
10
|
begin
|
9
11
|
RosettaQueue.logger = RosettaQueue::Logger.new(File.join(File.dirname(__FILE__), '../../../log', 'rosetta_queue.log'))
|
10
12
|
rescue Errno::ENOENT
|
@@ -4,14 +4,14 @@ class SampleConsumer
|
|
4
4
|
include ::RosettaQueue::MessageHandler
|
5
5
|
subscribes_to :foo
|
6
6
|
options :durable => true
|
7
|
-
|
7
|
+
|
8
8
|
attr_reader :msg
|
9
|
-
|
9
|
+
|
10
10
|
def on_message(msg)
|
11
11
|
@msg = msg
|
12
12
|
puts "MESSAGE #{msg}"
|
13
13
|
end
|
14
|
-
|
14
|
+
|
15
15
|
end
|
16
16
|
|
17
17
|
|
@@ -19,11 +19,11 @@ class SampleConsumerTwo
|
|
19
19
|
include ::RosettaQueue::MessageHandler
|
20
20
|
subscribes_to :foo
|
21
21
|
options :durable => true
|
22
|
-
|
22
|
+
|
23
23
|
attr_reader :msg
|
24
|
-
|
24
|
+
|
25
25
|
def on_message(msg)
|
26
26
|
@msg = msg
|
27
27
|
end
|
28
|
-
|
28
|
+
|
29
29
|
end
|
data/lib/rosetta_queue.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
$LOAD_PATH.unshift(File.expand_path(File.dirname(__FILE__))) unless $LOAD_PATH.include?(File.expand_path(File.dirname(__FILE__)))
|
2
2
|
|
3
3
|
require('rosetta_queue/core_ext/string') unless defined? ActiveSupport
|
4
|
+
require('rosetta_queue/core_ext/time') unless defined? ActiveSupport
|
4
5
|
|
5
6
|
require 'rosetta_queue/adapter'
|
6
7
|
require 'rosetta_queue/base'
|
@@ -5,15 +5,15 @@ module RosettaQueue
|
|
5
5
|
|
6
6
|
class << self
|
7
7
|
attr_writer :user, :password, :host, :port, :options
|
8
|
-
|
8
|
+
|
9
9
|
def define
|
10
10
|
yield self
|
11
11
|
end
|
12
|
-
|
12
|
+
|
13
13
|
def reset
|
14
14
|
@user, @password, @host, @port, @options, @adapter_class = nil, nil, nil, nil, nil, nil
|
15
15
|
end
|
16
|
-
|
16
|
+
|
17
17
|
def type=(adapter_prefix)
|
18
18
|
require "rosetta_queue/adapters/#{adapter_prefix}"
|
19
19
|
@adapter_class = RosettaQueue::Gateway.const_get("#{adapter_prefix.to_s.classify}Adapter")
|
@@ -28,12 +28,12 @@ module RosettaQueue
|
|
28
28
|
end
|
29
29
|
|
30
30
|
private
|
31
|
-
|
31
|
+
|
32
32
|
def opts
|
33
33
|
raise AdapterException, "Adapter options should be a hash" unless @options.nil? || @options.is_a?(Hash)
|
34
34
|
@options ||= {}
|
35
35
|
end
|
36
|
-
|
36
|
+
|
37
37
|
end
|
38
|
-
end
|
38
|
+
end
|
39
39
|
end
|
@@ -7,7 +7,7 @@ module RosettaQueue
|
|
7
7
|
raise AdapterException, "Unable to discover fanout exchange. Cannot bind queue to exchange!" unless fanout_name
|
8
8
|
fanout_name
|
9
9
|
end
|
10
|
-
end
|
10
|
+
end
|
11
11
|
|
12
12
|
class Amqp < BaseAdapter
|
13
13
|
|
@@ -18,9 +18,12 @@ module RosettaQueue
|
|
18
18
|
|
19
19
|
def delete(destination, opts={})
|
20
20
|
exchange_strategy_for(destination, opts).delete(destination)
|
21
|
-
end
|
21
|
+
end
|
22
22
|
|
23
|
-
def disconnect(message_handler)
|
23
|
+
def disconnect(message_handler)
|
24
|
+
destination = destination_for(message_handler)
|
25
|
+
exchange_strategy_for(destination).unsubscribe
|
26
|
+
end
|
24
27
|
|
25
28
|
def receive_once(destination, opts={})
|
26
29
|
exchange_strategy_for(destination, opts).receive_once(destination) do |msg|
|
@@ -4,7 +4,7 @@ require File.expand_path(File.dirname(__FILE__) + "/amqp.rb")
|
|
4
4
|
|
5
5
|
module RosettaQueue
|
6
6
|
module Gateway
|
7
|
-
|
7
|
+
|
8
8
|
class AmqpEventedAdapter < Amqp
|
9
9
|
private
|
10
10
|
|
@@ -21,35 +21,35 @@ module RosettaQueue
|
|
21
21
|
end
|
22
22
|
end
|
23
23
|
end
|
24
|
-
|
24
|
+
|
25
25
|
module EventedExchange
|
26
26
|
|
27
27
|
class BaseExchange
|
28
|
-
|
28
|
+
|
29
29
|
def initialize(adapter_settings, options={})
|
30
30
|
@adapter_settings, @options = adapter_settings, options
|
31
31
|
end
|
32
32
|
|
33
33
|
def delete(destination)
|
34
34
|
conn.queue(destination).delete(@options)
|
35
|
-
end
|
35
|
+
end
|
36
36
|
|
37
37
|
protected
|
38
|
-
|
38
|
+
|
39
39
|
def channel
|
40
40
|
@channel ||= MQ.new(conn)
|
41
41
|
end
|
42
|
-
|
42
|
+
|
43
43
|
def conn
|
44
|
-
vhost = @adapter_settings[:opts][:vhost] || "/"
|
45
|
-
@conn ||= AMQP.connect(:user => @adapter_settings[:user],
|
46
|
-
:pass => @adapter_settings[:password],
|
47
|
-
:host => @adapter_settings[:host],
|
44
|
+
vhost = @adapter_settings[:opts][:vhost] || "/"
|
45
|
+
@conn ||= AMQP.connect(:user => @adapter_settings[:user],
|
46
|
+
:pass => @adapter_settings[:password],
|
47
|
+
:host => @adapter_settings[:host],
|
48
48
|
:vhost => vhost)
|
49
49
|
end
|
50
50
|
end
|
51
|
-
|
52
|
-
|
51
|
+
|
52
|
+
|
53
53
|
class DirectExchange < BaseExchange
|
54
54
|
|
55
55
|
def publish(destination, message, options={})
|
@@ -60,7 +60,7 @@ module RosettaQueue
|
|
60
60
|
RosettaQueue.logger.info("Publishing to #{destination} :: #{message}")
|
61
61
|
queue.unsubscribe
|
62
62
|
end
|
63
|
-
|
63
|
+
|
64
64
|
def receive(destination, message_handler)
|
65
65
|
raise AdapterException, "Consumers need to run in an EventMachine 'run' block. Try wrapping them inside the evented consumer manager." unless EM.reactor_running?
|
66
66
|
|
@@ -75,7 +75,7 @@ module RosettaQueue
|
|
75
75
|
|
76
76
|
def receive_once(destination, options={})
|
77
77
|
raise AdapterException, "Consumers need to run in an EventMachine 'run' block. (e.g., EM.run { RosettaQueue::Consumer.receive }" unless EM.reactor_running?
|
78
|
-
|
78
|
+
|
79
79
|
queue = channel.queue(destination, @options)
|
80
80
|
ack = @options[:ack]
|
81
81
|
queue.pop(@options) do |header, msg|
|
@@ -85,8 +85,8 @@ module RosettaQueue
|
|
85
85
|
end
|
86
86
|
end
|
87
87
|
end
|
88
|
-
|
89
|
-
|
88
|
+
|
89
|
+
|
90
90
|
class FanoutExchange < BaseExchange
|
91
91
|
include Fanout
|
92
92
|
|
@@ -97,36 +97,36 @@ module RosettaQueue
|
|
97
97
|
exchange.publish(msg, opts)
|
98
98
|
RosettaQueue.logger.info("Publishing to fanout #{dest} :: #{msg}")
|
99
99
|
end
|
100
|
-
|
100
|
+
|
101
101
|
def receive(destination, message_handler)
|
102
102
|
raise AdapterException, "Consumers need to run in an EventMachine 'run' block. Try wrapping them inside the evented consumer manager." unless EM.reactor_running?
|
103
103
|
|
104
104
|
queue = channel.queue("queue_#{self.object_id}")
|
105
105
|
exchange = channel.fanout(fanout_name_for(destination), @options)
|
106
106
|
ack = @options[:ack]
|
107
|
-
|
107
|
+
|
108
108
|
queue.bind(exchange).subscribe(@options) do |header, msg|
|
109
109
|
RosettaQueue.logger.info("Receiving from #{destination} :: #{msg}")
|
110
110
|
message_handler.on_message(Filters.process_receiving(msg))
|
111
111
|
header.ack if ack
|
112
112
|
end
|
113
113
|
end
|
114
|
-
|
114
|
+
|
115
115
|
def receive_once(destination, opts={})
|
116
116
|
raise AdapterException, "Consumers need to run in an EventMachine 'run' block. (e.g., EM.run { RosettaQueue::Consumer.receive }" unless EM.reactor_running?
|
117
117
|
|
118
118
|
queue = channel.queue("queue_#{self.object_id}")
|
119
119
|
exchange = channel.fanout(fanout_name_for(destination), opts)
|
120
120
|
ack = @options[:ack]
|
121
|
-
|
121
|
+
|
122
122
|
queue.bind(exchange).pop(opts) do |header, msg|
|
123
123
|
RosettaQueue.logger.info("Receiving from #{destination} :: #{msg}")
|
124
124
|
header.ack if ack
|
125
125
|
yield Filters.process_receiving(msg)
|
126
126
|
end
|
127
127
|
end
|
128
|
-
|
128
|
+
|
129
129
|
end
|
130
130
|
end
|
131
|
-
end
|
131
|
+
end
|
132
132
|
end
|
@@ -9,7 +9,7 @@ module RosettaQueue
|
|
9
9
|
class AmqpSynchAdapter < Amqp
|
10
10
|
private
|
11
11
|
|
12
|
-
def exchange_strategy_for(destination, options)
|
12
|
+
def exchange_strategy_for(destination, options={})
|
13
13
|
case destination
|
14
14
|
when /^fanout\./
|
15
15
|
@exchange ||= SynchExchange::FanoutExchange.new(@adapter_settings, options)
|
@@ -21,7 +21,7 @@ module RosettaQueue
|
|
21
21
|
@exchange ||= SynchExchange::DirectExchange.new(@adapter_settings, options)
|
22
22
|
end
|
23
23
|
end
|
24
|
-
end
|
24
|
+
end
|
25
25
|
|
26
26
|
module SynchExchange
|
27
27
|
|
@@ -31,21 +31,27 @@ module RosettaQueue
|
|
31
31
|
@adapter_settings, @options = adapter_settings, options
|
32
32
|
end
|
33
33
|
|
34
|
-
def delete(destination)
|
35
|
-
conn.queue(destination).delete(
|
36
|
-
end
|
34
|
+
def delete(destination, options={})
|
35
|
+
conn.queue(destination).delete(options)
|
36
|
+
end
|
37
|
+
|
38
|
+
def unsubscribe
|
39
|
+
@queue.unsubscribe
|
40
|
+
conn.stop
|
41
|
+
end
|
37
42
|
|
38
43
|
protected
|
39
44
|
|
40
45
|
def conn
|
41
|
-
vhost = @adapter_settings[:opts][:vhost] || "/"
|
42
|
-
@conn ||= Bunny.new( :user => @adapter_settings[:user],
|
43
|
-
:pass => @adapter_settings[:password],
|
44
|
-
:host => @adapter_settings[:host],
|
46
|
+
vhost = @adapter_settings[:opts][:vhost] || "/"
|
47
|
+
@conn ||= Bunny.new( :user => @adapter_settings[:user],
|
48
|
+
:pass => @adapter_settings[:password],
|
49
|
+
:host => @adapter_settings[:host],
|
45
50
|
:vhost => vhost)
|
46
51
|
@conn.start unless @conn.status == :connected
|
47
52
|
@conn
|
48
53
|
end
|
54
|
+
|
49
55
|
end
|
50
56
|
|
51
57
|
class DirectExchange < BaseExchange
|
@@ -54,25 +60,25 @@ module RosettaQueue
|
|
54
60
|
RosettaQueue.logger.info("Publishing to #{destination} :: #{message}")
|
55
61
|
queue = conn.queue(destination, options)
|
56
62
|
queue.publish(message, options)
|
57
|
-
|
58
|
-
end
|
63
|
+
conn.stop
|
64
|
+
end
|
59
65
|
|
60
66
|
def receive(destination, message_handler)
|
61
|
-
queue = conn.queue(destination, @options)
|
62
67
|
ack = @options[:ack]
|
63
|
-
queue.
|
68
|
+
@queue = conn.queue(destination, @options)
|
69
|
+
@queue.subscribe(@options) do |msg|
|
64
70
|
RosettaQueue.logger.info("Receiving from #{destination} :: #{msg}")
|
65
71
|
message_handler.on_message(Filters.process_receiving(msg))
|
66
|
-
queue.ack if ack
|
67
|
-
end
|
72
|
+
@queue.ack if ack
|
73
|
+
end
|
68
74
|
end
|
69
75
|
|
70
|
-
def receive_once(destination)
|
71
|
-
|
72
|
-
|
73
|
-
msg = queue.pop(
|
76
|
+
def receive_once(destination, options = {})
|
77
|
+
ack = options[:ack]
|
78
|
+
@queue = conn.queue(destination, options)
|
79
|
+
msg = @queue.pop(options)
|
74
80
|
RosettaQueue.logger.info("Receiving from #{destination} :: #{msg}")
|
75
|
-
queue.ack if ack
|
81
|
+
@queue.ack if ack
|
76
82
|
yield Filters.process_receiving(msg)
|
77
83
|
end
|
78
84
|
|
@@ -80,38 +86,38 @@ module RosettaQueue
|
|
80
86
|
|
81
87
|
class FanoutExchange < BaseExchange
|
82
88
|
include Fanout
|
83
|
-
|
89
|
+
|
84
90
|
def publish(destination, message, options={})
|
85
91
|
exchange = conn.exchange(fanout_name_for(destination), options.merge({:type => :fanout}))
|
86
92
|
exchange.publish(message, options)
|
87
93
|
RosettaQueue.logger.info("Publishing to fanout #{destination} :: #{message}")
|
88
|
-
end
|
94
|
+
end
|
89
95
|
|
90
96
|
def receive(destination, message_handler)
|
91
|
-
queue = conn.queue("queue_#{self.object_id}", @options)
|
92
|
-
exchange = conn.exchange(fanout_name_for(destination), @options.merge({:type => :fanout}))
|
93
|
-
queue.bind(exchange)
|
94
97
|
ack = @options[:ack]
|
95
|
-
|
96
|
-
|
98
|
+
@queue = conn.queue("queue_#{self.object_id}", @options)
|
99
|
+
exchange = conn.exchange(fanout_name_for(destination), @options.merge({:type => :fanout}))
|
100
|
+
@queue.bind(exchange)
|
101
|
+
@queue.subscribe(@options) do |msg|
|
97
102
|
RosettaQueue.logger.info("Receiving from #{destination} :: #{msg}")
|
98
103
|
message_handler.on_message(Filters.process_receiving(msg))
|
99
|
-
queue.ack if ack
|
100
|
-
end
|
104
|
+
@queue.ack if ack
|
105
|
+
end
|
101
106
|
end
|
102
107
|
|
103
108
|
def receive_once(destination, options={})
|
104
|
-
|
109
|
+
ack = options[:ack]
|
110
|
+
@queue = conn.queue("queue_#{self.object_id}", options)
|
105
111
|
exchange = conn.exchange(fanout_name_for(destination), options.merge({:type => :fanout}))
|
106
|
-
queue.bind(exchange)
|
107
|
-
|
108
|
-
msg = queue.pop(@options)
|
112
|
+
@queue.bind(exchange)
|
113
|
+
msg = @queue.pop(options)
|
109
114
|
RosettaQueue.logger.info("Receiving from #{destination} :: #{msg}")
|
110
|
-
queue.ack if ack
|
115
|
+
@queue.ack if ack
|
111
116
|
yield Filters.process_receiving(msg)
|
112
117
|
end
|
113
118
|
|
114
|
-
end
|
115
|
-
|
119
|
+
end
|
120
|
+
|
121
|
+
end
|
116
122
|
end
|
117
123
|
end
|