class RedisRpc::Client
Public Class Methods
new( redis_server, message_queue, timeout=0 )
click to toggle source
# File lib/redis-rpc.rb, line 44 def initialize( redis_server, message_queue, timeout=0 ) @redis_server = redis_server @message_queue = message_queue @timeout = timeout end
Public Instance Methods
get_timeout_at()
click to toggle source
# File lib/redis-rpc.rb, line 52 def get_timeout_at # allow mock to manipulate timeout to verify safety behavior Time.now.to_i + @timeout + 60 end
respond_to?( method_name )
click to toggle source
# File lib/redis-rpc.rb, line 89 def respond_to?( method_name ) send( :respond_to?, method_name ) end
send( method_name, *args)
click to toggle source
# File lib/redis-rpc.rb, line 57 def send( method_name, *args) raise MalformedRequestException, 'block not allowed over RPC' if block_given? # request setup function_call = {'name' => method_name.to_s, 'args' => args} response_queue = @message_queue + ':rpc:' + rand_string rpc_request = { 'function_call' => function_call, 'response_queue' => response_queue, 'timeout_at' => get_timeout_at, } rpc_raw_request = MultiJson.dump rpc_request # transport @redis_server.rpush @message_queue, rpc_raw_request message_queue, rpc_raw_response = @redis_server.blpop response_queue, @timeout raise TimeoutException if rpc_raw_response.nil? # response handling rpc_response = MultiJson.load rpc_raw_response raise RemoteException.new(rpc_response['exception'], rpc_response['backtrace']) if rpc_response.has_key? 'exception' raise MalformedResponseException, rpc_response unless rpc_response.has_key? 'return_value' return rpc_response['return_value'] rescue TimeoutException, SignalException # stale request cleanup @redis_server.lrem @message_queue, 0, rpc_raw_request raise $! end
Also aliased as: send!, method_missing
Private Instance Methods
rand_string(size=8)
click to toggle source
# File lib/redis-rpc.rb, line 95 def rand_string(size=8) return rand(36**size).to_s(36).upcase.rjust(size,'0') end