class RedisRPC::Client

Public Class Methods

new(redis_server, message_queue, timeout=0) click to toggle source
# File lib/redisrpc.rb, line 46
def initialize(redis_server, message_queue, timeout=0)
    @redis_server = redis_server
    @message_queue = message_queue
    @timeout = timeout
end

Public Instance Methods

method_missing(sym, *args, &block) click to toggle source
# File lib/redisrpc.rb, line 52
def method_missing(sym, *args, &block)
    function_call = {'name' => sym.to_s, 'args' => args}
    response_queue = @message_queue + ':rpc:' + rand_string
    rpc_request = {'function_call' => function_call, 'response_queue' => response_queue}
    message = MultiJson.dump rpc_request
    if $DEBUG
        $stderr.puts 'RPC Request: ' + message
    end
    @redis_server.rpush @message_queue, message
    result = @redis_server.blpop response_queue, @timeout
    if result.nil?
        raise TimeoutException
    end
    message_queue, message = result
    if $DEBUG
        if message_queue != response_queue
            fail 'assertion failed'
        end
        $stderr.puts 'RPC Response: ' + message
    end
    rpc_response = MultiJson.load message
    exception = rpc_response['exception']
    if exception != nil
        raise RemoteException, exception
    end
    if not rpc_response.has_key? 'return_value'
        raise RemoteException, 'Malformed RPC Response message: ' + rpc_response
    end
    return rpc_response['return_value']
end
rand_string(size=8) click to toggle source
# File lib/redisrpc.rb, line 83
def rand_string(size=8)
    return rand(36**size).to_s(36).upcase.rjust(size,'0')
end
respond_to?(sym) click to toggle source
# File lib/redisrpc.rb, line 87
def respond_to?(sym)
    return true
end