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