의 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를 방송하는 방법을 가질 수있다 : 만약 둘 이상의 실시간 클라이언트가 연결되어 있으면 그 중 하나만이 모두 작성된 경우에도 응답을받습니다.
참조 횟수로 인해 문제가 발생한 것 같습니다.
감사합니다.
이유는 참조 횟수가 아니기 때문에 일부 핸들에서 'ByteBuf'를 수정하기 때문입니다. 따라서 첫 번째 연결 만 수신합니다. 해결책은 ByteBuf 다음에 asReadOnly()를 추가하는 것입니다. –