class RedPack::SimpleSyncClient

Attributes

timeout[RW]

Public Class Methods

new(redis, name, transcoder, timeout=0) click to toggle source
# File lib/redpack-ruby/clients.rb, line 50
def initialize(redis, name, transcoder, timeout=0)
  @redis = redis
  @queue_name = RedPack::Consts::queue_name(name)
  @transcoder = transcoder
  @msg_id_seq = 1
  @timeout = timeout
  @response_queue_name_generator = ResponseQueueNameGenerator.new(@redis)
  @msg_id_generator = MsgIdGenerator.new
end

Public Instance Methods

call(method, *params) click to toggle source
# File lib/redpack-ruby/clients.rb, line 69
def call(method, *params)
  msg_id = @msg_id_generator.next
  v = [RedPack::Consts::REQUEST, msg_id, method, params]
  return_queue_name = @response_queue_name_generator.new_name
  packed = @transcoder.pack({'data' => v,
                              'return' => return_queue_name,})
  @redis.multi
  @redis.rpush(@queue_name, packed)
  @redis.exec
  # TODO: refactor...
  while true do
    popped = @redis.blpop(return_queue_name, @timeout)
    if not popped.nil? then
      unpacked = @transcoder.unpack(popped[1])
      datum = unpacked['data']
      # TODO: assert(unpacked[0] == RedPack::Consts::RESPONSE)
      msg_id = datum[1]
      err = datum[2]
      retval = datum[3]
      if err.nil? then
        return retval
      else
        # FIXME: more-than-this?
        raise Exception.new(err)
      end
    else
      raise Exception.new('pop-timed-out')
    end
  end
end
call_async(method, *params, &cb) click to toggle source

TODO: forwarding?

# File lib/redpack-ruby/clients.rb, line 62
def call_async(method, *params, &cb)
  Thread.new do
    result = self.call(method, *params)
    cb.call(result)
  end
end
notify(method, *params) click to toggle source
# File lib/redpack-ruby/clients.rb, line 101
def notify(method, *params)
  v = [RedPack::Consts::NOTIFY, method, params]
  return @redis.rpush(@queue_name, @transcoder.pack({'data' => v})) > 0
end