amq-client 0.7.0.alpha3 → 0.7.0.alpha4

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.
@@ -2,9 +2,6 @@
2
2
 
3
3
  require "socket"
4
4
  require "amq/client"
5
- require "amq/client/channel"
6
- require "amq/client/exchange"
7
- require "amq/client/queue"
8
5
  require "amq/client/framing/io/frame"
9
6
 
10
7
  module AMQ
@@ -19,11 +16,6 @@ module AMQ
19
16
 
20
17
  self.sync = true
21
18
 
22
- register_entity :channel, AMQ::Client::Channel
23
- register_entity :exchange, AMQ::Client::Exchange
24
- register_entity :queue, AMQ::Client::Queue
25
-
26
-
27
19
  #
28
20
  # API
29
21
  #
@@ -43,6 +35,15 @@ module AMQ
43
35
  raise exception
44
36
  end
45
37
 
38
+ def register_connection_callback(&block)
39
+ if block
40
+ block.call(self)
41
+ self.disconnect
42
+ else
43
+ self
44
+ end
45
+ end
46
+
46
47
  def connection
47
48
  @socket
48
49
  end # connection
@@ -1,12 +1,20 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  require "amq/client/entity"
4
- require "amq/client/adapter"
4
+ require "amq/client/queue"
5
+ require "amq/client/exchange"
5
6
 
6
7
  module AMQ
7
8
  module Client
8
9
  class Channel < Entity
9
10
 
11
+ #
12
+ # Behaviors
13
+ #
14
+
15
+ register_entity :queue, AMQ::Client::Queue
16
+ register_entity :exchange, AMQ::Client::Exchange
17
+
10
18
  #
11
19
  # API
12
20
  #
@@ -42,7 +50,11 @@ module AMQ
42
50
  # 65536 is here for cases when channel is opened without passing a callback in,
43
51
  # otherwise channel_mix would be nil and it causes a lot of needless headaches.
44
52
  # lets just have this default. MK.
45
- channel_max = client.connection.channel_max || 65536
53
+ channel_max = if client.connection
54
+ client.connection.channel_max || 65536
55
+ else
56
+ 65536
57
+ end
46
58
 
47
59
  if channel_max != 0 && !(0..channel_max).include?(id)
48
60
  raise ChannelOutOfBadError.new(channel_max, id)
@@ -195,6 +207,10 @@ module AMQ
195
207
  @flow_is_active
196
208
  end # flow_is_active?
197
209
 
210
+ # Defines a callback that will be executed when channel is closed after
211
+ # channel-level exception.
212
+ #
213
+ # @api public
198
214
  def on_error(&block)
199
215
  self.define_callback(:close, &block)
200
216
  end
@@ -244,9 +260,11 @@ module AMQ
244
260
  end # reset_state!
245
261
 
246
262
 
247
- def on_connection_interruption(exception = nil)
263
+ def handle_connection_interruption(exception = nil)
248
264
  self.reset_state!
249
- end # on_connection_interruption
265
+ end # handle_connection_interruption
266
+
267
+
250
268
 
251
269
  def handle_open_ok(method)
252
270
  self.status = :opened
@@ -262,7 +280,7 @@ module AMQ
262
280
  self.status = :closed
263
281
  self.exec_callback_once_yielding_self(:close, method)
264
282
 
265
- self.on_connection_interruption(exception)
283
+ self.handle_connection_interruption(exception)
266
284
  end
267
285
 
268
286
  # === Handlers ===
@@ -191,11 +191,12 @@ module AMQ
191
191
  #
192
192
  # @see http://bit.ly/htCzCX AMQP 0.9.1 protocol documentation (Section 1.5.2.9)
193
193
  def handle_close(method)
194
- self.channels.each { |key, value| value.on_connection_interruption }
194
+ self.handle_connection_interruption
195
195
 
196
196
  closed!
197
197
  # TODO: use proper exception class, provide protocol class (we know method.class_id and method.method_id) as well!
