Class: AbstractThriftClient
- Inherits:
-
Object
- Object
- AbstractThriftClient
- Defined in:
- lib/thrift_client/abstract_thrift_client.rb
Direct Known Subclasses
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
-
#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.
-
#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! ⇒ Object
Force the client to connect to the server.
- #disconnect! ⇒ 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.
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 = DEFAULTS.merge() @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
#client ⇒ Object (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_class ⇒ Object (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_methods ⇒ Object (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_server ⇒ Object (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 |
#options ⇒ Object (readonly)
Returns the value of attribute options.
47 48 49 |
# File 'lib/thrift_client/abstract_thrift_client.rb', line 47 def @options end |
#server_list ⇒ Object (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 |
#inspect ⇒ Object
95 96 97 |
# File 'lib/thrift_client/abstract_thrift_client.rb', line 95 def inspect "<#{self.class}(#{client_class}) @current_server=#{@current_server}>" end |