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