我正在使用io.netty-3.9.0.Final
和protobuf
来创建和发送大尺寸的邮件。我注意到序列化和写入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;
}
答案 0 :(得分:0)
不幸的是,Netty 3.x并不像这样工作。它确实以异步方式发送消息,但是如果Netty无法立即写入网络缓冲区,则异步部分会启动。在这种情况下,它会对消息进行排队,并最终使用I / O线程将其写出来。
我相信你最好的选择是升级到Netty 4,我理解你有你想要的行为。否则,您可以尝试在管道中添加OrderedDownstreamThreadPoolExecutor。写入仍然不会被I / O线程处理,但它应该可以减轻应用程序线程的压力。