2013-12-16 20 views
5

Bir JSON-Message'ı NUL-Sonlandıran bir Encoder yazıyorum, böylece mesajın parçalanması durumunda kodu çözülebilir.ByteBuf.retain() öğesini bir Netty4 Encoder'da ne zaman kullanmalıyım?

Bu örnekte, mevcut bir ByteBuf'u çıktıya yazmak için ByteBuf.retain() çağrısının yapıldığı ->click. Bunu neden yaptılar ve neden gerekli? kodlama sonra Varsayılan olarak

public class FrameEncoder extends MessageToMessageEncoder<ByteBuf> { 

    @Override 
    protected void encode(ChannelHandlerContext ctx, ByteBuf msg, List<Object> out) throws Exception { 
     out.add(msg.retain()); 
     out.add(ctx.alloc().buffer(1).writeByte(NUL)); 
    } 

} 

cevap

5

MessageToMessageEncoderrelease s orijinal mesaj:

İşte benim Encoder bu. Kodlayıcınız kodlama sonucunda yeni mesaj döndürdüğünde, MessageToMessageEncoder'un tipik kullanım durumuyla tutarlı olduğundan, orijinal mesaj kodlamadan sonra güvenle atılabilir. Ancak, örneğinizde olduğu gibi, sonucun bir parçası olarak kullanıldığında, orjinal mesaj atılmamalıdır. Bu durumda, retain()'u açıkça aramanız gerekir. javadoc of MessageToMessageEncoder itibaren

:

sadece onlar tipi ReferenceCounted ait olup olmadığını geçirilir iletilerde ReferenceCounted.retain() çağırmanız gerekir unutmayın. MessageToMessageEncoder kodlanmış iletilerde ReferenceCounted.release() öğesini arayacağı için bu gereklidir.

İlgili konular