2013-05-10 2 views
3

Я экспериментирую с пользовательским обработчиком исходящих сообщений в Netty 4 и не могу заставить его работать. Обработчик просто регистрирует оператор и добавляется к нижней части конвейера канала. Я понимаю, что эти обработчики вызываются снизу вверх, чтобы, как только была выписана операция записи. Идея с пользовательским обработчиком заключалась в том, что он будет выполнен до любых других обработчиков исходящих сообщений.Netty 4 Outbound Message Handler Закрывающее соединение

К сожалению, когда я добавляю этот обработчик ведения журнала к конвейеру, я вижу оператор журнала, но затем Netty, кажется, немедленно закрывает соединение. Вот мой инициализатор канала и код исходящего обработчика.

HttpOutboundHandler.java

public class HttpOutboundHandler extends ChannelOutboundMessageHandlerAdapter<DefaultFullHttpResponse> { 
    private static final Logger logger = LoggerFactory.getLogger(HttpOutboundHandler.class); 

    @Override 
    public void flush(ChannelHandlerContext context, DefaultFullHttpResponse response) 
      throws Exception { 
     logger.debug("Executing outbound handler."); 
    } 
} 

HttpChannelInitializer.java

@Override 
protected void initChannel(SocketChannel socketChannel) throws Exception { 
    pipeline.addLast("encoder", new HttpResponseEncoder()); 
    pipeline.addLast("decoder", new HttpRequestDecoder()); 
    pipeline.addLast("aggregator", new HttpObjectAggregator(1048576); 
    pipeline.addLast("compressor", new HttpContentCompressor(gzipLevel)); 
    pipeline.addLast("outboundHandler", outboundHandler); 
    pipeline.addLast(eventExecutorGroup, "inboundHandler", inboundHandler); 
} 

Наконец, вот выход регистратора.

[DEBUG] (Slf4JLogger:71) - [id: 0xbddf00cf, /0:0:0:0:0:0:0:1:57402 => /0:0:0:0:0:0:0:1:8080] ACTIVE 
[DEBUG] (HttpOutboundHandler:19) - Executing outbound handler. 
[DEBUG] (Slf4JLogger:71) - [id: 0x942993c1, /0:0:0:0:0:0:0:1:57403 :> /0:0:0:0:0:0:0:1:8080] INACTIVE 

ответ

2

Ответ на мой собственный вопрос на тот случай, если кто-либо найдет это.

Оказалось, что мне нужно добавить сообщение в следующий буфер исходящего сообщения (который, как мне кажется, имеет значение для передачи его следующему обработчику в цепочке). Мне также нужно было сохранить сообщение. Обновленный код теперь выглядит следующим образом:

public class HttpOutboundHandler extends ChannelOutboundMessageHandlerAdapter<DefaultFullHttpResponse> { 
    private static final Logger logger = LoggerFactory.getLogger(HttpOutboundHandler.class); 

    @Override 
    public void flush(ChannelHandlerContext context, DefaultFullHttpResponse response) 
      throws Exception { 
     logger.debug("Executing outbound handler."); 
     ChannelHandlerUtil.addToNextOutboundBuffer(context, response.retain()); 
    } 
} 
Смежные вопросы