channelWritabilityChanged

channelWritabilityChanged

我想控制数据传输的带宽。
根据Netty文件,他们建议:


  在处理程序中,您应该考虑使用channel.isWritable()和channelWritabilityChanged(ctx)来处理可写性,或者在ctx.write()返回的将来通过future.addListener(new GenericFutureListener())来处理可写性。


这是我的通道初始化程序源代码:

public class MyChannelInitializer extends ChannelInitializer<Channel>
        {
            private int mode;
            private Server server;
            private String fileName;
            public MyChannelInitializer(Server server, int mode,String fileName)
            {
                this.mode=mode;
                this.server=server;
                this.fileName=fileName;
            }
            @Override
            protected void initChannel(Channel ch) throws Exception
            {
                if (this.mode==MyFtpServer.RECEIVEFILE)
                {
                    ch.pipeline().addLast(new ChannelTrafficShapingHandler(0L,10240L));
                    ch.pipeline().addLast(new ReceiveFileHandler(this.fileName,server));
                }
                else
                {
                    ch.pipeline().addLast(new ChannelTrafficShapingHandler(10240L,0L));
                    ch.pipeline().addLast("streamer", new ChunkedWriteHandler());
                    ch.pipeline().addLast("handler",new SendFileHandler(this.fileName,server));
                }
            }
        }


这是发送文件处理程序源代码:

    public class SendFileHandler extends SimpleChannelInboundHandler<ByteBuf>
    {
        String fileName;
        PassiveServer txServer=null;
        public SendFileHandler(String fileName, PassiveServer txServer)
        {
            this.fileName=fileName;
            this.txServer=txServer;
        }
        public void channelWritabilityChanged(ChannelHandlerContext ctx)throws IOException
        {
            System.out.println("isWritable="+ctx.channel().isWritable());
        }
        @Override
        public void channelActive(ChannelHandlerContext ctx) throws IOException
        {
            System.out.println("SendFileHandler active");
        }
    }


您能告诉我为什么我的SendFileHandler中的“ channelWritabilityChanged”方法从不触发,而仅触发channelActive方法。

在我将SendFileHandler.channelActive方法更改为以下内容之后:

public void channelActive(ChannelHandlerContext ctx) throws IOException
{
    Calendar  startTime;
    System.out.println("SendFileHandler active");
    startTime=Calendar.getInstance();
    ctx.fireChannelWritabilityChanged();
}


SendFileHandler.channelWritabilityChanged方法仍未触发。
谁能告诉我为什么?

最佳答案

我相信因为ChunkedWriteHandler可以直接考虑可写性来完成这项工作。但是,由于channelWritabilityChanged中的最后一个代码是:

ctx.fireChannelWritabilityChanged();


您应该更改可写性信号。

但是,您发送任何文件吗?因为在您的代码中,没有,因此没有channelWritabilityChanged,因为似乎根本没有写操作,所以不应该对它进行更改(当然,可写性仅发生在写部分,而不发生在读部分)。

您也可以查看this thread regarding traffic shaping

10-08 19:09