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