Class: AbstractThriftClient

Inherits:
Object
  • Object
show all
Defined in:
lib/thrift_client/abstract_thrift_client.rb

Direct Known Subclasses

ThriftClient

Defined Under Namespace

Classes: Server

Constant Summary collapse

DISCONNECT_ERRORS =
[
  IOError,
  Thrift::Exception,
  Thrift::ApplicationException,
  Thrift::TransportException
]
DEFAULT_WRAPPED_ERRORS =
[
  Thrift::ApplicationException,
  Thrift::TransportException,
]
DEFAULTS =
{
  :protocol => Thrift::BinaryProtocol,
  :protocol_extra_params => [],
  :transport => Thrift::Socket,
  :transport_wrapper => Thrift::FramedTransport,
  :raise => true,
  :defaults => {},
  :exception_classes => DISCONNECT_ERRORS,
  :exception_class_overrides => [],
  :retries => 0,
  :server_retry_period => 1,
  :server_max_requests => nil,
  :retry_overrides => {},
  :wrapped_exception_classes => DEFAULT_WRAPPED_ERRORS,
  :connect_timeout => 0.1,
  :timeout => 1,
  :timeout_overrides => {}
}

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(client_class, servers, options = {}) ⇒ AbstractThriftClient

Returns a new instance of AbstractThriftClient.



49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
# File 'lib/thrift_client/abstract_thrift_client.rb', line 49

def initialize(client_class, servers, options = {})
  @options = DEFAULTS.merge(options)
  @options[:server_retry_period] ||= 0
  @client_class = client_class
  @server_list = Array(servers).collect{|s| Server.new(s)}.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 =~ /^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

Instance Attribute Details

#clientObject (readonly)

Returns the value of attribute client.



47
48
49
# File 'lib/thrift_client/abstract_thrift_client.rb', line 47

def client
  @client
end

#client_classObject (readonly)

Returns the value of attribute client_class.



47
48
49
# File 'lib/thrift_client/abstract_thrift_client.rb', line 47

def client_class
  @client_class
end

#client_methodsObject (readonly)

Returns the value of attribute client_methods.



47
48
49
# File 'lib/thrift_client/abstract_thrift_client.rb', line 47

def client_methods
  @client_methods
end

#current_serverObject (readonly)

Returns the value of attribute current_server.



47
48
49
# File 'lib/thrift_client/abstract_thrift_client.rb', line 47

def current_server
  @current_server
end

#optionsObject (readonly)

Returns the value of attribute options.



47
48
49
# File 'lib/thrift_client/abstract_thrift_client.rb', line 47

def options
  @options
end

#server_listObject (readonly)

Returns the value of attribute server_list.



47
48
49
# File 'lib/thrift_client/abstract_thrift_client.rb', line 47

def server_list
  @server_list
end

Instance Method Details

#add_callback(callback_type, &block) ⇒ Object

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.


83
84
85
86
87
88
89
90
91
92
93
# File 'lib/thrift_client/abstract_thrift_client.rb', line 83

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

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.



102
103
104
105
106
107
108
109
110
# File 'lib/thrift_client/abstract_thrift_client.rb', line 102

def connect!
  @current_server = next_live_server
  @connection = Connection::Factory.create(@options[:transport], @options[:transport_wrapper], @current_server.connection_string, @options[:connect_timeout])
  @connection.connect!
  transport = @connection.transport
  transport.timeout = @options[:timeout] if transport_can_timeout?
  @client = @client_class.new(@options[:protocol].new(transport, *@options[:protocol_extra_params]))
  do_callbacks(:post_connect, self)
end

#disconnect!Object



112
113
114
115
116
117
# File 'lib/thrift_client/abstract_thrift_client.rb', line 112

def disconnect!
  @connection.close rescue nil #TODO
  @client = nil
  @current_server = nil
  @request_count = 0
end

#inspectObject



95
96
97
# File 'lib/thrift_client/abstract_thrift_client.rb', line 95

def inspect
  "<#{self.class}(#{client_class}) @current_server=#{@current_server}>"
end