class Thrift::NonblockingServer
this class expects to always use a FramedTransport
for reading messages
Public Class Methods
new(processor, server_transport, transport_factory=nil, protocol_factory=nil, num=20, logger=nil)
click to toggle source
Calls superclass method
Thrift::BaseServer::new
# File lib/thrift/server/nonblocking_server.rb 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
Public Instance Methods
serve()
click to toggle source
# File lib/thrift/server/nonblocking_server.rb 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
shutdown(timeout = 0, block = true)
click to toggle source
# File lib/thrift/server/nonblocking_server.rb 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
Private Instance Methods
start_io_manager()
click to toggle source
# File lib/thrift/server/nonblocking_server.rb 92 def start_io_manager 93 iom = IOManager.new(@processor, @server_transport, @transport_factory, @protocol_factory, @num_threads, @logger) 94 iom.spawn 95 iom 96 end