Class: AbstractThriftClient
- Inherits:
-
Object
- Object
- AbstractThriftClient
- Includes:
- ThriftHelpers
- Defined in:
- lib/thrift_client/abstract_thrift_client.rb
Direct Known Subclasses
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 => {}, :cached_connections => false }
Instance Attribute Summary collapse
-
#client ⇒ Object
readonly
Returns the value of attribute client.
-
#client_class ⇒ Object
readonly
Returns the value of attribute client_class.
-
#client_methods ⇒ Object
readonly
Returns the value of attribute client_methods.
-
#current_server ⇒ Object
readonly
Returns the value of attribute current_server.
-
#last_client ⇒ Object
readonly
Returns the value of attribute last_client.
-
#options ⇒ Object
readonly
Returns the value of attribute options.
-
#server_list ⇒ Object
readonly
Returns the value of attribute server_list.
Instance Method Summary collapse
-
#add_callback(callback_type, &block) ⇒ Object
Adds a callback that will be invoked at a certain time.
-
#connect!(method = nil) ⇒ Object
Force the client to connect to the server.
- #disconnect!(error = false) ⇒ Object
-
#initialize(client_class, servers, options = {}) ⇒ AbstractThriftClient
constructor
A new instance of AbstractThriftClient.
- #inspect ⇒ Object
Constructor Details
#initialize(client_class, servers, options = {}) ⇒ AbstractThriftClient
Returns a new instance of AbstractThriftClient.
38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
# File 'lib/thrift_client/abstract_thrift_client.rb', line 38 def initialize(client_class, servers, = {}) @options = DEFAULTS.merge() @options[:server_retry_period] ||= 0 @client_class = client_class @server_list = Array(servers).collect do |s| Server.new(s, @client_class, @options) 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 =~ /^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
#client ⇒ Object (readonly)
Returns the value of attribute client.
36 37 38 |
# File 'lib/thrift_client/abstract_thrift_client.rb', line 36 def client @client end |
#client_class ⇒ Object (readonly)
Returns the value of attribute client_class.
36 37 38 |
# File 'lib/thrift_client/abstract_thrift_client.rb', line 36 def client_class @client_class end |
#client_methods ⇒ Object (readonly)
Returns the value of attribute client_methods.
36 37 38 |
# File 'lib/thrift_client/abstract_thrift_client.rb', line 36 def client_methods @client_methods end |
#current_server ⇒ Object (readonly)
Returns the value of attribute current_server.
36 37 38 |
# File 'lib/thrift_client/abstract_thrift_client.rb', line 36 def current_server @current_server end |
#last_client ⇒ Object (readonly)
Returns the value of attribute last_client.
36 37 38 |
# File 'lib/thrift_client/abstract_thrift_client.rb', line 36 def last_client @last_client end |
#options ⇒ Object (readonly)
Returns the value of attribute options.
36 37 38 |
# File 'lib/thrift_client/abstract_thrift_client.rb', line 36 def @options end |
#server_list ⇒ Object (readonly)
Returns the value of attribute server_list.
36 37 38 |
# File 'lib/thrift_client/abstract_thrift_client.rb', line 36 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.
76 77 78 79 80 81 82 83 84 85 86 |
# File 'lib/thrift_client/abstract_thrift_client.rb', line 76 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!(method = nil) ⇒ 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.
95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 |
# File 'lib/thrift_client/abstract_thrift_client.rb', line 95 def connect!(method = nil) start_time ||= Time.now @current_server = next_live_server @client = @current_server.client @last_client = @client do_callbacks(:post_connect, self) rescue IOError, Thrift::TransportException disconnect!(true) timeout = timeout(method) if timeout && Time.now - start_time > timeout no_servers_available! else retry end end |
#disconnect!(error = false) ⇒ Object
111 112 113 114 115 116 117 118 119 120 |
# File 'lib/thrift_client/abstract_thrift_client.rb', line 111 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 ⇒ Object
88 89 90 |
# File 'lib/thrift_client/abstract_thrift_client.rb', line 88 def inspect "<#{self.class}(#{client_class}) @current_server=#{@current_server}>" end |