198
- self.error RuntimeError.new(method.reply_text)
198
+ x = RuntimeError.new(method.reply_text)
199
+ self.error(x)
199
200
  end
200
201
 
201
202
  # Handles connection.close-ok
@@ -207,9 +208,9 @@ module AMQ
207
208
  end # handle_close_ok(method)
208
209
 
209
210
 
210
- def on_connection_interruption
211
- @channels.each { |n, c| c.on_connection_interruption }
212
- end # on_connection_interruption
211
+ def handle_connection_interruption
212
+ @channels.each { |n, c| c.handle_connection_interruption }
213
+ end # handle_connection_interruption
213
214
 
214
215
 
215
216
 
@@ -4,48 +4,21 @@ require "amq/client/mixins/status"
4
4
 
5
5
  module AMQ
6
6
  module Client
7
- # AMQ entities, as implemented by AMQ::Client, have callbacks and can run them
8
- # when necessary.
9
- #
10
- # @note Exchanges and queues implementation is based on this class.
11
- #
12
- # @abstract
13
- class Entity
14
-
15
- #
16
- # Behaviors
17
- #
18
-
19
- include StatusMixin
20
-
21
- #
22
- # API
23
- #
24
-
25
- # @return [Array<#call>]
26
- attr_reader :callbacks
27
-
28
- @@handlers ||= Hash.new
29
-
30
- def self.handle(klass, &block)
31
- @@handlers[klass] = block
32
- end
33
-
34
- def self.handlers
35
- @@handlers
36
- end
37
-
38
-
39
-
40
-
41
- def initialize(client)
42
- @client = client
43
- # Be careful with default values for #ruby hashes: h = Hash.new(Array.new); h[:key] ||= 1
44
- # won't assign anything to :key. MK.
45
- @callbacks = Hash.new
7
+ module RegisterEntityMixin
8
+ # @example Registering Channel implementation
9
+ # Adapter.register_entity(:channel, Channel)
10
+ # # ... so then I can do:
11
+ # channel = client.channel(1)
12
+ # # instead of:
13
+ # channel = Channel.new(client, 1)
14
+ def register_entity(name, klass)
15
+ define_method(name) do |*args, &block|
16
+ klass.new(self, *args, &block)
17
+ end
46
18
  end
19
+ end
47
20
 
48
-
21
+ module CallbacksMixin
49
22
  def redefine_callback(event, callable = nil, &block)
50
23
  f = (callable || block)
51
24
  # yes, re-assign!
@@ -95,7 +68,49 @@ module AMQ
95
68
  callbacks = Array(self.callbacks.delete(name))
96
69
  callbacks.map { |c| c.call(self, *args, &block) } if callbacks.any?
97
70
  end
71
+ end
72
+
73
+ # AMQ entities, as implemented by AMQ::Client, have callbacks and can run them
74
+ # when necessary.
75
+ #
76
+ # @note Exchanges and queues implementation is based on this class.
77
+ #
78
+ # @abstract
79
+ class Entity
80
+
81
+ #
82
+ # Behaviors
83
+ #
84
+
85
+ include StatusMixin
86
+ include CallbacksMixin
87
+
88
+ extend RegisterEntityMixin
89
+
90
+ #
91
+ # API
92
+ #
98
93
 
94
+ # @return [Array<#call>]
95
+ attr_reader :callbacks
96
+
97
+ @@handlers ||= Hash.new
98
+
99
+ def self.handle(klass, &block)
100
+ @@handlers[klass] = block
101
+ end
102
+
103
+ def self.handlers
104
+ @@handlers
105
+ end
106
+
107
+
108
+ def initialize(client)
109
+ @client = client
110
+ # Be careful with default values for #ruby hashes: h = Hash.new(Array.new); h[:key] ||= 1
111
+ # won't assign anything to :key. MK.
112
+ @callbacks = Hash.new
113
+ end
99
114
 
100
115
 
101
116
  def error(exception)
@@ -1,5 +1,5 @@
1
1
  module AMQ
2
2
  module Client
