Получение Stackoverflow в Netty Encoder - PullRequest
0 голосов
/ 14 октября 2018

Я хочу отправить собственное сообщение, прежде чем отправлять фактическое, при первом инициализации канала.У меня есть:

public class MyClientInitializerFactory extends ClientInitializerFactory {

@Override
protected void initChannel(Channel ch) {
    ChannelPipeline pipeline = ch.pipeline();
    pipeline.addLast(new EncoderTwo());
    pipeline.addLast(new EncoderOne());
}
}

EncoderOne:

public class EncoderOne extends MessageToMessageEncoder<Object> {

@Override
protected void encode(ChannelHandlerContext ctx, Object msg, List<Object> out) throws Exception {
    byte[] bytes = "ABCD".getBytes(StandardCharsets.UTF_8);
    ByteBuf byteBuf = Unpooled.buffer(bytes.length);
    Channel channel = ctx.channel();
    channel.writeAndFlush(byteBuf);
    out.add(msg); // retaining original message for further processing
    ctx.pipeline().remove(this);
}

EncoderTwo обрабатывает фактическое сообщение и отправляет его по проводам, но мое сообщение там не доходит.Когда я пытаюсь что-либо отправить, эти строки выполняются снова и снова, пока я не получу StackOverflow:

 ByteBuf byteBuf = Unpooled.buffer(bytes.length);
 Channel channel = ctx.channel();
 channel.writeAndFlush(byteBuf);

Что я делаю не так?

1 Ответ

0 голосов
/ 15 октября 2018

Проблема в том, что вы вызываете channel.writeAndFlush(byteBuf); в кодировщике, что означает, что он снова начнет течь по конвейеру из хвоста и снова окажется в кодере.Поэтому сначала удалите кодировщик, прежде чем вызывать его, или позвоните ctx.writeAndFlush(...)

. В качестве альтернативы можно просто добавить byteBuf к выходу List, а затем напрямую вызвать flush(). * 1008.*

...