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
method_missing( method_name, *args)
Alias for: send
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
send!( method_name, *args)
Alias for: send

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