正如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
之前引用计数是否已减少?
答案 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();
}
}
});
以确保我们不会修改稍后可能传递给第二个频道的缓冲区的读取器/写入器索引。