Class: Thrift::ThreadPoolServer

Inherits:
BaseServer show all
Defined in:
lib/thrift/server/thread_pool_server.rb

Instance Method Summary collapse

Constructor Details

#initialize(processor, server_transport, transport_factory = nil, protocol_factory = nil, num = 20) ⇒ ThreadPoolServer

Returns a new instance of ThreadPoolServer.



24
25
26
27
28
29
# File 'lib/thrift/server/thread_pool_server.rb', line 24

def initialize(processor, server_transport, transport_factory=nil, protocol_factory=nil, num=20)
  super(processor, server_transport, transport_factory, protocol_factory)
  @thread_q = SizedQueue.new(num)
  @exception_q = Queue.new
  @running = false
end

Instance Method Details

#rescuable_serveObject

exceptions that happen in worker threads will be relayed here and must be caught. ‘retry’ can be used to continue. (threads will continue to run while the exception is being handled.)



34
35
36
37
38
# File 'lib/thrift/server/thread_pool_server.rb', line 34

def rescuable_serve
  Thread.new { serve } unless @running
  @running = true
  raise @exception_q.pop
end

#serveObject

exceptions that happen in worker threads simply cause that thread to die and another to be spawned in its place.



42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
# File 'lib/thrift/server/thread_pool_server.rb', line 42

def serve
  @server_transport.listen

  begin
    loop do
      @thread_q.push(:token)
      Thread.new do
        begin
          loop do
            client = @server_transport.accept
            trans = @transport_factory.get_transport(client)
            prot = @protocol_factory.get_protocol(trans)
            begin
              loop do
                @processor.process(prot, prot)
              end
            rescue Thrift::TransportException, Thrift::ProtocolException => e
            ensure
              trans.close
            end
          end
        rescue => e
          @exception_q.push(e)
        ensure
          @thread_q.pop # thread died!
        end
      end
    end
  ensure
    @server_transport.close
  end
end