bunny 0.5.2 → 0.5.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,8 +1,8 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = %q{bunny}
3
- s.version = "0.5.2"
3
+ s.version = "0.5.3"
4
4
  s.authors = ["Chris Duncan"]
5
- s.date = %q{2009-08-17}
5
+ s.date = %q{2009-09-07}
6
6
  s.description = %q{Another synchronous Ruby AMQP client}
7
7
  s.email = %q{celldee@gmail.com}
8
8
  s.rubyforge_project = %q{bunny-amqp}
@@ -39,6 +39,8 @@ Gem::Specification.new do |s|
39
39
  "lib/bunny/queue08.rb",
40
40
  "lib/bunny/queue09.rb",
41
41
  "lib/qrack/client.rb",
42
+ "lib/qrack/channel.rb",
43
+ "lib/qrack/queue.rb",
42
44
  "lib/qrack/protocol/protocol08.rb",
43
45
  "lib/qrack/protocol/protocol09.rb",
44
46
  "lib/qrack/protocol/spec08.rb",
@@ -48,12 +48,12 @@ q.bind(exch, :key => 'fred')
48
48
  i = 1
49
49
 
50
50
  # subscribe to queue
51
- ret = q.subscribe(:consumer_tag => 'testtag1', :timeout => 30) do |msg|
52
- puts "#{i.to_s}: #{msg}"
53
- i+=1
54
- end
55
-
56
- if ret == :timed_out
51
+ begin
52
+ ret = q.subscribe(:consumer_tag => 'testtag1', :timeout => 30) do |msg|
53
+ puts "#{i.to_s}: #{msg}"
54
+ i+=1
55
+ end
56
+ rescue Qrack::ClientTimeout
57
57
  puts '==== simple_consumer_08.rb timed out - closing down ===='
58
58
  q.unsubscribe(:consumer_tag => 'testtag1')
59
59
  # close the connection
@@ -48,12 +48,12 @@ q.bind(exch, :key => 'fred')
48
48
  i = 1
49
49
 
50
50
  # subscribe to queue
51
- ret = q.subscribe(:consumer_tag => 'testtag1', :timeout => 30) do |msg|
52
- puts "#{i.to_s}: #{msg}"
53
- i+=1
54
- end
55
-
56
- if ret == :timed_out
51
+ begin
52
+ ret = q.subscribe(:consumer_tag => 'testtag1', :timeout => 30) do |msg|
53
+ puts "#{i.to_s}: #{msg}"
54
+ i+=1
55
+ end
56
+ rescue Qrack::ClientTimeout
57
57
  puts '==== simple_consumer_09.rb timed out - closing down ===='
58
58
  q.unsubscribe(:consumer_tag => 'testtag1')
59
59
  # close the connection
@@ -12,7 +12,7 @@ module Bunny
12
12
  class ConnectionError < StandardError; end
13
13
  class MessageError < StandardError; end
14
14
 
15
- VERSION = '0.5.2'
15
+ VERSION = '0.5.3'
16
16
 
17
17
  # Returns the Bunny version number
18
18
 
@@ -1,13 +1,8 @@
1
1
  module Bunny
2
- class Channel
3
- attr_accessor :number, :active
4
- attr_reader :client
2
+ class Channel < Qrack::Channel
5
3
 
6
- def initialize(client, zero = false)
7
- @client = client
8
- zero ? @number = 0 : @number = client.channels.size
9
- @active = false
10
- client.channels[@number] ||= self
4
+ def initialize(client)
5
+ super
11
6
  end
12
7
 
13
8
  def open
@@ -1,13 +1,8 @@
1
1
  module Bunny
2
- class Channel09
3
- attr_accessor :number, :active
4
- attr_reader :client
2
+ class Channel09 < Qrack::Channel
5
3
 
6
- def initialize(client, zero = false)
7
- @client = client
8
- zero ? @number = 0 : @number = client.channels.size
9
- @active = false
10
- client.channels[@number] ||= self
4
+ def initialize(client)
5
+ super
11
6
  end
12
7
 
13
8
  def open
