bunny 0.4.4 → 0.5.1
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +21 -3
- data/bunny.gemspec +34 -20
- data/examples/{simple.rb → simple_08.rb} +0 -0
- data/examples/simple_09.rb +30 -0
- data/examples/{simple_ack.rb → simple_ack_08.rb} +0 -0
- data/examples/simple_ack_09.rb +33 -0
- data/examples/{simple_consumer.rb → simple_consumer_08.rb} +0 -0
- data/examples/simple_consumer_09.rb +55 -0
- data/examples/{simple_fanout.rb → simple_fanout_08.rb} +0 -0
- data/examples/simple_fanout_09.rb +39 -0
- data/examples/{simple_headers.rb → simple_headers_08.rb} +0 -0
- data/examples/simple_headers_09.rb +40 -0
- data/examples/{simple_publisher.rb → simple_publisher_08.rb} +0 -0
- data/examples/simple_publisher_09.rb +27 -0
- data/examples/{simple_topic.rb → simple_topic_08.rb} +0 -0
- data/examples/simple_topic_09.rb +59 -0
- data/lib/bunny.rb +19 -14
- data/lib/bunny/channel08.rb +38 -0
- data/lib/bunny/channel09.rb +38 -0
- data/lib/bunny/client08.rb +167 -74
- data/lib/bunny/{client091.rb → client09.rb} +195 -92
- data/lib/bunny/{exchange091.rb → exchange09.rb} +12 -11
- data/lib/bunny/queue08.rb +1 -0
- data/lib/bunny/{queue091.rb → queue09.rb} +38 -28
- data/lib/qrack/client.rb +7 -0
- data/lib/qrack/protocol/{protocol.rb → protocol08.rb} +1 -4
- data/lib/qrack/protocol/protocol09.rb +133 -0
- data/lib/qrack/protocol/{spec091.rb → spec09.rb} +5 -5
- data/lib/qrack/qrack08.rb +2 -10
- data/lib/qrack/qrack09.rb +20 -0
- data/lib/qrack/transport/{buffer.rb → buffer08.rb} +0 -0
- data/lib/qrack/transport/buffer09.rb +276 -0
- data/lib/qrack/transport/{frame091.rb → frame09.rb} +8 -8
- data/spec/{bunny_spec.rb → spec_08/bunny_spec.rb} +4 -4
- data/spec/{exchange_spec.rb → spec_08/exchange_spec.rb} +3 -10
- data/spec/{queue_spec.rb → spec_08/queue_spec.rb} +1 -1
- data/spec/spec_09/bunny_spec.rb +40 -0
- data/spec/spec_09/exchange_spec.rb +131 -0
- data/spec/spec_09/queue_spec.rb +106 -0
- metadata +38 -22
- data/lib/qrack/qrack091.rb +0 -28
@@ -29,7 +29,7 @@ specification that applies to your target broker/server.
|
|
29
29
|
|
30
30
|
=end
|
31
31
|
|
32
|
-
class
|
32
|
+
class Exchange09
|
33
33
|
|
34
34
|
attr_reader :client, :type, :name, :opts, :key
|
35
35
|
|
@@ -58,14 +58,15 @@ specification that applies to your target broker/server.
|
|
58
58
|
|
59
59
|
unless name == "amq.#{type}" or name == ''
|
60
60
|
client.send_frame(
|
61
|
-
Qrack::
|
62
|
-
{ :exchange => name, :type => type, :nowait => false
|
61
|
+
Qrack::Protocol09::Exchange::Declare.new(
|
62
|
+
{ :exchange => name, :type => type, :nowait => false,
|
63
|
+
:reserved_1 => 0, :reserved_2 => false, :reserved_3 => false }.merge(opts)
|
63
64
|
)
|
64
65
|
)
|
65
66
|
|
66
67
|
raise Bunny::ProtocolError,
|
67
68
|
"Error declaring exchange #{name}: type = #{type}" unless
|
68
|
-
client.next_method.is_a?(Qrack::
|
69
|
+
client.next_method.is_a?(Qrack::Protocol09::Exchange::DeclareOk)
|
69
70
|
end
|
70
71
|
end
|
71
72
|
|
@@ -98,19 +99,19 @@ nil
|
|
98
99
|
def publish(data, opts = {})
|
99
100
|
out = []
|
100
101
|
|
101
|
-
out << Qrack::
|
102
|
-
{ :exchange => name, :routing_key => opts.delete(:key) || key }.merge(opts)
|
102
|
+
out << Qrack::Protocol09::Basic::Publish.new(
|
103
|
+
{ :exchange => name, :routing_key => opts.delete(:key) || key, :reserved_1 => 0 }.merge(opts)
|
103
104
|
)
|
104
105
|
data = data.to_s
|
105
|
-
out << Qrack::
|
106
|
-
Qrack::
|
106
|
+
out << Qrack::Protocol09::Header.new(
|
107
|
+
Qrack::Protocol09::Basic,
|
107
108
|
data.length, {
|
108
109
|
:content_type => 'application/octet-stream',
|
109
110
|
:delivery_mode => (opts.delete(:persistent) ? 2 : 1),
|
110
111
|
:priority => 0
|
111
112
|
}.merge(opts)
|
112
113
|
)
|
113
|
-
out << Qrack::
|
114
|
+
out << Qrack::Transport09::Body.new(data)
|
114
115
|
|
115
116
|
client.send_frame(*out)
|
116
117
|
end
|
@@ -140,12 +141,12 @@ if successful. If an error occurs raises _Bunny_::_ProtocolError_.
|
|
140
141
|
opts.delete(:nowait)
|
141
142
|
|
142
143
|
client.send_frame(
|
143
|
-
Qrack::
|
144
|
+
Qrack::Protocol09::Exchange::Delete.new({ :exchange => name, :nowait => false, :reserved_1 => 0 }.merge(opts))
|
144
145
|
)
|
145
146
|
|
146
147
|
raise Bunny::ProtocolError,
|
147
148
|
"Error deleting exchange #{name}" unless
|
148
|
-
client.next_method.is_a?(Qrack::
|
149
|
+
client.next_method.is_a?(Qrack::Protocol09::Exchange::DeleteOk)
|
149
150
|
|
150
151
|
client.exchanges.delete(name)
|
151
152
|
|
data/lib/bunny/queue08.rb
CHANGED
@@ -44,6 +44,7 @@ Queues must be attached to at least one exchange in order to receive messages fr
|
|
44
44
|
raise Bunny::ProtocolError, "Error declaring queue #{name}" unless method.is_a?(Qrack::Protocol::Queue::DeclareOk)
|
45
45
|
|
46
46
|
@name = method.queue
|
47
|
+
client.queues[@name] = self
|
47
48
|
end
|
48
49
|
|
49
50
|
=begin rdoc
|
@@ -9,7 +9,7 @@ Queues must be attached to at least one exchange in order to receive messages fr
|
|
9
9
|
|
10
10
|
=end
|
11
11
|
|
12
|
-
class
|
12
|
+
class Queue09
|
13
13
|
attr_reader :name, :client
|
14
14
|
attr_accessor :delivery_tag
|
15
15
|
|
@@ -28,7 +28,8 @@ Queues must be attached to at least one exchange in order to receive messages fr
|
|
28
28
|
:passive => false,
|
29
29
|
:durable => false,
|
30
30
|
:exclusive => true,
|
31
|
-
:auto_delete => true
|
31
|
+
:auto_delete => true,
|
32
|
+
:reserved_1 => 0
|
32
33
|
}.merge(opts)
|
33
34
|
end
|
34
35
|
|
@@ -37,13 +38,14 @@ Queues must be attached to at least one exchange in order to receive messages fr
|
|
37
38
|
opts.delete(:nowait)
|
38
39
|
|
39
40
|
client.send_frame(
|
40
|
-
Qrack::
|
41
|
+
Qrack::Protocol09::Queue::Declare.new({ :queue => name || '', :nowait => false, :reserved_1 => 0 }.merge(opts))
|
41
42
|
)
|
42
43
|
|
43
44
|
method = client.next_method
|
44
|
-
raise Bunny::ProtocolError, "Error declaring queue #{name}" unless method.is_a?(Qrack::
|
45
|
+
raise Bunny::ProtocolError, "Error declaring queue #{name}" unless method.is_a?(Qrack::Protocol09::Queue::DeclareOk)
|
45
46
|
|
46
47
|
@name = method.queue
|
48
|
+
client.queues[@name] = self
|
47
49
|
end
|
48
50
|
|
49
51
|
=begin rdoc
|
@@ -68,7 +70,7 @@ ask to confirm a single message or a set of messages up to and including a speci
|
|
68
70
|
self.delivery_tag = 1 if self.delivery_tag.nil?
|
69
71
|
|
70
72
|
client.send_frame(
|
71
|
-
Qrack::
|
73
|
+
Qrack::Protocol09::Basic::Ack.new({:delivery_tag => delivery_tag, :multiple => false}.merge(opts))
|
72
74
|
)
|
73
75
|
|
74
76
|
# reset delivery tag
|
@@ -107,17 +109,18 @@ a hash <tt>{:delivery_tag, :redelivered, :exchange, :routing_key, :message_count
|
|
107
109
|
ack = opts.delete(:ack)
|
108
110
|
|
109
111
|
client.send_frame(
|
110
|
-
Qrack::
|
112
|
+
Qrack::Protocol09::Basic::Get.new({ :queue => name,
|
111
113
|
:consumer_tag => name,
|
112
114
|
:no_ack => !ack,
|
113
|
-
:nowait => true
|
115
|
+
:nowait => true,
|
116
|
+
:reserved_1 => 0 }.merge(opts))
|
114
117
|
)
|
115
118
|
|
116
119
|
method = client.next_method
|
117
120
|
|
118
|
-
if method.is_a?(Qrack::
|
121
|
+
if method.is_a?(Qrack::Protocol09::Basic::GetEmpty) then
|
119
122
|
return :queue_empty
|
120
|
-
elsif !method.is_a?(Qrack::
|
123
|
+
elsif !method.is_a?(Qrack::Protocol09::Basic::GetOk)
|
121
124
|
raise Bunny::ProtocolError, "Error getting message from queue #{name}"
|
122
125
|
end
|
123
126
|
|
@@ -185,7 +188,7 @@ Returns hash {:message_count, :consumer_count}.
|
|
185
188
|
|
186
189
|
def status
|
187
190
|
client.send_frame(
|
188
|
-
Qrack::
|
191
|
+
Qrack::Protocol09::Queue::Declare.new({ :queue => name, :passive => true, :reserved_1 => 0 })
|
189
192
|
)
|
190
193
|
method = client.next_method
|
191
194
|
{:message_count => method.message_count, :consumer_count => method.consumer_count}
|
@@ -236,20 +239,21 @@ If <tt>:header => false</tt> only message payload is returned.
|
|
236
239
|
ack = opts.delete(:ack)
|
237
240
|
|
238
241
|
client.send_frame(
|
239
|
-
Qrack::
|
240
|
-
|
241
|
-
|
242
|
-
|
242
|
+
Qrack::Protocol09::Basic::Consume.new({ :reserved_1 => 0,
|
243
|
+
:queue => name,
|
244
|
+
:consumer_tag => consumer_tag,
|
245
|
+
:no_ack => !ack,
|
246
|
+
:nowait => false }.merge(opts))
|
243
247
|
)
|
244
248
|
|
245
249
|
raise Bunny::ProtocolError,
|
246
250
|
"Error subscribing to queue #{name}" unless
|
247
|
-
client.next_method.is_a?(Qrack::
|
251
|
+
client.next_method.is_a?(Qrack::Protocol09::Basic::ConsumeOk)
|
248
252
|
|
249
253
|
while true
|
250
254
|
method = client.next_method
|
251
255
|
|
252
|
-
break if method.is_a?(Qrack::
|
256
|
+
break if method.is_a?(Qrack::Protocol09::Basic::CancelOk)
|
253
257
|
|
254
258
|
# get delivery tag to use for acknowledge
|
255
259
|
self.delivery_tag = method.delivery_tag if ack
|
@@ -285,7 +289,7 @@ the server will not send any more messages for that consumer.
|
|
285
289
|
# response from the server causing an error
|
286
290
|
opts.delete(:nowait)
|
287
291
|
|
288
|
-
client.send_frame( Qrack::
|
292
|
+
client.send_frame( Qrack::Protocol09::Basic::Cancel.new({ :consumer_tag => consumer_tag }.merge(opts)))
|
289
293
|
|
290
294
|
end
|
291
295
|
|
@@ -315,15 +319,16 @@ bound to the direct exchange '' by default. If error occurs, a _Bunny_::_Protoco
|
|
315
319
|
|
316
320
|
bindings[exchange] = opts
|
317
321
|
client.send_frame(
|
318
|
-
Qrack::
|
322
|
+
Qrack::Protocol09::Queue::Bind.new({ :queue => name,
|
319
323
|
:exchange => exchange,
|
320
324
|
:routing_key => opts.delete(:key),
|
321
|
-
:nowait => false
|
325
|
+
:nowait => false,
|
326
|
+
:reserved_1 => 0 }.merge(opts))
|
322
327
|
)
|
323
328
|
|
324
329
|
raise Bunny::ProtocolError,
|
325
330
|
"Error binding queue #{name}" unless
|
326
|
-
client.next_method.is_a?(Qrack::
|
331
|
+
client.next_method.is_a?(Qrack::Protocol09::Queue::BindOk)
|
327
332
|
|
328
333
|
# return message
|
329
334
|
:bind_ok
|
@@ -356,16 +361,17 @@ Removes a queue binding from an exchange. If error occurs, a _Bunny_::_ProtocolE
|
|
356
361
|
bindings.delete(exchange)
|
357
362
|
|
358
363
|
client.send_frame(
|
359
|
-
Qrack::
|
364
|
+
Qrack::Protocol09::Queue::Unbind.new({ :queue => name,
|
360
365
|
:exchange => exchange,
|
361
366
|
:routing_key => opts.delete(:key),
|
362
|
-
:nowait => false
|
367
|
+
:nowait => false,
|
368
|
+
:reserved_1 => 0 }.merge(opts)
|
363
369
|
)
|
364
370
|
)
|
365
371
|
|
366
372
|
raise Bunny::ProtocolError,
|
367
373
|
"Error unbinding queue #{name}" unless
|
368
|
-
client.next_method.is_a?(Qrack::
|
374
|
+
client.next_method.is_a?(Qrack::Protocol09::Queue::UnbindOk)
|
369
375
|
|
370
376
|
# return message
|
371
377
|
:unbind_ok
|
@@ -400,12 +406,12 @@ from queues if successful. If an error occurs raises _Bunny_::_ProtocolError_.
|
|
400
406
|
opts.delete(:nowait)
|
401
407
|
|
402
408
|
client.send_frame(
|
403
|
-
Qrack::
|
409
|
+
Qrack::Protocol09::Queue::Delete.new({ :queue => name, :nowait => false, :reserved_1 => 0 }.merge(opts))
|
404
410
|
)
|
405
411
|
|
406
412
|
raise Bunny::ProtocolError,
|
407
413
|
"Error deleting queue #{name}" unless
|
408
|
-
client.next_method.is_a?(Qrack::
|
414
|
+
client.next_method.is_a?(Qrack::Protocol09::Queue::DeleteOk)
|
409
415
|
|
410
416
|
client.queues.delete(name)
|
411
417
|
|
@@ -435,10 +441,10 @@ without any formal "undo" mechanism. If an error occurs raises _Bunny_::_Protoco
|
|
435
441
|
opts.delete(:nowait)
|
436
442
|
|
437
443
|
client.send_frame(
|
438
|
-
Qrack::
|
444
|
+
Qrack::Protocol09::Queue::Purge.new({ :queue => name, :nowait => false, :reserved_1 => 0 }.merge(opts))
|
439
445
|
)
|
440
446
|
|
441
|
-
raise Bunny::ProtocolError, "Error purging queue #{name}" unless client.next_method.is_a?(Qrack::
|
447
|
+
raise Bunny::ProtocolError, "Error purging queue #{name}" unless client.next_method.is_a?(Qrack::Protocol09::Queue::PurgeOk)
|
442
448
|
|
443
449
|
# return confirmation
|
444
450
|
:purge_ok
|
@@ -447,7 +453,11 @@ without any formal "undo" mechanism. If an error occurs raises _Bunny_::_Protoco
|
|
447
453
|
|
448
454
|
private
|
449
455
|
def exchange
|
450
|
-
@exchange ||= Bunny::
|
456
|
+
@exchange ||= Bunny::Exchange09.new(client, '', { :type => :direct,
|
457
|
+
:key => name,
|
458
|
+
:reserved_1 => 0,
|
459
|
+
:reserved_2 => false,
|
460
|
+
:reserved_3 => false})
|
451
461
|
end
|
452
462
|
|
453
463
|
def bindings
|
data/lib/qrack/client.rb
CHANGED
@@ -6,8 +6,6 @@ module Qrack
|
|
6
6
|
opts = args.pop if args.last.is_a? Hash
|
7
7
|
opts ||= {}
|
8
8
|
|
9
|
-
@debug = 1 # XXX hack, p(obj) == '' if no instance vars are set
|
10
|
-
|
11
9
|
if args.size == 1 and args.first.is_a? Transport::Buffer
|
12
10
|
buf = args.shift
|
13
11
|
else
|
@@ -120,8 +118,7 @@ module Qrack
|
|
120
118
|
end
|
121
119
|
|
122
120
|
def method_missing meth, *args, &blk
|
123
|
-
@properties.has_key?(meth) || @klass.properties.find{|_,name| name == meth } ? @properties[meth] :
|
124
|
-
super
|
121
|
+
@properties.has_key?(meth) || @klass.properties.find{|_,name| name == meth } ? @properties[meth] : super
|
125
122
|
end
|
126
123
|
end
|
127
124
|
|
@@ -0,0 +1,133 @@
|
|
1
|
+
module Qrack
|
2
|
+
module Protocol09
|
3
|
+
#:stopdoc:
|
4
|
+
class Class::Method
|
5
|
+
def initialize *args
|
6
|
+
opts = args.pop if args.last.is_a? Hash
|
7
|
+
opts ||= {}
|
8
|
+
|
9
|
+
if args.size == 1 and args.first.is_a? Transport09::Buffer
|
10
|
+
buf = args.shift
|
11
|
+
else
|
12
|
+
buf = nil
|
13
|
+
end
|
14
|
+
|
15
|
+
self.class.arguments.each do |type, name|
|
16
|
+
val = buf ? buf.read(type) :
|
17
|
+
args.shift || opts[name] || opts[name.to_s]
|
18
|
+
instance_variable_set("@#{name}", val)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def arguments
|
23
|
+
self.class.arguments.inject({}) do |hash, (type, name)|
|
24
|
+
hash.update name => instance_variable_get("@#{name}")
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def to_binary
|
29
|
+
buf = Transport09::Buffer.new
|
30
|
+
buf.write :short, self.class.parent.id
|
31
|
+
buf.write :short, self.class.id
|
32
|
+
|
33
|
+
bits = []
|
34
|
+
|
35
|
+
self.class.arguments.each do |type, name|
|
36
|
+
val = instance_variable_get("@#{name}")
|
37
|
+
if type == :bit
|
38
|
+
bits << (val || false)
|
39
|
+
else
|
40
|
+
unless bits.empty?
|
41
|
+
buf.write :bit, bits
|
42
|
+
bits = []
|
43
|
+
end
|
44
|
+
buf.write type, val
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
buf.write :bit, bits unless bits.empty?
|
49
|
+
buf.rewind
|
50
|
+
|
51
|
+
buf
|
52
|
+
end
|
53
|
+
|
54
|
+
def to_s
|
55
|
+
to_binary.to_s
|
56
|
+
end
|
57
|
+
|
58
|
+
def to_frame channel = 0
|
59
|
+
Transport09::Method.new(self, channel)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
class Header
|
64
|
+
def initialize *args
|
65
|
+
opts = args.pop if args.last.is_a? Hash
|
66
|
+
opts ||= {}
|
67
|
+
|
68
|
+
first = args.shift
|
69
|
+
|
70
|
+
if first.is_a? ::Class and first.ancestors.include? Protocol09::Class
|
71
|
+
@klass = first
|
72
|
+
@size = args.shift || 0
|
73
|
+
@weight = args.shift || 0
|
74
|
+
@properties = opts
|
75
|
+
|
76
|
+
elsif first.is_a? Transport09::Buffer or first.is_a? String
|
77
|
+
buf = first
|
78
|
+
buf = Transport09::Buffer.new(buf) unless buf.is_a? Transport09::Buffer
|
79
|
+
|
80
|
+
@klass = Protocol09.classes[buf.read(:short)]
|
81
|
+
@weight = buf.read(:short)
|
82
|
+
@size = buf.read(:longlong)
|
83
|
+
|
84
|
+
props = buf.read(:properties, *klass.properties.map{|type,_| type })
|
85
|
+
@properties = Hash[*klass.properties.map{|_,name| name }.zip(props).reject{|k,v| v.nil? }.flatten]
|
86
|
+
|
87
|
+
else
|
88
|
+
raise ArgumentError, 'Invalid argument'
|
89
|
+
end
|
90
|
+
|
91
|
+
end
|
92
|
+
attr_accessor :klass, :size, :weight, :properties
|
93
|
+
|
94
|
+
def to_binary
|
95
|
+
buf = Transport09::Buffer.new
|
96
|
+
buf.write :short, klass.id
|
97
|
+
buf.write :short, weight # XXX rabbitmq only supports weight == 0
|
98
|
+
buf.write :longlong, size
|
99
|
+
buf.write :properties, (klass.properties.map do |type, name|
|
100
|
+
[ type, properties[name] || properties[name.to_s] ]
|
101
|
+
end)
|
102
|
+
buf.rewind
|
103
|
+
buf
|
104
|
+
end
|
105
|
+
|
106
|
+
def to_s
|
107
|
+
to_binary.to_s
|
108
|
+
end
|
109
|
+
|
110
|
+
def to_frame channel = 0
|
111
|
+
Transport09::Header.new(self, channel)
|
112
|
+
end
|
113
|
+
|
114
|
+
def == header
|
115
|
+
[ :klass, :size, :weight, :properties ].inject(true) do |eql, field|
|
116
|
+
eql and __send__(field) == header.__send__(field)
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
def method_missing meth, *args, &blk
|
121
|
+
@properties.has_key?(meth) || @klass.properties.find{|_,name| name == meth } ? @properties[meth] :
|
122
|
+
super
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
def self.parse buf
|
127
|
+
buf = Transport09::Buffer.new(buf) unless buf.is_a? Transport09::Buffer
|
128
|
+
class_id, method_id = buf.read(:short, :short)
|
129
|
+
classes[class_id].methods[method_id].new(buf)
|
130
|
+
end
|
131
|
+
|
132
|
+
end
|
133
|
+
end
|
@@ -6,7 +6,7 @@
|
|
6
6
|
# DO NOT EDIT! (edit ext/qparser.rb and config.yml instead, and run 'ruby qparser.rb')
|
7
7
|
|
8
8
|
module Qrack
|
9
|
-
module
|
9
|
+
module Protocol09
|
10
10
|
HEADER = "AMQP".freeze
|
11
11
|
VERSION_MAJOR = 0
|
12
12
|
VERSION_MINOR = 9
|
@@ -75,7 +75,7 @@ module Qrack
|
|
75
75
|
|
76
76
|
def arguments() @arguments ||= [] end
|
77
77
|
|
78
|
-
def parent()
|
78
|
+
def parent() Protocol09.const_get(self.to_s[/Protocol09::(.+?)::/,1]) end
|
79
79
|
def id() self::ID end
|
80
80
|
def name() self::NAME end
|
81
81
|
end
|
@@ -113,8 +113,8 @@ module Qrack
|
|
113
113
|
def self.inherited klass
|
114
114
|
klass.const_set(:ID, #{id})
|
115
115
|
klass.const_set(:NAME, :#{name.to_s})
|
116
|
-
|
117
|
-
|
116
|
+
Protocol09.classes[#{id}] = klass
|
117
|
+
Protocol09.classes[klass::NAME] = klass
|
118
118
|
end
|
119
119
|
]
|
120
120
|
end
|
@@ -123,7 +123,7 @@ module Qrack
|
|
123
123
|
end
|
124
124
|
|
125
125
|
module Qrack
|
126
|
-
module
|
126
|
+
module Protocol09
|
127
127
|
class Connection < Class( 10, :connection ); end
|
128
128
|
class Channel < Class( 20, :channel ); end
|
129
129
|
class Exchange < Class( 40, :exchange ); end
|