Class: Thrift::ThreadPoolServer
- Inherits:
-
BaseServer
- Object
- BaseServer
- Thrift::ThreadPoolServer
- Defined in:
- lib/thrift/server/thread_pool_server.rb
Instance Method Summary collapse
-
#initialize(processor, server_transport, transport_factory = nil, protocol_factory = nil, num = 20) ⇒ ThreadPoolServer
constructor
A new instance of ThreadPoolServer.
-
#rescuable_serve ⇒ Object
exceptions that happen in worker threads will be relayed here and must be caught.
-
#serve ⇒ Object
exceptions that happen in worker threads simply cause that thread to die and another to be spawned in its place.
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_serve ⇒ Object
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 |
#serve ⇒ Object
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 |