@@ -41,30 +41,30 @@ Sets up a Bunny::Client object ready for connection to a broker/server. _Client_
41
41
  =end
42
42
 
43
43
  def initialize(opts = {})
44
+ super
44
45
  @spec = '0-8'
45
- @host = opts[:host] || 'localhost'
46
46
  @port = opts[:port] || Qrack::Protocol::PORT
47
- @user = opts[:user] || 'guest'
48
- @pass = opts[:pass] || 'guest'
49
- @vhost = opts[:vhost] || '/'
50
- @logfile = opts[:logfile] || nil
51
- @logging = opts[:logging] || false
52
47
  @insist = opts[:insist]
53
- @status = :not_connected
54
- @frame_max = opts[:frame_max] || 131072
55
- @channel_max = opts[:channel_max] || 0
56
- @heartbeat = opts[:heartbeat] || 0
57
- @logger = nil
58
- create_logger if @logging
59
- @channels = []
60
- # Create channel 0
61
- @channel = Bunny::Channel.new(self, true)
62
- @exchanges = {}
63
- @queues = {}
64
- @heartbeat_in = false
65
- @connecting = false
66
48
  end
67
49
 
50
+ def close_connection
51
+ # Set client channel to zero
52
+ switch_channel(0)
53
+
54
+ send_frame(
55
+ Qrack::Protocol::Connection::Close.new(:reply_code => 200, :reply_text => 'Goodbye', :class_id => 0, :method_id => 0)
56
+ )
57
+ raise Bunny::ProtocolError, "Error closing connection" unless next_method.is_a?(Qrack::Protocol::Connection::CloseOk)
58
+ end
59
+
60
+ def create_channel
61
+ channels.each do |c|
62
+ return c if (!c.open? and c.number != 0)
63
+ end
64
+ # If no channel to re-use instantiate new one
65
+ Bunny::Channel.new(self)
66
+ end
67
+
68
68
  =begin rdoc
69
69
 
70
70
  === DESCRIPTION:
@@ -95,6 +95,135 @@ Exchange
95
95
  return exchanges[name] if exchanges.has_key?(name)
96
96
  Bunny::Exchange.new(self, name, opts)
97
97
  end
