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