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



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

#get_timeout_atObject



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

Returns:

  • (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
  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