Netty 4:包装缓冲区中的引用计数

时间:2016-07-15 14:43:45

标签: netty

Netty 4.1.2.Final

我使用Unpooled.wrappedBuffer方法包装多个ByteBuf,API文档为here

public static ByteBuf wrappedBuffer(ByteBuf... buffers)

医生说

  

所有变量的引用计数所有权都转移到此方法。

我更新了问题,以便更清楚。

我需要一次向多个连接发送多个ByteBuf个。 我无法使用ChannelGroup ,因为某些客户端在长轮询模式下工作,这意味着必须在下一个请求中发送响应,此时此信道尚未就绪。

因此,我有以下数据结构存储连接的通道

private static final ConcurrentHashMap<String, Channel> channels 
  = new ConcurrentHashMap<String, Channel>(); 

我有一种方法将ByteBuf广播到频道

public static void broadcast(final long registrationID, final ByteBuf [] buffers){
  final ByteBuf wrappedBuf = Unpooled.wrappedBuffer(buffers);
  for( Map.Entry<String, Channel> entry : channels.entrySet()){
    final Channel channel = entry.getValue();
    if( channel != null ){
        wrappedBuf.retain();

        boolean isLongPooling = channel.attr(TYPE).get();
        if( isLongPooling )
          Reply.send( channel, wrappedBuf); // add into a queue which will be pulled by client in next request
        else 
          channel.writeAndFlush(wrappedBuf); // real time client , send in current channel
    }
  }
  wrappedBuf.release();  
}

问题在于:如果我连接了多个实时客户端,那么即使所有客户端都已写入,它们中只有一个会收到响应。

这似乎是由引用计数引起的问题?

谢谢

1 个答案:

答案 0 :(得分:1)

否......这意味着您需要在返回的缓冲区上调用release()。