Class: RedisRpc::Client

Inherits:
Object
  • Object
show all
Defined in:
lib/redis-rpc.rb

Instance Method Summary collapse

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, message_queue, timeout=0 )
  @redis_server = redis_server
  @message_queue = message_queue
  @timeout = timeout
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missingObject



77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
# File 'lib/redis-rpc.rb', line 77

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}
  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

Instance Method Details

#respond_to?(method_name) ⇒ Boolean

Returns:

  • (Boolean)


79
80
81
# File 'lib/redis-rpc.rb', line 79

def respond_to?( method_name )
  send( :respond_to?, method_name )
end

#send(method_name, *args) ⇒ Object Also known as: method_missing



51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# File 'lib/redis-rpc.rb', line 51

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}
  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

#send!Object



50
# File 'lib/redis-rpc.rb', line 50

alias :send! :send