Rev 30 | Blame | Compare with Previous | Last modification | View Log | RSS feed
## Licensed to the Apache Software Foundation (ASF) under one# or more contributor license agreements. See the NOTICE file# distributed with this work for additional information# regarding copyright ownership. The ASF licenses this file# to you under the Apache License, Version 2.0 (the# "License"); you may not use this file except in compliance# with the License. You may obtain a copy of the License at## http://www.apache.org/licenses/LICENSE-2.0## Unless required by applicable law or agreed to in writing,# software distributed under the License is distributed on an# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY# KIND, either express or implied. See the License for the# specific language governing permissions and limitations# under the License.#require 'thread'module Thriftclass ThreadPoolServer < BaseServerdef 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 = falseend## 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.)def rescuable_serveThread.new { serve } unless @running@running = trueraise @exception_q.popend## exceptions that happen in worker threads simply cause that thread## to die and another to be spawned in its place.def serve@server_transport.listenbeginloop do@thread_q.push(:token)Thread.new dobeginloop doclient = @server_transport.accepttrans = @transport_factory.get_transport(client)prot = @protocol_factory.get_protocol(trans)beginloop do@processor.process(prot, prot)endrescue Thrift::TransportException, Thrift::ProtocolException => eensuretrans.closeendendrescue => e@exception_q.push(e)ensure@thread_q.pop # thread died!endendendensure@server_transport.closeendendendend