2013-12-16 5 views
5

Ich schreibe einen Encoder, der NUL-Terminiert eine JSON-Nachricht, so dass es im Falle einer fragmentierten Nachricht entschlüsselt werden kann.Wann muss ich ByteBuf.retain() in einem Netty4 Encoder verwenden?

Ich fand dieses Beispiel ->click wo ByteBuf.retain() aufgerufen wurde, am Ende ein vorhandenes ByteBuf an den Ausgang zu schreiben. Warum haben sie das getan und warum wird es gebraucht?

Hier ist mein Encoder:

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

} 

Antwort

5

standardmäßig MessageToMessageEncoderrelease ursprüngliche Nachricht nach der Codierung. Es entspricht dem typischen Anwendungsfall von MessageToMessageEncoder, wenn Ihr Encoder als Ergebnis der Codierung eine neue Nachricht zurückgibt, sodass die ursprüngliche Nachricht nach der Codierung sicher verworfen werden kann.

Die ursprüngliche Nachricht sollte jedoch nicht verworfen werden, wenn sie als Teil des Ergebnisses verwendet wird, wie in Ihrem Fall. In diesem Fall müssen Sie explizit retain() anrufen.

Vom javadoc of MessageToMessageEncoder:

Beachten Sie, dass Sie anrufen müssen ReferenceCounted.retain() auf Nachrichten, die gerade durchlaufen werden, wenn sie vom Typ ReferenceCounted. Dies ist erforderlich, da MessageToMessageEncoder ReferenceCounted.release() für codierte Nachrichten aufruft.

Verwandte Themen