Netty 4:writeAndFlush ByteBuf和引用计数

时间:2017-04-16 07:16:03

标签: netty

正如doc中所述:

  

当出站(a.k.a.downdown)消息到达开头时   对于管道,Netty将在写完后将其发布。

因此,在正常情况下,成功调用writeAndFlush后,ByteBuf的引用计数将会减少。

错误发生了什么?

假设我有两个频道:firstChannel& secondChannel。如果ByteBuf未能发送至firstChannel,则需要将其发送至secondChannel

代码示例如下。

final ChannelFuture future = firstChannel.writeAndFlush(byteBuf.asReadOnly()).addListener(new ChannelFutureListener() {
    @Override
    public void operationComplete(ChannelFuture future) {
        // Is the reference count decreased already before entering this method?
        if (!future.isSuccess()) {

            byteBuf.retain(); 
            secondChannel.writeAndFlush(byteBuf);
        }
    }
});

即使发生错误,参考计数也会降低吗? 引用operationComplete之前引用计数是否已减少?

1 个答案:

答案 0 :(得分:2)

即使失败,它也会释放缓冲区,因此您的代码将无效。你需要 <h3>My Google Maps </h3> <div id="googleMap" style="width:100%;height:400px;"></div> <script> var lat= 50.50389; var long= 4.4699451; function myMap() { var uluru = {lat: lat, lng: long}; var map = new google.maps.Map(document.getElementById('googleMap'), { zoom: 10, center: uluru }); var marker = new google.maps.Marker({ position: uluru, map: map }); } </script> <script async defer src="https://maps.googleapis.com/maps/api/js?key=AIzaSyCFFqySePr9frroT5m96cNa2JcJLLCf7f0&callback=myMap"> </script> 缓冲区,以确保在调用监听器时增量计数为1,如果未来成功,则由自己递减。

这样的事情:

retain()

另请注意,我也会调用final ChannelFuture future = firstChannel.writeAndFlush(byteBuf.retain().duplicate()).addListener(new ChannelFutureListener() { @Override public void operationComplete(ChannelFuture future) { if (!future.isSuccess()) { secondChannel.writeAndFlush(byteBuf); } else { byteBuf.release(); } } }); 以确保我们不会修改稍后可能传递给第二个频道的缓冲区的读取器/写入器索引。