3
- VERSION = "0.7.0.alpha3"
3
+ VERSION = "0.7.0.alpha4"
4
4
  end
5
5
  end
@@ -11,7 +11,7 @@ TOTAL_MESSAGES = 10000
11
11
  # Short messages
12
12
  # Cool.io
13
13
  coolio_start = Time.now
14
- AMQ::Client::Coolio.connect(:port => 5672, :vhost => "/amq_client_testbed") do |client|
14
+ AMQ::Client::CoolioClient.connect(:port => 5672, :vhost => "/amq_client_testbed") do |client|
15
15
  received_messages = 0
16
16
  channel = AMQ::Client::Channel.new(client, 1)
17
17
  channel.open { }
@@ -1,10 +1,7 @@
1
1
  require 'spec_helper'
2
2
  require 'integration/coolio/spec_helper'
3
3
 
4
- require 'spec_helper'
5
- require 'integration/coolio/spec_helper'
6
-
7
- describe "AMQ::Client::Coolio", "Basic.Ack", :nojruby => true do
4
+ describe "AMQ::Client::CoolioClient", "Basic.Ack", :nojruby => true do
8
5
  include EventedSpec::SpecHelper
9
6
  default_timeout 1
10
7
 
@@ -1,7 +1,7 @@
1
1
  require 'spec_helper'
2
2
  require 'integration/coolio/spec_helper'
3
3
 
4
- describe "AMQ::Client::Coolio", "Basic.Get", :nojruby => true do
4
+ describe "AMQ::Client::CoolioClient", "Basic.Get", :nojruby => true do
5
5
  include EventedSpec::SpecHelper
6
6
  default_timeout 1
7
7
 
@@ -1,7 +1,7 @@
1
1
  require 'spec_helper'
2
2
  require 'integration/coolio/spec_helper'
3
3
 
4
- describe "AMQ::Client::Coolio", "Basic.Return", :nojruby => true do
4
+ describe "AMQ::Client::CoolioClient", "Basic.Return", :nojruby => true do
5
5
  include EventedSpec::SpecHelper
6
6
  default_timeout 1.0
7
7
 
@@ -1,7 +1,7 @@
1
1
  require 'spec_helper'
2
2
  require 'integration/coolio/spec_helper'
3
3
 
4
- describe "AMQ::Client::Coolio", "Channel.Close", :nojruby => true do
4
+ describe "AMQ::Client::CoolioClient", "Channel.Close", :nojruby => true do
5
5
  include EventedSpec::SpecHelper
6
6
  default_timeout 1
7
7
 
@@ -1,7 +1,7 @@
1
1
  require 'spec_helper'
2
2
  require 'integration/coolio/spec_helper'
3
3
 
4
- describe "AMQ::Client::Coolio", "Channel.Flow", :nojruby => true do
4
+ describe "AMQ::Client::CoolioClient", "Channel.Flow", :nojruby => true do
5
5
  include EventedSpec::SpecHelper
6
6
  default_timeout 1
7
7
 
@@ -24,7 +24,7 @@ end
24
24
 
25
25
  def coolio_amqp_connect(&block)
26
26
  coolio do
27
- AMQ::Client::Coolio.connect(:port => 5672, :vhost => "/amq_client_testbed", :frame_max => 2**16-1, :heartbeat_interval => 1) do |client|
27
+ AMQ::Client::CoolioClient.connect(:port => 5672, :vhost => "/amq_client_testbed", :frame_max => 2**16-1, :heartbeat_interval => 1) do |client|
28
28
  yield client
29
29
  end
30
30
  end
@@ -2,7 +2,7 @@
2
2
  require 'spec_helper'
3
3
  require 'integration/coolio/spec_helper'
4
4
 
5
- describe "AMQ::Client::Coolio", "Tx.Commit", :nojruby => true do
5
+ describe "AMQ::Client::CoolioClient", "Tx.Commit", :nojruby => true do
6
6
  include EventedSpec::SpecHelper
7
7
  default_timeout 2