98
+
99
+ def init_connection
100
+ write(Qrack::Protocol::HEADER)
101
+ write([1, 1, Qrack::Protocol::VERSION_MAJOR, Qrack::Protocol::VERSION_MINOR].pack('C4'))
102
+
103
+ frame = next_frame
104
+ if frame.nil? or !frame.payload.is_a?(Qrack::Protocol::Connection::Start)
105
+ raise Bunny::ProtocolError, 'Connection initiation failed'
106
+ end
107
+ end
108
+
109
+ def next_frame(opts = {})
110
+ frame = nil
111
+
112
+ case
113
+ when channel.frame_buffer.size > 0
114
+ frame = channel.frame_buffer.shift
115
+ when opts.has_key?(:timeout)
116
+ Timeout::timeout(opts[:timeout], Qrack::ClientTimeout) do
117
+ frame = Qrack::Transport::Frame.parse(buffer)
118
+ end
119
+ else
120
+ frame = Qrack::Transport::Frame.parse(buffer)
121
+ end
122
+
123
+ @logger.info("received") { frame } if @logging
124
+
125
+ raise Bunny::ConnectionError, 'No connection to server' if (frame.nil? and !connecting?)
126
+
127
+ # Monitor server activity and discard heartbeats
128
+ @message_in = true
129
+
130
+ case
131
+ when frame.is_a?(Qrack::Transport::Heartbeat)
132
+ next_frame(opts)
133
+ when frame.nil?
134
+ frame
135
+ when ((frame.channel != channel.number) and (frame.channel != 0))
136
+ channel.frame_buffer << frame
137
+ next_frame(opts)
138
+ else
139
+ frame
140
+ end
141
+
142
+ end
143
+
144
+ def open_connection
145
+ send_frame(
146
+ Qrack::Protocol::Connection::StartOk.new(
147
+ {:platform => 'Ruby', :product => 'Bunny', :information => 'http://github.com/celldee/bunny', :version => VERSION},
148
+ 'AMQPLAIN',
149
+ {:LOGIN => @user, :PASSWORD => @pass},
150
+ 'en_US'
151
+ )
152
+ )
153
+
154
+ frame = next_frame
155
+ raise Bunny::ProtocolError, "Connection failed - user: #{@user}, pass: #{@pass}" if frame.nil?
156
+
157
+ method = frame.payload
158
+
159
+ if method.is_a?(Qrack::Protocol::Connection::Tune)
160
+ send_frame(
161
+ Qrack::Protocol::Connection::TuneOk.new( :channel_max => @channel_max, :frame_max => @frame_max, :heartbeat => @heartbeat)
162
+ )
163
+ end
164
+
165
+ send_frame(
166
+ Qrack::Protocol::Connection::Open.new(:virtual_host => @vhost, :capabilities => '', :insist => @insist)
167
+ )
168
+
169
+ case method = next_method
170
+ when Qrack::Protocol::Connection::OpenOk
171
+ return :ok
172
+ when Qrack::Protocol::Connection::Redirect
173
+ raise Bunny::ConnectionError, "Cannot connect to the specified server - host: #{@host}, port: #{@port}" if @insist
174
+
175
+ @host, @port = method.host.split(':')
176
+ close_socket
177
+ else
178
+ raise Bunny::ProtocolError, 'Cannot open connection'
179
+ end
180
+ end
181
+
182
+ =begin rdoc
183
+
184
+ === DESCRIPTION:
185
+
186
+ Requests a specific quality of service. The QoS can be specified for the current channel
187
+ or for all channels on the connection. The particular properties and semantics of a QoS
188
+ method always depend on the content class semantics. Though the QoS method could in principle
189
+ apply to both peers, it is currently meaningful only for the server.
190
+
191
+ ==== Options:
192
+
193
+ * <tt>:prefetch_size => size in no. of octets (default = 0)</tt> - The client can request that
194
+ messages be sent in advance so that when the client finishes processing a message, the following
195
+ message is already held locally, rather than needing to be sent down the channel. Prefetching gives
196
+ a performance improvement. This field specifies the prefetch window size in octets. The server
197
+ will send a message in advance if it is equal to or smaller in size than the available prefetch
198
+ size (and also falls into other prefetch limits). May be set to zero, meaning "no specific limit",
199
+ although other prefetch limits may still apply. The prefetch-size is ignored if the no-ack option
200
+ is set.
201
+ * <tt>:prefetch_count => no. messages (default = 1)</tt> - Specifies a prefetch window in terms
202
+ of whole messages. This field may be used in combination with the prefetch-size field; a message
203
+ will only be sent in advance if both prefetch windows (and those at the channel and connection level)
204
+ allow it. The prefetch-count is ignored if the no-ack option is set.
205
+ * <tt>:global => true or false (_default_)</tt> - By default the QoS settings apply to the current channel only. If set to
206
+ true, they are applied to the entire connection.
207
+
208
+ ==== RETURNS:
209
+
210
+ <tt>:qos_ok</tt> if successful.
211
+
212
+ =end
213
+
214
+ def qos(opts = {})
215
+
216
+ send_frame(
217
+ Qrack::Protocol::Basic::Qos.new({ :prefetch_size => 0, :prefetch_count => 1, :global => false }.merge(opts))
218
+ )
219
+
220
+ raise Bunny::ProtocolError,
221
+ "Error specifying Quality of Service" unless
222
+ next_method.is_a?(Qrack::Protocol::Basic::QosOk)
223
+
224
+ # return confirmation
225
+ :qos_ok
226
+ end
98
227
 
99
228
  =begin rdoc
100
229
 
@@ -140,131 +269,63 @@ Queue
140
269
 
141
270
  Bunny::Queue.new(self, name, opts)
142
271
  end
