class Thrift::NonblockingServer
this class expects to always use a FramedTransport for reading messages
Public Class Methods
Source
# File lib/thrift/server/nonblocking_server.rb 27 def initialize(processor, server_transport, transport_factory = nil, protocol_factory = nil, num = 20, logger = nil, 28 max_frame_size: FramedTransport::DEFAULT_MAX_FRAME_SIZE) 29 super(processor, server_transport, transport_factory, protocol_factory) 30 unless max_frame_size > 0 && max_frame_size <= FramedTransport::HARD_MAX_FRAME_SIZE 31 raise ArgumentError, "max_frame_size must be > 0 and <= #{FramedTransport::HARD_MAX_FRAME_SIZE}" 32 end 33 @num_threads = num 34 @max_frame_size = max_frame_size 35 if logger.nil? 36 @logger = Logger.new(STDERR) 37 @logger.level = Logger::WARN 38 else 39 @logger = logger 40 end 41 @shutdown_semaphore = Mutex.new 42 @transport_semaphore = Mutex.new 43 end
Calls superclass method
Thrift::BaseServer::new
Public Instance Methods
Source
# File lib/thrift/server/nonblocking_server.rb 45 def serve 46 @logger.info "Starting #{self}" 47 @server_transport.listen 48 @io_manager = start_io_manager 49 50 begin 51 loop do 52 break if @server_transport.closed? 53 begin 54 rd, = select([@server_transport], nil, nil, 0.1) 55 rescue Errno::EBADF => e 56 # In Ruby 1.9, calling @server_transport.close in shutdown paths causes the select() to raise an 57 # Errno::EBADF. If this happens, ignore it and retry the loop. 58 break 59 end 60 next if rd.nil? 61 begin 62 socket = @server_transport.accept 63 rescue => e 64 next if defined?(OpenSSL::SSL::SSLError) && e.is_a?(OpenSSL::SSL::SSLError) 65 raise 66 end 67 @logger.debug "Accepted socket: #{socket.inspect}" 68 @io_manager.add_connection socket 69 end 70 rescue IOError 71 end 72 # we must be shutting down 73 @logger.info "#{self} is shutting down, goodbye" 74 ensure 75 @transport_semaphore.synchronize do 76 @server_transport.close 77 end 78 @io_manager.ensure_closed unless @io_manager.nil? 79 end
Source
# File lib/thrift/server/nonblocking_server.rb 81 def shutdown(timeout = 0, block = true) 82 @shutdown_semaphore.synchronize do 83 return if @is_shutdown 84 @is_shutdown = true 85 end 86 # nonblocking is intended for calling from within a Handler 87 # but we can't change the order of operations here, so lets thread 88 shutdown_proc = lambda do 89 @io_manager.shutdown(timeout) 90 @transport_semaphore.synchronize do 91 @server_transport.close # this will break the accept loop 92 end 93 end 94 if block 95 shutdown_proc.call 96 else 97 Thread.new(&shutdown_proc) 98 end 99 end
Private Instance Methods
Source
# File lib/thrift/server/nonblocking_server.rb 103 def start_io_manager 104 iom = IOManager.new( 105 @processor, @server_transport, @transport_factory, @protocol_factory, @num_threads, @logger, 106 max_frame_size: @max_frame_size, 107 ) 108 iom.spawn 109 iom 110 end