8
8
  let(:message) { "Hello, world!" }
@@ -2,7 +2,7 @@
2
2
  require 'spec_helper'
3
3
  require 'integration/coolio/spec_helper'
4
4
 
5
- describe "AMQ::Client::Coolio", "Tx.Rollback", :nojruby => true do
5
+ describe "AMQ::Client::CoolioClient", "Tx.Rollback", :nojruby => true do
6
6
  include EventedSpec::SpecHelper
7
7
  default_timeout 2
8
8
 
@@ -2,7 +2,7 @@ require 'spec_helper'
2
2
  require 'integration/coolio/spec_helper'
3
3
  require 'integration/eventmachine/spec_helper'
4
4
 
5
- describe "AMQ::Client::Coolio", :nojruby => true do
5
+ describe "AMQ::Client::CoolioClient", :nojruby => true do
6
6
  include EventedSpec::SpecHelper
7
7
  default_timeout 1
8
8
 
data/spec/spec_helper.rb CHANGED
@@ -5,6 +5,7 @@ require "bundler"
5
5
  Bundler.setup
6
6
  Bundler.require(:default, :test)
7
7
 
8
+ require 'amq/client'
8
9
  #
9
10
  # Ruby version-specific
10
11
  #
@@ -5,7 +5,81 @@ require "spec_helper"
5
5
  require "amq/client"
6
6
 
7
7
  describe AMQ::Client do
8
+ if RUBY_PLATFORM =~ /java/
9
+ ADAPTERS = {
10
+ :event_machine => "EventMachineClient",
11
+ :socket => "SocketClient"
12
+ }
13
+ else
14
+ ADAPTERS = {
15
+ :event_machine => "EventMachineClient",
16
+ :coolio => "CoolioClient",
17
+ :socket => "SocketClient"
18
+ }
19
+ end
20
+
8
21
  it "should have VERSION" do
9
22
  AMQ::Client::const_defined?(:VERSION).should be_true
10
23
  end
24
+
25
+ ADAPTERS.each do |adapter_name, adapter_const_name|
26
+ describe ".adapters" do
27
+ before(:all) do
28
+ @meta = AMQ::Client.adapters[adapter_name]
29
+ end
30
+
31
+ it "should provide info about path to the adapter" do
32
+ lambda { require @meta[:path] }.should_not raise_error
33
+ end
34
+
35
+ it "should provide info about const_name" do
36
+ @meta[:const_name].should eql(adapter_const_name)
37
+ end
38
+ end
39
+ end
40
+
41
+ describe ".connect(settings = nil, &block)" do
42
+ include EventedSpec::SpecHelper
43
+ default_timeout 1
44
+
45
+ context "with specified adapter" do
46
+ it "should connect using socket adapter" do
47
+ pending "Socket adapter is currently broken" do
48
+ AMQ::Client.connect(:adapter => :socket) do |client|
49
+ client.class.name.should eql("AMQ::Client::SocketClient")
50
+ done
51
+ end
52
+ end
53
+ end
54
+
55
+ it "should connect using event_machine adapter" do
56
+ em do
57
+ AMQ::Client.connect(:adapter => :event_machine) do |client|
58
+ client.class.name.should eql("AMQ::Client::EventMachineClient")
59
+ done
60
+ end
61
+ end
62
+ end
63
+
64
+ it "should connect using coolio adapter", :nojruby => true do
65
+ coolio do
66
+ AMQ::Client.connect(:adapter => :coolio) do |client|
67
+ client.class.name.should eql("AMQ::Client::CoolioClient")
68
+ done
69
+ end
70
+ end
71
+ end
72
+ end
73
+
74
+ context "without any specified adapter" do
75
+ it "should default to the socket adapter" do
76
+ pending "Socket adapter is currently broken" do
77
+ AMQ::Client.connect do |client|
78
+ client.class.name.should eql("AMQ::Client::SocketClient")
79
+ done
80
+ end
81
+ end
82
+ end
83
+ end
84
+ end
11
85
  end