Class: RedisRpc::Client
- Inherits:
-
Object
- Object
- RedisRpc::Client
- Defined in:
- lib/redis-rpc.rb
Instance Method Summary collapse
- #get_timeout_at ⇒ Object
-
#initialize(redis_server, message_queue, timeout = 0) ⇒ Client
constructor
A new instance of Client.
- #respond_to?(method_name) ⇒ Boolean
- #send(method_name, *args) ⇒ Object (also: #method_missing)
- #send! ⇒ Object
Constructor Details
#initialize(redis_server, message_queue, timeout = 0) ⇒ Client
Returns a new instance of Client.
44 45 46 47 48 |
# File 'lib/redis-rpc.rb', line 44 def initialize( redis_server, , timeout=0 ) @redis_server = redis_server @message_queue = @timeout = timeout end |
Dynamic Method Handling
This class handles dynamic methods through the method_missing method
#method_missing ⇒ Object
87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 |
# File 'lib/redis-rpc.rb', line 87 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 , 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 |
Instance Method Details
#get_timeout_at ⇒ Object
52 53 54 55 |
# 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) ⇒ Boolean
89 90 91 |
# File 'lib/redis-rpc.rb', line 89 def respond_to?( method_name ) send( :respond_to?, method_name ) end |
#send(method_name, *args) ⇒ Object Also known as: method_missing
57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 |
# 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 , 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 |
#send! ⇒ Object
50 |
# File 'lib/redis-rpc.rb', line 50 alias :send! :send |