在Netty的IO工作线程中编码下游消息

时间:2014-03-14 12:43:18

标签: java netty

我正在使用io.netty-3.9.0.Finalprotobuf来创建和发送大尺寸的邮件。我注意到序列化和写入CodedOutputStream需要花费很多时间,并且会减慢我的应用程序线程。

我希望在Netty的IO工作线程中处理这种工作。 Channel.write(Object)文档说:“异步向此频道发送消息。”此外,上游消息解码发生在I / O工作线程中。

那么如何将编码从Channel.write()调用线程移动到Netty的IO工作线程?

ChannelPipelineFactory#getPipeline()方法如下所示:

public ChannelPipeline getPipeline() throws Exception {
    final ChannelPipeline pipeline = Channels.pipeline();

    // Decoder
    pipeline.addLast("frameDecoder", new LengthFieldBasedFrameDecoder(MAX_FRAME_LENGTH, LENGTH_FIELD_OFFSET, LENGTH_FIELD_LENGTH, LENGTH_ADJUSTMENT, INITIAL_BYTES_TO_STRIP));
    pipeline.addLast("protobufDecoder", new ProtobufDecoder(MessageProto.pMessage.getDefaultInstance()));
    pipeline.addLast("protoMessageDecoder", new ProtoMessageDecoder());

    // Encoder
    pipeline.addLast("frameEncoder", new LengthFieldPrepender(LENGTH_FIELD_LENGTH));
    pipeline.addLast("protobufEncoder", new ProtobufEncoder());
    pipeline.addLast("protoMessageEncoder", new ProtoMessageEncoder());

    pipeline.addLast("handler", upstreamHandler);

    return pipeline;
}

1 个答案:

答案 0 :(得分:0)

不幸的是,Netty 3.x并不像这样工作。它确实以异步方式发送消息,但是如果Netty无法立即写入网络缓冲区,则异步部分会启动。在这种情况下,它会对消息进行排队,并最终使用I / O线程将其写出来。

我相信你最好的选择是升级到Netty 4,我理解你有你想要的行为。否则,您可以尝试在管道中添加OrderedDownstreamThreadPoolExecutor。写入仍然不会被I / O线程处理,但它应该可以减轻应用程序线程的压力。