Обработка тайм-аута ReadTimeoutHandler - PullRequest
0 голосов
/ 21 марта 2012

Я просто не могу понять, почему мой тайм-аут чтения не работает.Все, что я хочу сделать, это просто подождать
в течение 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>();

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

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

1 Ответ

5 голосов
/ 26 марта 2012

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

...