Обработка тайм-аута ReadTimeoutHandler

Я просто не могу понять, почему мой тайм-аут чтения не работает. Все, что я хочу сделать, это просто подождать
в течение 10 секунд, чтобы какой-то поток поместил сообщение в BlockedQueue<String> и по таймауту вернул какой-то ответ клиенту.

public class NioAsynChatPipelineFactory implements ChannelPipelineFactory {

     private static Timer timer = new HashedWheelTimer();
     private final ChannelHandler timeoutHandler = new ReadTimeoutHandler(timer, 10);

    @Override
    public ChannelPipeline getPipeline() throws Exception {
        ChannelPipeline pipeline = Channels.pipeline();
         pipeline.addLast("decoder", new HttpRequestDecoder());
         pipeline.addLast("encoder", new HttpResponseEncoder());
         pipeline.addLast("handler", new NioAsynChatHandler());
         pipeline.addLast("timeout", this.timeoutHandler);
        return pipeline;
    }

}

Теперь мой обработчик выглядит так.

public class NioAsynChatHandler extends SimpleChannelUpstreamHandler{

     @Override
     public void handleUpstream(
        ChannelHandlerContext ctx, ChannelEvent e) throws Exception {
               super.handleUpstream(ctx, e);
     }

 @Override
     public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e)
        throws Exception {
         System.out.println("Exception");
        \\writing some kind of response and closing channel.
    }

    @Override
        public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {

    Thread thread = new Thread(new ConsmerTask(e.getChannel()));
                thread.start();

}

а внутри ConsumerTask я просто жду ответа BlockingQueue

public class ConsumerTask implements Runnable{

    private Channel channel;


public ConsumerTask(Channel channel){
        this.channel = channel;
}

    @Override
    public void run() {
         try{
            while(true){
              String message = queue.take();
            }
         } catch(InterruptedException ex){
           Thread.currentThread.interrupt();
         } finally{
         //write something to channel and close it   
        }
}

Моя проблема в том, что я не вижу никаких исключений по таймауту. Что я делаю неправильно?

Обновление:

 public static final BlockingQueue<String> blockingQueue = new LinkedBlockingQueue<String>();

На самом деле мой вопрос более общий: как закрыть канал по таймауту, пока он ждет чего-то во внешнем потоке?

Обновление 2: Другой вопрос: из-за того, что я запускаю внешний поток в Cha, было бы лучше использовать OrderedMemoryAwareThreadPoolExecutor в конвейере? Будет ли это увеличивать производительность.


person danny.lesnik    schedule 21.03.2012    source источник
comment
не следует ли использовать poll () вместо take? Какую реализацию вы выбрали для BlockingQueue?   -  person Guillaume Polet    schedule 21.03.2012
comment
На самом деле не имеет значения, использую ли я poll () или take (). В опросе я могу указать время ожидания и не использовать цикл while (true), в то время как take () получает элементы немедленно. По поводу очереди на блокировку смотрите мое обновление.   -  person danny.lesnik    schedule 21.03.2012


Ответы (1)


Это в основном потому, что вы поместили ReadTimeoutHandler в неправильное положение. Пожалуйста, поместите его в первую позицию конвейера (т.е. перед всеми обработчиками).

person trustin    schedule 26.03.2012
comment
не могли бы вы объяснить почему? - person goral; 29.03.2015
comment
Пожалуйста, взгляните на Javadoc ChannelPipeline, чтобы узнать о равномерном порядке оценки. - person trustin; 31.03.2015