right_amqp 0.7.0 → 0.8.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/lib/right_amqp/amqp/client.rb +11 -4
- data/lib/right_amqp/amqp/spec.rb +7 -7
- data/lib/right_amqp/ha_client/broker_client.rb +16 -22
- data/lib/right_amqp/ha_client/ha_broker_client.rb +24 -17
- data/right_amqp.gemspec +2 -2
- data/spec/amqp/spec_spec.rb +52 -0
- data/spec/ha_client/broker_client_spec.rb +22 -11
- data/spec/ha_client/ha_broker_client_spec.rb +19 -1
- metadata +8 -7
@@ -56,7 +56,7 @@ module AMQP
|
|
56
56
|
# The 'connected' status callback happens before the handshake is done and if it results in
|
57
57
|
# a lot of activity it might prevent EM from being able to call the code handling the
|
58
58
|
# incoming handshake packet in a timely fashion causing the broker to close the connection
|
59
|
-
@connection_status.call(:ready) if @connection_status && frame.payload.is_a?(AMQP::Protocol::Connection::
|
59
|
+
@connection_status.call(:ready) if @connection_status && frame.payload.is_a?(AMQP::Protocol::Connection::OpenOk)
|
60
60
|
end
|
61
61
|
end
|
62
62
|
|
@@ -99,6 +99,7 @@ module AMQP
|
|
99
99
|
end
|
100
100
|
|
101
101
|
@connected = true
|
102
|
+
logger.debug("[amqp] Connected to broker #{@settings[:identity]}")
|
102
103
|
@connection_status.call(:connected) if @connection_status
|
103
104
|
|
104
105
|
@buf = Buffer.new
|
@@ -130,8 +131,13 @@ module AMQP
|
|
130
131
|
begin
|
131
132
|
if connected?
|
132
133
|
now = Time.now
|
133
|
-
if @last_data_received
|
134
|
-
|
134
|
+
if @last_data_received.nil?
|
135
|
+
# This is something of an anomaly; not clear how this condition is reached
|
136
|
+
logger.info("[amqp] Reconnecting to broker #{@settings[:identity]} due to heartbeat timeout " +
|
137
|
+
"with no data having been received")
|
138
|
+
close_connection # which results in an unbind and an automatic reconnect
|
139
|
+
elsif @last_data_received < (now - (@settings[:heartbeat] * timeout_factor))
|
140
|
+
data_received = (now - @last_data_received).to_i
|
135
141
|
heartbeat_received = (now - @last_heartbeat_received).to_i if @last_heartbeat_received
|
136
142
|
heartbeat_sent = (now - @last_heartbeat_sent).to_i if @last_heartbeat_sent
|
137
143
|
logger.info("[amqp] Reconnecting to broker #{@settings[:identity]} due to heartbeat timeout: " +
|
@@ -164,6 +170,7 @@ module AMQP
|
|
164
170
|
def unbind
|
165
171
|
log 'disconnected'
|
166
172
|
@connected = false
|
173
|
+
logger.debug("[amqp] Disconnected from broker #{@settings[:identity]}")
|
167
174
|
EM.next_tick{ @on_disconnect.call }
|
168
175
|
end
|
169
176
|
|
@@ -273,7 +280,7 @@ module AMQP
|
|
273
280
|
end
|
274
281
|
|
275
282
|
log 'reconnecting'
|
276
|
-
logger.info("[amqp] Attempting to reconnect to #{@settings[:identity]}")
|
283
|
+
logger.info("[amqp] Attempting to reconnect to broker #{@settings[:identity]}")
|
277
284
|
EM.reconnect(@settings[:host], @settings[:port], self)
|
278
285
|
rescue Exception => e
|
279
286
|
logger.exception("[amqp] Failed to reconnect", e, :trace)
|
data/lib/right_amqp/amqp/spec.rb
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
|
2
2
|
#:stopdoc:
|
3
|
-
# this file was autogenerated on
|
4
|
-
# using amqp-0.8.json (mtime:
|
3
|
+
# this file was autogenerated on 2014-02-19 18:35:45 -0500
|
4
|
+
# using amqp-0.8.json (mtime: 2013-11-07 17:14:52 -0500)
|
5
5
|
#
|
6
|
-
# DO NOT EDIT! (edit protocol/codegen.rb instead, and run `rake codegen`)
|
6
|
+
# DO NOT EDIT! (edit protocol/codegen.rb instead, and run `rake spec:codegen`)
|
7
7
|
|
8
8
|
module AMQP
|
9
9
|
HEADER = "AMQP".freeze
|
@@ -79,8 +79,8 @@ module AMQP
|
|
79
79
|
|
80
80
|
def properties() @properties ||= [] end
|
81
81
|
|
82
|
-
def id() self::ID end
|
83
|
-
def name() self::NAME end
|
82
|
+
def id() defined?(self::ID) ? self::ID : nil end
|
83
|
+
def name() defined?(self::NAME) ? self::NAME : super end
|
84
84
|
end
|
85
85
|
|
86
86
|
class Method
|
@@ -97,8 +97,8 @@ module AMQP
|
|
97
97
|
def arguments() @arguments ||= [] end
|
98
98
|
|
99
99
|
def section() Protocol.const_get(self.to_s[/Protocol::(.+?)::/,1]) end
|
100
|
-
def id()
|
101
|
-
def name()
|
100
|
+
def id() defined?(self::ID) ? self::ID : nil end
|
101
|
+
def name() defined?(self::NAME) ? self::NAME : super end
|
102
102
|
end
|
103
103
|
|
104
104
|
def == b
|
@@ -264,10 +264,7 @@ module RightAMQP
|
|
264
264
|
else
|
265
265
|
receive(queue[:name], header, message, options, &block)
|
266
266
|
end
|
267
|
-
rescue
|
268
|
-
# Do not want to track exit exception that could occur during serialization
|
269
|
-
raise
|
270
|
-
rescue Exception => e
|
267
|
+
rescue StandardError => e
|
271
268
|
header.ack if options[:ack]
|
272
269
|
logger.exception("Failed setting up to receive message from queue #{queue.inspect} " +
|
273
270
|
"on broker #{@alias}", e, :trace)
|
@@ -275,7 +272,7 @@ module RightAMQP
|
|
275
272
|
@non_delivery_stats.update("receive failure")
|
276
273
|
end
|
277
274
|
end
|
278
|
-
rescue
|
275
|
+
rescue StandardError => e
|
279
276
|
logger.exception("Failed subscribing queue #{queue.inspect}#{to_exchange} on broker #{@alias}", e, :trace)
|
280
277
|
@exception_stats.track("subscribe", e)
|
281
278
|
false
|
@@ -294,17 +291,20 @@ module RightAMQP
|
|
294
291
|
# === Return
|
295
292
|
# true:: Always return true
|
296
293
|
def unsubscribe(queue_names, &block)
|
297
|
-
|
298
|
-
@queues.
|
294
|
+
unless failed?
|
295
|
+
@queues.reject! do |q|
|
299
296
|
if queue_names.include?(q.name)
|
300
297
|
begin
|
301
298
|
logger.info("[stop] Unsubscribing queue #{q.name} on broker #{@alias}")
|
302
299
|
q.unsubscribe { block.call if block }
|
303
|
-
rescue
|
300
|
+
rescue StandardError => e
|
304
301
|
logger.exception("Failed unsubscribing queue #{q.name} on broker #{@alias}", e, :trace)
|
305
302
|
@exception_stats.track("unsubscribe", e)
|
306
303
|
block.call if block
|
307
304
|
end
|
305
|
+
true
|
306
|
+
else
|
307
|
+
false
|
308
308
|
end
|
309
309
|
end
|
310
310
|
end
|
@@ -327,7 +327,7 @@ module RightAMQP
|
|
327
327
|
delete_amqp_resources(:queue, name)
|
328
328
|
@channel.__send__(type, name, options)
|
329
329
|
true
|
330
|
-
rescue
|
330
|
+
rescue StandardError => e
|
331
331
|
logger.exception("Failed declaring #{type.to_s} #{name} on broker #{@alias}", e, :trace)
|
332
332
|
@exception_stats.track("declare", e)
|
333
333
|
false
|
@@ -356,7 +356,7 @@ module RightAMQP
|
|
356
356
|
if queue_names.include?(q.name)
|
357
357
|
begin
|
358
358
|
q.status { |messages, consumers| block.call(q.name, messages, consumers) if block }
|
359
|
-
rescue
|
359
|
+
rescue StandardError => e
|
360
360
|
logger.exception("Failed checking status of queue #{q.name} on broker #{@alias}", e, :trace)
|
361
361
|
@exception_stats.track("queue_status", e)
|
362
362
|
block.call(q.name, nil, nil) if block
|
@@ -409,7 +409,7 @@ module RightAMQP
|
|
409
409
|
delete_amqp_resources(exchange[:type], exchange[:name]) if exchange_options[:declare]
|
410
410
|
@channel.__send__(exchange[:type], exchange[:name], exchange_options).publish(message, options)
|
411
411
|
true
|
412
|
-
rescue
|
412
|
+
rescue StandardError => e
|
413
413
|
logger.exception("Failed publishing to exchange #{exchange.inspect} on broker #{@alias}", e, :trace)
|
414
414
|
@exception_stats.track("publish", e)
|
415
415
|
@non_delivery_stats.update("publish failure")
|
@@ -441,7 +441,7 @@ module RightAMQP
|
|
441
441
|
@channel.queue(name, options).delete
|
442
442
|
deleted = true
|
443
443
|
end
|
444
|
-
rescue
|
444
|
+
rescue StandardError => e
|
445
445
|
logger.exception("Failed deleting queue #{name.inspect} on broker #{@alias}", e, :trace)
|
446
446
|
@exception_stats.track("delete", e)
|
447
447
|
end
|
@@ -484,7 +484,7 @@ module RightAMQP
|
|
484
484
|
@status = final_status
|
485
485
|
yield if block_given?
|
486
486
|
end
|
487
|
-
rescue
|
487
|
+
rescue StandardError => e
|
488
488
|
logger.exception("Failed to close broker #{@alias}", e, :trace)
|
489
489
|
@exception_stats.track("close", e)
|
490
490
|
@status = final_status
|
@@ -610,7 +610,7 @@ module RightAMQP
|
|
610
610
|
@channel.__send__(:connection).connection_status { |status| update_status(status) }
|
611
611
|
@channel.prefetch(@options[:prefetch]) if @options[:prefetch]
|
612
612
|
@channel.return_message { |header, message| handle_return(header, message) }
|
613
|
-
rescue
|
613
|
+
rescue StandardError => e
|
614
614
|
@status = :failed
|
615
615
|
@failure_stats.update
|
616
616
|
logger.exception("Failed connecting to broker #{@alias}", e, :trace)
|
@@ -656,10 +656,7 @@ module RightAMQP
|
|
656
656
|
header.ack
|
657
657
|
end
|
658
658
|
true
|
659
|
-
rescue
|
660
|
-
# Do not want to track exit exception that could occur during serialization
|
661
|
-
raise
|
662
|
-
rescue Exception => e
|
659
|
+
rescue StandardError => e
|
663
660
|
header.ack if options[:ack]
|
664
661
|
logger.exception("Failed receiving message from queue #{queue.inspect} on broker #{@alias}", e, :trace)
|
665
662
|
@exception_stats.track("receive", e)
|
@@ -698,10 +695,7 @@ module RightAMQP
|
|
698
695
|
logger.error("Received invalid #{category}packet type from queue #{queue} on broker #{@alias}: #{packet.class}\n" + caller.join("\n"))
|
699
696
|
nil
|
700
697
|
end
|
701
|
-
rescue
|
702
|
-
# Do not want to track exit exception that could occur during serialization
|
703
|
-
raise
|
704
|
-
rescue Exception => e
|
698
|
+
rescue StandardError => e
|
705
699
|
# TODO Taking advantage of Serializer knowledge here even though out of scope
|
706
700
|
trace = e.class.name =~ /SerializationError/ ? :caller : :trace
|
707
701
|
logger.exception("Failed unserializing message from queue #{queue.inspect} on broker #{@alias}", e, trace)
|
@@ -28,9 +28,9 @@ module RightAMQP
|
|
28
28
|
|
29
29
|
include RightSupport::Log::Mixin
|
30
30
|
|
31
|
-
class NoUserData <
|
32
|
-
class NoBrokerHosts <
|
33
|
-
class NoConnectedBrokers <
|
31
|
+
class NoUserData < StandardError; end
|
32
|
+
class NoBrokerHosts < StandardError; end
|
33
|
+
class NoConnectedBrokers < StandardError; end
|
34
34
|
|
35
35
|
# Message publishing context
|
36
36
|
class Context
|
@@ -122,6 +122,8 @@ module RightAMQP
|
|
122
122
|
# if the agent crashes. Value 0 means unlimited prefetch.
|
123
123
|
# :order(Symbol):: Broker selection order when publishing a message: :random or :priority,
|
124
124
|
# defaults to :priority, value can be overridden on publish call
|
125
|
+
# :exception_stats(RightSupport::Stats::Exceptions):: Exception statistics container to be used
|
126
|
+
# instead of internally created one
|
125
127
|
# :exception_callback(Proc):: Callback activated on exception events with parameters
|
126
128
|
# exception(Exception):: Exception
|
127
129
|
# message(Packet):: Message being processed
|
@@ -171,19 +173,24 @@ module RightAMQP
|
|
171
173
|
raise NoUserData.new("User data is missing") if user_data.nil? || user_data.empty?
|
172
174
|
hosts = ""
|
173
175
|
ports = nil
|
176
|
+
parsed = {}
|
174
177
|
user_data.split("&").each do |data|
|
175
178
|
name, value = data.split("=")
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
179
|
+
# Guard against repeats
|
180
|
+
unless parsed[name]
|
181
|
+
if name == "RS_rn_url"
|
182
|
+
h = value.split("@").last.split("/").first
|
183
|
+
# Translate host name used by very old agents using only one broker
|
184
|
+
h = "broker1-1.rightscale.com" if h == "broker.rightscale.com"
|
185
|
+
hosts = h + hosts
|
186
|
+
end
|
187
|
+
if name == "RS_rn_host"
|
188
|
+
hosts << value
|
189
|
+
end
|
190
|
+
if name == "RS_rn_port"
|
191
|
+
ports = value
|
192
|
+
end
|
193
|
+
parsed[name] = true
|
187
194
|
end
|
188
195
|
end
|
189
196
|
raise NoBrokerHosts.new("No brokers found in user data") if hosts.empty?
|
@@ -757,7 +764,7 @@ module RightAMQP
|
|
757
764
|
@brokers.each do |b|
|
758
765
|
begin
|
759
766
|
b.close(propagate = false) { handler.completed_one }
|
760
|
-
rescue
|
767
|
+
rescue StandardError => e
|
761
768
|
handler.completed_one
|
762
769
|
logger.exception("Failed to close broker #{b.alias}", e, :trace)
|
763
770
|
@exception_stats.track("close", e)
|
@@ -857,11 +864,11 @@ module RightAMQP
|
|
857
864
|
def stats(reset = false)
|
858
865
|
stats = {
|
859
866
|
"brokers" => @brokers.map { |b| b.stats },
|
860
|
-
"exceptions" => @exception_stats.stats,
|
861
867
|
"heartbeat" => @options[:heartbeat],
|
862
868
|
"non-deliveries" => @non_delivery_stats.all,
|
863
869
|
"returns" => @return_stats.all
|
864
870
|
}
|
871
|
+
stats["exceptions"] = @exception_stats.stats unless @options[:exception_stats]
|
865
872
|
reset_stats if reset
|
866
873
|
stats
|
867
874
|
end
|
@@ -875,7 +882,7 @@ module RightAMQP
|
|
875
882
|
def reset_stats
|
876
883
|
@return_stats = RightSupport::Stats::Activity.new
|
877
884
|
@non_delivery_stats = RightSupport::Stats::Activity.new
|
878
|
-
@exception_stats = RightSupport::Stats::Exceptions.new(self, @options[:exception_callback])
|
885
|
+
@exception_stats = @options[:exception_stats] || RightSupport::Stats::Exceptions.new(self, @options[:exception_callback])
|
879
886
|
true
|
880
887
|
end
|
881
888
|
|
data/right_amqp.gemspec
CHANGED
@@ -24,8 +24,8 @@ require 'rubygems'
|
|
24
24
|
|
25
25
|
Gem::Specification.new do |spec|
|
26
26
|
spec.name = 'right_amqp'
|
27
|
-
spec.version = '0.
|
28
|
-
spec.date = '
|
27
|
+
spec.version = '0.8.3'
|
28
|
+
spec.date = '2014-05-22'
|
29
29
|
spec.authors = ['Lee Kirchhoff']
|
30
30
|
spec.email = 'lee@rightscale.com'
|
31
31
|
spec.homepage = 'https://github.com/rightscale/right_amqp'
|
@@ -0,0 +1,52 @@
|
|
1
|
+
#
|
2
|
+
# Copyright (c) 2009-2012 RightScale Inc
|
3
|
+
#
|
4
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
5
|
+
# a copy of this software and associated documentation files (the
|
6
|
+
# "Software"), to deal in the Software without restriction, including
|
7
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
8
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
9
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
10
|
+
# the following conditions:
|
11
|
+
#
|
12
|
+
# The above copyright notice and this permission notice shall be
|
13
|
+
# included in all copies or substantial portions of the Software.
|
14
|
+
#
|
15
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
16
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
17
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
18
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
19
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
20
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
21
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
22
|
+
|
23
|
+
require File.expand_path(File.join(File.dirname(__FILE__), '..', 'spec_helper'))
|
24
|
+
require File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'lib', 'right_amqp'))
|
25
|
+
|
26
|
+
describe AMQP::Protocol::Class do
|
27
|
+
context ".name" do
|
28
|
+
it "returns a value" do
|
29
|
+
AMQP::Protocol::Class.name.should == "AMQP::Protocol::Class"
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
context ".id" do
|
34
|
+
it "returns a value" do
|
35
|
+
AMQP::Protocol::Class.id.should == nil
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
describe AMQP::Protocol::Class::Method do
|
41
|
+
context ".name" do
|
42
|
+
it "returns a value" do
|
43
|
+
AMQP::Protocol::Class::Method.name.should == "AMQP::Protocol::Class::Method"
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
context ".id" do
|
48
|
+
it "returns a value" do
|
49
|
+
AMQP::Protocol::Class::Method.id.should == nil
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -100,7 +100,7 @@ describe RightAMQP::BrokerClient do
|
|
100
100
|
@connection.should_receive(:close).once
|
101
101
|
@logger.should_receive(:info).once
|
102
102
|
@logger.should_receive(:error).with(/Failed connecting/).once
|
103
|
-
flexmock(MQ).should_receive(:new).with(@connection).and_raise(
|
103
|
+
flexmock(MQ).should_receive(:new).with(@connection).and_raise(StandardError)
|
104
104
|
broker = RightAMQP::BrokerClient.new(@identity, @address, @serializer, @exceptions, @non_deliveries, @options)
|
105
105
|
broker.summary.should == {:alias => "b0", :identity => @identity, :status => :failed,
|
106
106
|
:disconnects => 0, :failures => 1, :retries => 0}
|
@@ -443,7 +443,7 @@ describe RightAMQP::BrokerClient do
|
|
443
443
|
|
444
444
|
it "should log an error if exception prevents normal logging and should then return nil" do
|
445
445
|
@logger.should_receive(:error).with(/Failed unserializing message from queue/).once
|
446
|
-
@serializer.should_receive(:load).with(@message).and_raise(
|
446
|
+
@serializer.should_receive(:load).with(@message).and_raise(StandardError).once
|
447
447
|
@exceptions.should_receive(:track).once
|
448
448
|
@non_deliveries.should_receive(:update).once
|
449
449
|
broker = RightAMQP::BrokerClient.new(@identity, @address, @serializer, @exceptions, @non_deliveries, @options)
|
@@ -452,7 +452,7 @@ describe RightAMQP::BrokerClient do
|
|
452
452
|
|
453
453
|
it "should make callback when there is a receive failure" do
|
454
454
|
@logger.should_receive(:error).with(/Failed unserializing message from queue/).once
|
455
|
-
@serializer.should_receive(:load).with(@message).and_raise(
|
455
|
+
@serializer.should_receive(:load).with(@message).and_raise(StandardError).once
|
456
456
|
@exceptions.should_receive(:track).once
|
457
457
|
@non_deliveries.should_receive(:update).once
|
458
458
|
called = 0
|
@@ -491,6 +491,16 @@ describe RightAMQP::BrokerClient do
|
|
491
491
|
broker.unsubscribe(["queue1"])
|
492
492
|
end
|
493
493
|
|
494
|
+
it "should remove unsubscribed queue from list of queues" do
|
495
|
+
@queue.should_receive(:unsubscribe).once
|
496
|
+
broker = RightAMQP::BrokerClient.new(@identity, @address, @serializer, @exceptions, @non_deliveries, @options)
|
497
|
+
broker.subscribe({:name => "queue1"}, {:type => :direct, :name => "exchange"}) {|_, _|}
|
498
|
+
broker.queues.size.should == 1
|
499
|
+
broker.queues[0].name.should == "queue1"
|
500
|
+
broker.unsubscribe(["queue1"])
|
501
|
+
broker.queues.should be_empty
|
502
|
+
end
|
503
|
+
|
494
504
|
it "should ignore unsubscribe if queue unknown" do
|
495
505
|
@queue.should_receive(:unsubscribe).never
|
496
506
|
broker = RightAMQP::BrokerClient.new(@identity, @address, @serializer, @exceptions, @non_deliveries, @options)
|
@@ -507,17 +517,18 @@ describe RightAMQP::BrokerClient do
|
|
507
517
|
called.should == 1
|
508
518
|
end
|
509
519
|
|
510
|
-
it "should ignore the request if client
|
520
|
+
it "should ignore the request if client is failed" do
|
511
521
|
@queue.should_receive(:unsubscribe).and_yield.never
|
512
522
|
broker = RightAMQP::BrokerClient.new(@identity, @address, @serializer, @exceptions, @non_deliveries, @options)
|
513
523
|
broker.subscribe({:name => "queue1"}, {:type => :direct, :name => "exchange"}) {|_, _|}
|
514
|
-
|
524
|
+
@logger.should_receive(:error).with(/Failed to connect to broker b0/).once
|
525
|
+
broker.__send__(:update_status, :failed)
|
515
526
|
broker.unsubscribe(["queue1"])
|
516
527
|
end
|
517
528
|
|
518
529
|
it "should log an error if unsubscribe raises an exception and activate block if provided" do
|
519
530
|
@logger.should_receive(:error).with(/Failed unsubscribing/).once
|
520
|
-
@queue.should_receive(:unsubscribe).and_raise(
|
531
|
+
@queue.should_receive(:unsubscribe).and_raise(StandardError).once
|
521
532
|
@exceptions.should_receive(:track).once
|
522
533
|
broker = RightAMQP::BrokerClient.new(@identity, @address, @serializer, @exceptions, @non_deliveries, @options)
|
523
534
|
broker.subscribe({:name => "queue1"}, {:type => :direct, :name => "exchange"}) {|_, _|}
|
@@ -570,7 +581,7 @@ describe RightAMQP::BrokerClient do
|
|
570
581
|
@logger.should_receive(:info).with(/Declaring/).once
|
571
582
|
@logger.should_receive(:error).with(/Failed declaring/).once
|
572
583
|
@exceptions.should_receive(:track).once
|
573
|
-
@channel.should_receive(:queue).and_raise(
|
584
|
+
@channel.should_receive(:queue).and_raise(StandardError).once
|
574
585
|
broker = RightAMQP::BrokerClient.new(@identity, @address, @serializer, @exceptions, @non_deliveries, @options)
|
575
586
|
broker.declare(:queue, "q").should be_false
|
576
587
|
end
|
@@ -616,7 +627,7 @@ describe RightAMQP::BrokerClient do
|
|
616
627
|
it "should log unexpected exceptions and call block with nil status" do
|
617
628
|
@logger.should_receive(:error).with(/Failed checking status of queue/).once
|
618
629
|
@exceptions.should_receive(:track).once
|
619
|
-
@queue.should_receive(:status).and_raise(
|
630
|
+
@queue.should_receive(:status).and_raise(StandardError).once
|
620
631
|
called = 0
|
621
632
|
@broker.queue_status(["queue1"]) do |name, messages, consumers|
|
622
633
|
name.should == "queue1"
|
@@ -667,7 +678,7 @@ describe RightAMQP::BrokerClient do
|
|
667
678
|
@logger.should_receive(:error).with(/Failed publishing/).once
|
668
679
|
@exceptions.should_receive(:track).once
|
669
680
|
@non_deliveries.should_receive(:update).once
|
670
|
-
@channel.should_receive(:direct).and_raise(
|
681
|
+
@channel.should_receive(:direct).and_raise(StandardError)
|
671
682
|
@direct.should_receive(:publish).with(@message, {}).never
|
672
683
|
broker = RightAMQP::BrokerClient.new(@identity, @address, @serializer, @exceptions, @non_deliveries, @options)
|
673
684
|
broker.__send__(:update_status, :ready)
|
@@ -863,7 +874,7 @@ describe RightAMQP::BrokerClient do
|
|
863
874
|
it "should log an error and return false if the delete fails" do
|
864
875
|
@logger.should_receive(:error).with(/Failed deleting queue/).once
|
865
876
|
@exceptions.should_receive(:track).once
|
866
|
-
@queue.should_receive(:delete).and_raise(
|
877
|
+
@queue.should_receive(:delete).and_raise(StandardError)
|
867
878
|
broker = RightAMQP::BrokerClient.new(@identity, @address, @serializer, @exceptions, @non_deliveries, @options)
|
868
879
|
broker.subscribe({:name => "queue1"}, {:type => :direct, :name => "exchange"}) {|_, _|}
|
869
880
|
broker.queues.should == [@queue]
|
@@ -1049,7 +1060,7 @@ describe RightAMQP::BrokerClient do
|
|
1049
1060
|
it "should log an error if closing connection fails but still set status to :closed" do
|
1050
1061
|
@logger.should_receive(:error).with(/Failed to close broker b0/).once
|
1051
1062
|
@exceptions.should_receive(:track).once
|
1052
|
-
@connection.should_receive(:close).and_raise(
|
1063
|
+
@connection.should_receive(:close).and_raise(StandardError)
|
1053
1064
|
broker = RightAMQP::BrokerClient.new(@identity, @address, @serializer, @exceptions, @non_deliveries, @options)
|
1054
1065
|
broker.close
|
1055
1066
|
broker.status.should == :closed
|
@@ -239,6 +239,12 @@ describe RightAMQP::HABrokerClient do
|
|
239
239
|
["broker1-1.rightscale.com", nil]
|
240
240
|
end
|
241
241
|
|
242
|
+
it "should ignore repeated variables in the user data" do
|
243
|
+
user_data = "RS_rn_url=amqp://49c7a840eb:5c9c0823cb@broker4-2.rightscale.com/right_net&RS_rn_id=6067794001&RS_server=my.rightscale.com&RS_sketchy=sketchy12-13.rightscale.com&RS_rn_host=:1,broker4-1.rightscale.com:0&RS_rn_url=amqp://49c7a840eb:5c9c0823cb@broker4-1.rightscale.com/right_net&RS_rn_id=6067770001&RS_server=my.rightscale.com&RS_sketchy=sketchy12-13.rightscale.com&RS_rn_host=:0,broker4-2.rightscale.com:1"
|
244
|
+
RightAMQP::HABrokerClient.parse_user_data(user_data).should ==
|
245
|
+
["broker4-2.rightscale.com:1,broker4-1.rightscale.com:0", nil]
|
246
|
+
end
|
247
|
+
|
242
248
|
end # when parsing user_data
|
243
249
|
|
244
250
|
context "when addressing" do
|
@@ -1127,6 +1133,18 @@ describe RightAMQP::HABrokerClient do
|
|
1127
1133
|
"returns" => nil}
|
1128
1134
|
end
|
1129
1135
|
|
1136
|
+
it "should omit exceptions from client statistics if accumulated usin :exception_stats option" do
|
1137
|
+
stats = RightSupport::Stats::Exceptions.new
|
1138
|
+
ha = RightAMQP::HABrokerClient.new(@serializer, :host => "first, second, third", :exception_stats => stats)
|
1139
|
+
@broker1.should_receive(:stats).and_return("stats1")
|
1140
|
+
@broker2.should_receive(:stats).and_return("stats2")
|
1141
|
+
@broker3.should_receive(:stats).and_return("stats3")
|
1142
|
+
ha.stats.should == {"brokers" => ["stats1", "stats2", "stats3"],
|
1143
|
+
"heartbeat" => nil,
|
1144
|
+
"non-deliveries" => nil,
|
1145
|
+
"returns" => nil}
|
1146
|
+
end
|
1147
|
+
|
1130
1148
|
it "should log broker client status update if there is a change" do
|
1131
1149
|
@logger.should_receive(:info).with(/Broker b0 is now connected/).once
|
1132
1150
|
ha = RightAMQP::HABrokerClient.new(@serializer, :host => "first, second, third")
|
@@ -1443,7 +1461,7 @@ describe RightAMQP::HABrokerClient do
|
|
1443
1461
|
it "should close all broker connections even if encounter an exception" do
|
1444
1462
|
@logger.should_receive(:error).with(/Failed to close/).once
|
1445
1463
|
@broker1.should_receive(:close).and_return(true).and_yield.once
|
1446
|
-
@broker2.should_receive(:close).and_raise(
|
1464
|
+
@broker2.should_receive(:close).and_raise(StandardError).once
|
1447
1465
|
@broker3.should_receive(:close).and_return(true).and_yield.once
|
1448
1466
|
ha = RightAMQP::HABrokerClient.new(@serializer, :host => "first, second, third")
|
1449
1467
|
called = 0
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: right_amqp
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.8.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2014-05-22 00:00:00.000000000Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: right_support
|
16
|
-
requirement: &
|
16
|
+
requirement: &2169048940 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -24,10 +24,10 @@ dependencies:
|
|
24
24
|
version: '3.0'
|
25
25
|
type: :runtime
|
26
26
|
prerelease: false
|
27
|
-
version_requirements: *
|
27
|
+
version_requirements: *2169048940
|
28
28
|
- !ruby/object:Gem::Dependency
|
29
29
|
name: eventmachine
|
30
|
-
requirement: &
|
30
|
+
requirement: &2169047520 !ruby/object:Gem::Requirement
|
31
31
|
none: false
|
32
32
|
requirements:
|
33
33
|
- - ! '>='
|
@@ -38,7 +38,7 @@ dependencies:
|
|
38
38
|
version: '2.0'
|
39
39
|
type: :runtime
|
40
40
|
prerelease: false
|
41
|
-
version_requirements: *
|
41
|
+
version_requirements: *2169047520
|
42
42
|
description: ! 'RightAMQP provides a high availability client for interfacing with
|
43
43
|
the
|
44
44
|
|
@@ -91,6 +91,7 @@ files:
|
|
91
91
|
- lib/right_amqp/mq/rpc.rb
|
92
92
|
- right_amqp.gemspec
|
93
93
|
- spec/amqp/client_extensions_spec.rb
|
94
|
+
- spec/amqp/spec_spec.rb
|
94
95
|
- spec/ha_client/broker_client_spec.rb
|
95
96
|
- spec/ha_client/ha_broker_client_spec.rb
|
96
97
|
- spec/spec.opts
|
@@ -119,7 +120,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
119
120
|
version: '0'
|
120
121
|
segments:
|
121
122
|
- 0
|
122
|
-
hash: -
|
123
|
+
hash: -1878767415152357998
|
123
124
|
requirements: []
|
124
125
|
rubyforge_project:
|
125
126
|
rubygems_version: 1.8.10
|