143
-
144
- def send_heartbeat
145
- # Create a new heartbeat frame
146
- hb = Qrack::Transport::Heartbeat.new('')
147
- # Channel 0 must be used
148
- switch_channel(0) if @channel.number > 0
149
- # Send the heartbeat to server
150
- send_frame(hb)
151
- end
152
-
153
- def send_frame(*args)
154
- args.each do |data|
155
- data.ticket = ticket if ticket and data.respond_to?(:ticket=)
156
- data = data.to_frame(channel.number) unless data.is_a?(Qrack::Transport::Frame)
157
- data.channel = channel.number
158
-
159
- @logger.info("send") { data } if @logging
160
- write(data.to_s)
161
- end
162
-
163
- nil
164
- end
165
-
166
- def next_frame(opts = {})
167
- secs = opts[:timeout] || 0
168
-
169
- begin
170
- Timeout::timeout(secs) do
171
- @frame = Qrack::Transport::Frame.parse(buffer)
172
- end
173
- rescue Timeout::Error
174
- return :timed_out
175
- end
176
-
177
- @logger.info("received") { @frame } if @logging
178
-
179
- raise Bunny::ConnectionError, 'No connection to server' if (@frame.nil? and !connecting?)
180
-
181
- if @frame.is_a?(Qrack::Transport::Heartbeat)
182
- @heartbeat_in = true
183
- next_frame
184
- end
185
-
186
- @frame
187
- end
188
-
189
- def next_payload
190
- frame = next_frame
191
- frame.payload
192
- end
193
-
194
- alias next_method next_payload
195
-
196
- =begin rdoc
197
-
198
- === DESCRIPTION:
199
-
200
- Checks to see whether or not an undeliverable message has been returned as a result of a publish
201
- with the <tt>:immediate</tt> or <tt>:mandatory</tt> options.
202
-
203
- ==== OPTIONS:
204
-
205
- * <tt>:timeout => number of seconds (default = 0.1) - The method will wait for a return
206
- message until this timeout interval is reached.
207
-
208
- ==== RETURNS:
209
-
210
- <tt>:no_return</tt> if message was not returned before timeout .
211
- <tt>{:header, :return_details, :payload}</tt> if message is returned. <tt>:return_details</tt> is
212
- a hash <tt>{:reply_code, :reply_text, :exchange, :routing_key}</tt>.
213
-
214
- =end
215
-
216
- def returned_message(opts = {})
217
- secs = opts[:timeout] || 0.1
218
- frame = next_frame(:timeout => secs)
219
-
220
- if frame.is_a?(Symbol)
221
- return :no_return if frame == :timed_out
222
- end
223
-
224
- method = frame.payload
225
- header = next_payload
226
- msg = next_payload
227
- raise Bunny::MessageError, 'unexpected length' if msg.length < header.size
228
-
229
- # Return the message and related info
230
- {:header => header, :payload => msg, :return_details => method.arguments}
231
- end
232
272
 
233
273
  =begin rdoc
234
274
 
235
275
  === DESCRIPTION:
236
276
 
237
- Closes the current communication channel and connection. If an error occurs a
238
- _Bunny_::_ProtocolError_ is raised. If successful, _Client_._status_ is set to <tt>:not_connected</tt>.
277
+ Asks the broker to redeliver all unacknowledged messages on a specified channel. Zero or
278
+ more messages may be redelivered.
239
279
 
240
- ==== RETURNS:
280
+ ==== Options:
241
281
 
242
- <tt>:not_connected</tt> if successful.
282
+ * <tt>:requeue => true or false (_default_)</tt> - If set to _false_, the message will be
283
+ redelivered to the original recipient. If set to _true_, the server will attempt to requeue
284
+ the message, potentially then delivering it to an alternative subscriber.
243
285
 
244
286
  =end
245
287
 
246
- def close
247
- # Close all active channels
248
- channels.each do |c|
249
- c.close if c.open?
250
- end
288
+ def recover(opts = {})
251
289
 
252
- # Close connection to AMQP server
253
- close_connection
290
+ send_frame(
291
+ Qrack::Protocol::Basic::Recover.new({ :requeue => false }.merge(opts))
292
+ )
254
293
 
