bmabey-rosetta_queue 0.2.0 → 0.3.3
Sign up to get free protection for your applications and to get access to all the features.
- 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
|