2016-07-15 4 views
0

의 Netty 4.1.2.Final의 Netty 4 : 래핑 버퍼 참조 횟수

I는 의사 API를 here는, 더 이상의 ByteBuf의 포장을 Unpooled.wrappedBuffer 방법을 사용하고있다.

public static ByteBuf wrappedBuffer(ByteBuf... buffers) 

상무부 모든 변수의

참조 카운트 소유권이 방법으로 옮겨진 있다고 말했습니다.

질문이 더 명확하게 업데이트됩니다.

여러 개의 연결에 한 번에 하나 이상의 ByteBuf을 보내야합니다. 일부 클라이언트는 긴 폴링 모드에서 작동하기 때문에 ChannelGroup을 사용할 수 없습니다. 즉, 응답은 현재 채널이 준비되지 않은 다음 요청에서 보내야 함을 의미합니다.

따라서, I는 다음과 같은 데이터 구조는 접속 채널

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

를 저장하고 난은 채널

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(); 
} 

문제에 ByteBuf를 방송하는 방법을 가질 수있다 : 만약 둘 이상의 실시간 클라이언트가 연결되어 있으면 그 중 하나만이 모두 작성된 경우에도 응답을받습니다.

참조 횟수로 인해 문제가 발생한 것 같습니다.

감사합니다.

+0

이유는 참조 횟수가 아니기 때문에 일부 핸들에서 'ByteBuf'를 수정하기 때문입니다. 따라서 첫 번째 연결 만 수신합니다. 해결책은 ByteBuf 다음에 asReadOnly()를 추가하는 것입니다. –

답변

1

아니요 ... 반환 된 버퍼에서 release()를 호출해야한다는 의미입니다.

+0

'release()'를 호출해야한다면'ByteBuf' 입력이 유지된다는 의미입니까? 그렇지 않으면 참조 카운트를 변경하지 않으면 왜'release()'를 호출해야합니까? –

+1

버퍼를 랩핑하면 방금 방금 래핑 한 버퍼가 아니라 새로 반환 된 버퍼에서 release()를 호출해야하기 때문입니다. –

+0

제 테스트에서 그런 식으로 작동하지 않습니다. 원래 ByteBuf의 "retain"이라고하지 않으면 IllegalReferenceCountException가 발생합니다. 래핑 된 ByteBuf의 'retain'을 호출하면 밑 부분 ByteBuf의 참조 카운트가 변경되지 않습니다. –