255
- # Close TCP Socket
256
- close_socket
257
- end
294
+ end
295
+
296
+ def request_access
297
+ send_frame(
298
+ Qrack::Protocol::Access::Request.new(:realm => '/data', :read => true, :write => true, :active => true, :passive => true)
299
+ )
300
+ method = next_method
301
+ raise Bunny::ProtocolError, 'Access denied' unless method.is_a?(Qrack::Protocol::Access::RequestOk)
302
+ self.ticket = method.ticket
303
+ end
304
+
305
+ def send_frame(*args)
306
+ args.each do |data|
307
+ data.ticket = ticket if ticket and data.respond_to?(:ticket=)
308
+ data = data.to_frame(channel.number) unless data.is_a?(Qrack::Transport::Frame)
309
+ data.channel = channel.number
258
310
 
259
- alias stop close
311
+ @logger.info("send") { data } if @logging
312
+ write(data.to_s)
260
313
 
261
- def read(*args)
262
- send_command(:read, *args)
263
- end
314
+ # Monitor client activity for heartbeat purposes
315
+ @message_out = true
316
+ end
264
317
 
265
- def write(*args)
266
- send_command(:write, *args)
318
+ nil
267
319
  end
320
+
321
+ def send_heartbeat
322
+ # Create a new heartbeat frame
323
+ hb = Qrack::Transport::Heartbeat.new('')
324
+ # Channel 0 must be used
325
+ switch_channel(0) if @channel.number > 0
326
+ # Send the heartbeat to server
327
+ send_frame(hb)
328
+ end
268
329
 
269
330
  =begin rdoc
270
331
 
@@ -310,101 +371,20 @@ _Bunny_::_ProtocolError_ is raised. If successful, _Client_._status_ is set to <
310
371
 
311
372
  =begin rdoc
312
373
 
313
- === DESCRIPTION:
314
-
315
- Asks the broker to redeliver all unacknowledged messages on a specified channel. Zero or
316
- more messages may be redelivered.
317
-
318
- ==== Options:
319
-
320
- * <tt>:requeue => true or false (_default_)</tt> - If set to _false_, the message will be
321
- redelivered to the original recipient. If set to _true_, the server will attempt to requeue
322
- the message, potentially then delivering it to an alternative subscriber.
323
-
324
- =end
325
-
326
- def recover(opts = {})
327
-
328
- send_frame(
329
- Qrack::Protocol::Basic::Recover.new({ :requeue => false }.merge(opts))
330
- )
331
-
332
- end
333
-
334
- =begin rdoc
335
-
336
- === DESCRIPTION:
337
-
338
- Requests a specific quality of service. The QoS can be specified for the current channel
339
- or for all channels on the connection. The particular properties and semantics of a QoS
340
- method always depend on the content class semantics. Though the QoS method could in principle
341
- apply to both peers, it is currently meaningful only for the server.
342
-
343
- ==== Options:
344
-
345
- * <tt>:prefetch_size => size in no. of octets (default = 0)</tt> - The client can request that
346
- messages be sent in advance so that when the client finishes processing a message, the following
347
- message is already held locally, rather than needing to be sent down the channel. Prefetching gives
348
- a performance improvement. This field specifies the prefetch window size in octets. The server
349
- will send a message in advance if it is equal to or smaller in size than the available prefetch
350
- size (and also falls into other prefetch limits). May be set to zero, meaning "no specific limit",
351
- although other prefetch limits may still apply. The prefetch-size is ignored if the no-ack option
352
- is set.
353
- * <tt>:prefetch_count => no. messages (default = 1)</tt> - Specifies a prefetch window in terms
354
- of whole messages. This field may be used in combination with the prefetch-size field; a message
355
- will only be sent in advance if both prefetch windows (and those at the channel and connection level)
356
- allow it. The prefetch-count is ignored if the no-ack option is set.
357
- * <tt>:global => true or false (_default_)</tt> - By default the QoS settings apply to the current channel only. If set to
358
- true, they are applied to the entire connection.
359
-
360
- =end
361
-
362
- def qos(opts = {})
363
-
364
- send_frame(
365
- Qrack::Protocol::Basic::Qos.new({ :prefetch_size => 0, :prefetch_count => 1, :global => false }.merge(opts))
366
- )
367
-
368
- raise Bunny::ProtocolError,
369
- "Error specifying Quality of Service" unless
370
- next_method.is_a?(Qrack::Protocol::Basic::QosOk)
371
-
372
- # return confirmation
373
- :qos_ok
374
- end
375
-
376
- =begin rdoc
377
-
378
- === DESCRIPTION:
379
- This method sets the channel to use standard transactions. The
380
- client must use this method at least once on a channel before
381
- using the Commit or Rollback methods.
382
-
383
- =end
384
-
385
- def tx_select
386
- send_frame(Qrack::Protocol::Tx::Select.new())
387
-
388
- raise Bunny::ProtocolError,
389
- "Error initiating transactions for current channel" unless
390
- next_method.is_a?(Qrack::Protocol::Tx::SelectOk)
391
-
392
- # return confirmation
393
- :select_ok
394
- end
395
-
396
- =begin rdoc
397
-
398
374
  === DESCRIPTION:
