Ha Netty contemporaneamente modificare ChannelBuffers passati
Domanda
In Netty, qualcuno sa se il ChannelBuffer passato a un gestore per un evento a monte (dopo lanci da ChannelEvent / o MessageEvent) saranno contemporaneamente scritta dal quadro Netty mentre si elabora esso?
Il manuale d'uso e gli esempi non esplicitamente chiarire se questo accadrà o meno.
Per esempio, immaginate il seguente metodo in una classe che estende SimpleChannelHandler ed è legato come il gestore su un server di Netty:
@Override
public void messageReceived(ChannelHandlerContext ctx, MessageEvent e)
{
ChannelBuffer buffer = (ChannelBuffer) e.getMessage();
if (buffer.readableBytes() == 4)
{
// Is it possible for the number of readable bytes to increase here?
}
}
Nel metodo di cui sopra, è possibile che il numero di byte leggibili per aumentare sulla linea commentata (assumendo che il client è ancora inviando dati), o saranno quei fotogrammi essere garantita come messaggi separati e non scritta nel buffer in dotazione ?
Il motivo che mi chiedo è di sapere se o non dovrei copiare il buffer ad una locale prima di fare un po 'della mia trasformazione, o se tale copia è superfluo.
Soluzione
Una volta Netty crea un ChannelBuffer
e innesca una MessageEvent
con esso, è dalle mani di Netty Netty e quindi non modifica con qualsiasi mezzo. I gestori o altro codice utente può modificare il buffer, ma solitamente, gestori ben scritti non interferire con altri gestori. Se un cattivo gestore mantiene il riferimento al buffer ricevuto e modifica in seguito, poi si vedrà stato cuscinetto rotto però.