2013-12-16 2 views
5

मैं एक एन्कोडर लिख रहा हूं जो एक JSON- संदेश को एनयूएल-टर्मिनेट करता है ताकि संदेश खंडित होने पर इसे डीकोड किया जा सके।मुझे Nette4 Encoder में ByteBuf.retain() का उपयोग कब करना है?

मुझे यह नमूना मिला ->click जहां ByteBuf.retain() को आउटपुट में मौजूदा बाइटबफ लिखने के अंत में बुलाया गया था। उन्होंने ऐसा क्यों किया, और इसकी आवश्यकता क्यों है?

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

} 

उत्तर

5

डिफ़ॉल्ट रूप से MessageToMessageEncoderrelease रों एन्कोडिंग के बाद मूल संदेश:

यहाँ मेरी एनकोडर है। यह MessageToMessageEncoder के सामान्य उपयोग मामले के अनुरूप है, जब आपका एन्कोडर एन्कोडिंग के परिणामस्वरूप नया संदेश देता है, ताकि मूल संदेश को एन्कोडिंग के बाद सुरक्षित रूप से त्याग दिया जा सके।

हालांकि, जब आपके मामले में परिणाम के हिस्से के रूप में उपयोग किया जाता है तो मूल संदेश को त्यागना नहीं चाहिए। इस मामले में आपको retain() को स्पष्ट रूप से कॉल करने की आवश्यकता है।

javadoc of MessageToMessageEncoder से

:

ध्यान रखें कि आप संदेशों कि सिर्फ अगर वे प्रकार ReferenceCounted के हैं के माध्यम से पारित कर रहे हैं पर ReferenceCounted.retain() कॉल करने की आवश्यकता है। यह आवश्यक है क्योंकि MessageToMessageEncoder एन्कोड किए गए संदेशों पर ReferenceCounted.release() को कॉल करेगा।

संबंधित मुद्दे