class RedisRpc::Server

Public Class Methods

new( redis_server, message_queue, local_object, timeout=nil, verbose: false) click to toggle source
# File lib/redis-rpc.rb, line 101
def initialize( redis_server, message_queue, local_object, timeout=nil, verbose: false)
  @redis_server = redis_server
  @message_queue = message_queue
  @local_object = local_object
  @timeout = timeout
  @verbose = verbose
end

Public Instance Methods

flush_queue!() click to toggle source
# File lib/redis-rpc.rb, line 118
def flush_queue!
  @redis_server.del @message_queue
end
run() click to toggle source
# File lib/redis-rpc.rb, line 109
def run
  loop{ run_one }
end
run!() click to toggle source
# File lib/redis-rpc.rb, line 113
def run!
  flush_queue!
  run
end

Private Instance Methods

run_one() click to toggle source
# File lib/redis-rpc.rb, line 124
def run_one
  # request setup
  message_queue, rpc_raw_request = @redis_server.blpop @message_queue, timeout
  return nil if rpc_raw_request.nil?
  rpc_request = MultiJson.load rpc_raw_request
  response_queue = rpc_request['response_queue']
  function_call = rpc_request['function_call']

  # request execution
  begin
    if rpc_request['timeout_at'].nil?
      raise "Unsafe RPC call: timeout_at not specified"
    end

    if rpc_request['timeout_at'] < Time.now.to_i
      raise "Expired RPC call. timeout_at = #{rpc_request['timeout_at']}. Time.now = #{Time.now.to_i}"
    end

    return_value = @local_object.send( function_call['name'].to_sym, *function_call['args'] )
    rpc_response = {'return_value' => return_value}
  rescue Exception => err
    rpc_response = {'exception' => err.to_s, 'backtrace' => err.backtrace}
  end

  if @verbose
    p rpc_response
  end

  # response tansport
  rpc_raw_response = MultiJson.dump rpc_response
  @redis_server.multi do
    @redis_server.rpush response_queue, rpc_raw_response
    @redis_server.expire response_queue, 1
  end
  true
end
timeout() click to toggle source
# File lib/redis-rpc.rb, line 161
def timeout
  @timeout or
    $REDISRPC_SERVER_TIMEOUT or
  0
end