ChannelTrafficShapingHandler 限流
ChannelPipeline pipeline = ch.pipeline();
//**流量整形,必须放在第一位;使用DefaultFileRegion(sendFile)时该限制不起作用**
pipeline.addLast(new ChannelTrafficShapingHandler(100 * 1024, 100 * 1024));
pipeline.addLast(new HttpServerCodec());
// 支持最大上行50M
pipeline.addLast(new HttpObjectAggregator(50 * 1024 * 1024));
//支持异步发送大的码流,但不会占用过多的内存,防止发生java内存溢出
pipeline.addLast(new ChunkedWriteHandler());
pipeline.addLast(new FileShareHttpInboundHandler());
使用DefaultFileRegion时ChannelTrafficShapingHandler配置不起作用。
DefaultFileRegion(sendfile优化)
@Override
public void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception {
RandomAccessFile raf = null;
long length = -1;
try {
raf = new RandomAccessFile(msg, "r");
length = raf.length();
} catch (Exception e) {
ctx.writeAndFlush("ERR: " + e.getClass().getSimpleName() + ": " + e.getMessage() + '\n');
return;
} finally {
if (length < 0 && raf != null) {
raf.close();
}
}
ctx.write("OK: " + raf.length() + '\n');
if (ctx.pipeline().get(SslHandler.class) == null) {
// SSL not enabled - can use zero-copy file transfer.
ctx.write(new DefaultFileRegion(raf.getChannel(), 0, length));
} else {
// SSL enabled - cannot use zero-copy file transfer.
ctx.write(new ChunkedFile(raf));
}
ctx.writeAndFlush("\n");
}
上面的代码从netty example file模块获取,当channel支持ssl时,DefaultFileRegion同样不起作用。