399
375
  This method commits all messages published and acknowledged in
400
376
  the current transaction. A new transaction starts immediately
401
377
  after a commit.
402
378
 
379
+ ==== RETURNS:
380
+
381
+ <tt>:commit_ok</tt> if successful.
382
+
403
383
  =end
404
-
384
+
405
385
  def tx_commit
406
386
  send_frame(Qrack::Protocol::Tx::Commit.new())
407
-
387
+
408
388
  raise Bunny::ProtocolError,
409
389
  "Error commiting transaction" unless
410
390
  next_method.is_a?(Qrack::Protocol::Tx::CommitOk)
@@ -420,11 +400,15 @@ This method abandons all messages published and acknowledged in
420
400
  the current transaction. A new transaction starts immediately
421
401
  after a rollback.
422
402
 
403
+ ==== RETURNS:
404
+
405
+ <tt>:rollback_ok</tt> if successful.
406
+
423
407
  =end
424
-
408
+
425
409
  def tx_rollback
426
410
  send_frame(Qrack::Protocol::Tx::Rollback.new())
427
-
411
+
428
412
  raise Bunny::ProtocolError,
429
413
  "Error rolling back transaction" unless
430
414
  next_method.is_a?(Qrack::Protocol::Tx::RollbackOk)
@@ -432,98 +416,29 @@ after a rollback.
432
416
  # return confirmation
433
417
  :rollback_ok
434
418
  end
435
-
436
- def logging=(bool)
437
- @logging = bool
438
- create_logger if @logging
439
- end
440
-
441
- def create_channel
442
- channels.each do |c|
443
- return c if (!c.open? and c.number != 0)
444
- end
445
- # If no channel to re-use instantiate new one
446
- Bunny::Channel.new(self)
447
- end
448
-
449
- def switch_channel(chann)
450
- if (0...channels.size).include? chann
451
- @channel = channels[chann]
452
- chann
453
- else
454
- raise RuntimeError, "Invalid channel number - #{chann}"
455
- end
456
- end
457
-
458
- def connecting?
459
- connecting
460
- end
461
-
462
- def init_connection
463
- write(Qrack::Protocol::HEADER)
464
- write([1, 1, Qrack::Protocol::VERSION_MAJOR, Qrack::Protocol::VERSION_MINOR].pack('C4'))
465
419
 
466
- frame = next_frame
467
- if frame.nil? or !frame.payload.is_a?(Qrack::Protocol::Connection::Start)
468
- raise Bunny::ProtocolError, 'Connection initiation failed'
469
- end
470
- end
471
-
472
- def open_connection
473
- send_frame(
474
- Qrack::Protocol::Connection::StartOk.new(
475
- {:platform => 'Ruby', :product => 'Bunny', :information => 'http://github.com/celldee/bunny', :version => VERSION},
476
- 'AMQPLAIN',
477
- {:LOGIN => @user, :PASSWORD => @pass},
478
- 'en_US'
479
- )
480
- )
420
+ =begin rdoc
481
421
 
482
- frame = next_frame
483
- raise Bunny::ProtocolError, "Connection failed - user: #{@user}, pass: #{@pass}" if frame.nil?
484
-
485
- method = frame.payload
422
+ === DESCRIPTION:
423
+ This method sets the channel to use standard transactions. The
424
+ client must use this method at least once on a channel before
425
+ using the Commit or Rollback methods.
486
426
 
