class BasicJRPC::Server

Public Class Methods

new(queue, injected_class, host="redis") click to toggle source
# File lib/basicjrpc/server.rb, line 4
def initialize queue, injected_class, host="redis"
  if host.is_a?(Array)
    @redis = Redis.new(cluster: host.map { |n| "redis://#{n}:6381" }, driver: :hiredis)
  elsif host.is_a?(String)
    @redis = Redis.new(host: host, port: 6381)
  end
  @injected_class = injected_class
  @queue = queue
  @host = host
end

Public Instance Methods

listen(trigger=nil, error_handler=nil) click to toggle source
# File lib/basicjrpc/server.rb, line 15
def listen(trigger=nil, error_handler=nil)
  puts "Listening..."
  
  while true
    begin
      redis_response = @redis.blpop(@queue)
    rescue Redis::TimeoutError
      puts "ERROR: Redis Read timed out. Retrying"
      retry
    end
    
    next if redis_response.nil?
    message = redis_response[1]
    
    payload = Oj.load(message, :symbol_keys => false)

    if payload['method_argument_type'] and payload.method_argument_type == "hash"
      if @injected_class.method(payload.method_name).parameters.flatten.include?(:keyreq)
        response = @injected_class.send(payload.method_name, *payload.method_arguments)
      else
        response = @injected_class.send(payload.method_name, *payload.method_arguments.first.values)
      end
    else
      response = @injected_class.send(payload.method_name, *payload.method_arguments)
    end

    @redis.rpush(payload.message_id, Oj.dump(response))
    
    @injected_class.send(trigger) if trigger
  end
rescue Exception => e
  @redis.rpush(payload.message_id, Oj.dump(error_handler.handle(e))) if error_handler
  raise e
end