# 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
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
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
# 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
# File lib/thrift_client/abstract_thrift_client.rb, line 86 def inspect "<#{self.class}(#{client_class}) @current_server=#{@current_server}>" end