class AbstractThriftClient

Constants

DEFAULTS
DEFAULT_WRAPPED_ERRORS
DISCONNECT_ERRORS

Attributes

client[R]
client_class[R]
client_methods[R]
current_server[R]
options[R]
server_list[R]

Public Class Methods

new(client_class, servers, options = {}) click to toggle source
# File lib/thrift_client/abstract_thrift_client.rb, line 38
def initialize(client_class, servers, options = {})
  @options = DEFAULTS.merge(options)
  @options[:server_retry_period] ||= 0
  @client_class = client_class
  @server_list = Array(servers).collect do |s|
    Server.new(s, @options[:cached_connections])
  end.sort_by { rand }
  @current_server = @server_list.first

  @callbacks = {}
  @client_methods = []
  @client_class.instance_methods.each do |method_name|
    if method_name != 'send_message' && method_name =~ %r^send_(.*)$/
      instance_eval("def #{$1}(*args); handled_proxy(:'#{$1}', *args); end", __FILE__, __LINE__)
      @client_methods << $1
    end
  end
  @request_count = 0
  @options[:wrapped_exception_classes].each do |exception_klass|
    name = exception_klass.to_s.split('::').last
    begin
      @client_class.const_get(name)
    rescue NameError
      @client_class.const_set(name, Class.new(exception_klass))
    end
  end
end

Public Instance Methods

add_callback(callback_type, &block) click to toggle source

Adds a callback that will be invoked at a certain time. The valid callback types are:

:post_connect  - should accept a single AbstractThriftClient argument, which is the client object to
                 which the callback was added. Called after a connection to the remote thrift server
                 is established.
:before_method - should accept a single method name argument. Called before a method is invoked on the
                 thrift server.
:on_exception  - should accept 2 args: an Exception instance and a method name. Called right before the
                 exception is raised.
# File lib/thrift_client/abstract_thrift_client.rb, line 74
def add_callback(callback_type, &block)
  case callback_type
  when :post_connect, :before_method, :on_exception
    @callbacks[callback_type] ||= []
    @callbacks[callback_type].push(block)
    # Allow chaining
    return self
  else
    return nil
  end
end
connect!() click to toggle source

Force the client to connect to the server. Not necessary to be called as the connection will be made on the first RPC method call.

# File lib/thrift_client/abstract_thrift_client.rb, line 93
def connect!
  @current_server = next_live_server
  @current_server.open(@options[:transport],
                       @options[:transport_wrapper],
                       @options[:connect_timeout],
                       @options[:timeout])
  @client = @client_class.new(@options[:protocol].new(@current_server, *@options[:protocol_extra_params]))
  do_callbacks(:post_connect, self)
rescue IOError, Thrift::TransportException
  disconnect!(true)
  retry
end
disconnect!(error = false) click to toggle source
# File lib/thrift_client/abstract_thrift_client.rb, line 106
def disconnect!(error = false)
  if @current_server
    @current_server.mark_down!(@options[:server_retry_period]) if error
    @current_server.close
  end

  @client = nil
  @current_server = nil
  @request_count = 0
end
inspect() click to toggle source
# File lib/thrift_client/abstract_thrift_client.rb, line 86
def inspect
  "<#{self.class}(#{client_class}) @current_server=#{@current_server}>"
end