class GemeraldBeanstalk::Connection

Constants

BEGIN_REQUEST_STATES

Attributes

beanstalk[R]
mutex[R]
producer[W]
tube_used[R]
tubes_watched[R]
waiting[W]
worker[W]

Public Class Methods

new(beanstalk, connection = nil) click to toggle source
# File lib/gemerald_beanstalk/connection.rb, line 78
def initialize(beanstalk, connection = nil)
  @beanstalk = beanstalk
  @connection = connection
  @inbound_state = :ready
  @mutex = Mutex.new
  @outbound_state = :ready
  @tube_used = 'default'
  @tubes_watched = Set.new(%w[default])
end

Public Instance Methods

alive?() click to toggle source
# File lib/gemerald_beanstalk/connection.rb, line 9
def alive?
  return @inbound_state != :closed && @oubound_state != :closed
end
begin_multi_part_request(multi_part_request) click to toggle source
# File lib/gemerald_beanstalk/connection.rb, line 14
def begin_multi_part_request(multi_part_request)
  return false unless outbound_ready?
  @multi_part_request = multi_part_request
  @outbound_state = :multi_part_request_in_progress
  return true
end
begin_request() click to toggle source
# File lib/gemerald_beanstalk/connection.rb, line 22
def begin_request
  return false unless BEGIN_REQUEST_STATES.include?(@outbound_state)
  @outbound_state = :request_in_progress
  return true
end
close_connection() click to toggle source
# File lib/gemerald_beanstalk/connection.rb, line 29
def close_connection
  @inbound_state = @outbound_state = :closed
  @connection.close_connection unless @connection.nil?
end
complete_request() click to toggle source
# File lib/gemerald_beanstalk/connection.rb, line 35
def complete_request
  return false unless request_in_progress?
  @outbound_state = :ready
  return true
end
execute(raw_command) click to toggle source
# File lib/gemerald_beanstalk/connection.rb, line 42
def execute(raw_command)
  command = response = nil
  @mutex.synchronize do
    return if waiting? || request_in_progress?
    puts "#{Time.now.to_f}: #{raw_command}" if ENV['VERBOSE']
    if multi_part_request_in_progress?
      (command = @multi_part_request).body = raw_command
    else
      command = GemeraldBeanstalk::Command.new(raw_command, self)
      if !command.valid?
        response = command.error
      elsif command.multi_part_request?
        return begin_multi_part_request(command)
      end
    end
    begin_request
  end
  puts "#{Time.now.to_f}: #{command.inspect}" if ENV['VERBOSE']
  # Execute command unless parsing already yielded a response
  response ||= beanstalk.execute(command)
  transmit(response) unless response.nil?
end
ignore(tube, force = false) click to toggle source
# File lib/gemerald_beanstalk/connection.rb, line 66
def ignore(tube, force = false)
  return nil unless @tubes_watched.length > 1 || force
  @tubes_watched.delete(tube)
  return @tubes_watched.length
end
inbound_ready?() click to toggle source
# File lib/gemerald_beanstalk/connection.rb, line 73
def inbound_ready?
  return @inbound_state == :ready
end
multi_part_request_in_progress?() click to toggle source
# File lib/gemerald_beanstalk/connection.rb, line 89
def multi_part_request_in_progress?
  return @outbound_state == :multi_part_request_in_progress
end
outbound_ready?() click to toggle source
# File lib/gemerald_beanstalk/connection.rb, line 94
def outbound_ready?
  return @outbound_state == :ready
end
producer?() click to toggle source
# File lib/gemerald_beanstalk/connection.rb, line 99
def producer?
  return !!@producer
end
request_in_progress?() click to toggle source
# File lib/gemerald_beanstalk/connection.rb, line 104
def request_in_progress?
  return @outbound_state == :request_in_progress
end
response_received() click to toggle source
# File lib/gemerald_beanstalk/connection.rb, line 109
def response_received
  return false unless waiting? || timed_out?
  @inbound_state = :ready
  return true
end
timed_out?() click to toggle source
# File lib/gemerald_beanstalk/connection.rb, line 116
def timed_out?
  return @inbound_state == :timed_out
end
transmit(message) click to toggle source
# File lib/gemerald_beanstalk/connection.rb, line 121
def transmit(message)
  return if !alive? || @connection.nil?
  puts "#{Time.now.to_f}: #{message}" if ENV['VERBOSE']
  @connection.send_data(message)
  complete_request
  response_received
  return self
end
use(tube_name) click to toggle source
# File lib/gemerald_beanstalk/connection.rb, line 131
def use(tube_name)
  @tube_used = tube_name
end
wait(timeout = nil) click to toggle source
# File lib/gemerald_beanstalk/connection.rb, line 136
def wait(timeout = nil)
  return false unless inbound_ready?
  @wait_timeout = timeout
  @inbound_state = :waiting
  return true
end
wait_timed_out() click to toggle source
# File lib/gemerald_beanstalk/connection.rb, line 144
def wait_timed_out
  return false unless @inbound_state == :waiting
  @wait_timeout = nil
  @inbound_state = :timed_out
  return true
end
waiting?() click to toggle source
# File lib/gemerald_beanstalk/connection.rb, line 152
def waiting?
  return false unless @inbound_state == :waiting
  return true if @wait_timeout.nil? || @wait_timeout > Time.now.to_f
  wait_timed_out
  return false
end
watch(tube) click to toggle source
# File lib/gemerald_beanstalk/connection.rb, line 160
def watch(tube)
  @tubes_watched << tube
  return @tubes_watched.length
end
worker?() click to toggle source
# File lib/gemerald_beanstalk/connection.rb, line 166
def worker?
  return !!@worker
end