487
- if method.is_a?(Qrack::Protocol::Connection::Tune)
488
- send_frame(
489
- Qrack::Protocol::Connection::TuneOk.new( :channel_max => @channel_max, :frame_max => @frame_max, :heartbeat => @heartbeat)
490
- )
491
- end
427
+ ==== RETURNS:
492
428
 
493
- send_frame(
494
- Qrack::Protocol::Connection::Open.new(:virtual_host => @vhost, :capabilities => '', :insist => @insist)
495
- )
429
+ <tt>:select_ok</tt> if successful.
496
430
 
497
- case method = next_method
498
- when Qrack::Protocol::Connection::OpenOk
499
- return :ok
500
- when Qrack::Protocol::Connection::Redirect
501
- raise Bunny::ConnectionError, "Cannot connect to the specified server - host: #{@host}, port: #{@port}" if @insist
502
-
503
- @host, @port = method.host.split(':')
504
- close_socket
505
- else
506
- raise Bunny::ProtocolError, 'Cannot open connection'
507
- end
508
- end
431
+ =end
509
432
 
510
- def close_connection
511
- # Set client channel to zero
512
- switch_channel(0)
513
-
514
- send_frame(
515
- Qrack::Protocol::Connection::Close.new(:reply_code => 200, :reply_text => 'Goodbye', :class_id => 0, :method_id => 0)
516
- )
517
- raise Bunny::ProtocolError, "Error closing connection" unless next_method.is_a?(Qrack::Protocol::Connection::CloseOk)
518
- end
433
+ def tx_select
434
+ send_frame(Qrack::Protocol::Tx::Select.new())
435
+
436
+ raise Bunny::ProtocolError,
437
+ "Error initiating transactions for current channel" unless
438
+ next_method.is_a?(Qrack::Protocol::Tx::SelectOk)
519
439
 
520
- def request_access
521
- send_frame(
522
- Qrack::Protocol::Access::Request.new(:realm => '/data', :read => true, :write => true, :active => true, :passive => true)
523
- )
524
- method = next_method
525
- raise Bunny::ProtocolError, 'Access denied' unless method.is_a?(Qrack::Protocol::Access::RequestOk)
526
- self.ticket = method.ticket
440
+ # return confirmation
441
+ :select_ok
527
442
  end
528
443
 
529
444
  private
@@ -532,47 +447,5 @@ after a rollback.
532
447
  @buffer ||= Qrack::Transport::Buffer.new(self)
533
448
  end
534
449
 
535
- def send_command(cmd, *args)
536
- begin
537
- raise Bunny::ConnectionError, 'No connection - socket has not been created' if !@socket
538
- @socket.__send__(cmd, *args)
539
- rescue Errno::EPIPE, IOError => e
540
- raise Bunny::ServerDownError, e.message
541
- end
542
- end
543
-
544
- def socket
545
- return @socket if @socket and (@status == :connected) and not @socket.closed?
546
-
547
- begin
548
- # Attempt to connect.
549
- @socket = timeout(CONNECT_TIMEOUT) do
550
- TCPSocket.new(host, port)
551
- end
552
-
553
- if Socket.constants.include? 'TCP_NODELAY'
554
- @socket.setsockopt Socket::IPPROTO_TCP, Socket::TCP_NODELAY, 1
555
- end
556
- rescue => e
557
- @status = :not_connected
558
- raise Bunny::ServerDownError, e.message
559
- end
560
-
561
- @socket
562
- end
563
-
564
- def close_socket(reason=nil)
565
- # Close the socket. The server is not considered dead.
566
- @socket.close if @socket and not @socket.closed?
567
- @socket = nil
568
- @status = :not_connected
569
- end
570
-
571
- def create_logger
572
- @logfile ? @logger = Logger.new("#{logfile}") : @logger = Logger.new(STDOUT)
573
- @logger.level = Logger::INFO
574
- @logger.datetime_format = "%Y-%m-%d %H:%M:%S"
575
- end
576
-
577
450
  end
578
451
  end