Netty 4 MessageToByteEncoder with FileRegion -


i migrating raw nio netty. response need send follows

short long long long file 

i have following working example, , wondering how move fileregion encoder.

messagetobyteencoder

@override protected void encode(final channelhandlercontext ctx, final blockresponse msg,     final bytebuf out) throws exception {   out.writeshort(dataservermessage.data_server_response_message);   out.writelong(msg.getblockid());   out.writelong(msg.getoffset());   out.writelong(msg.getlength()); } 

channelinboundhandleradapter

    ctx.write(new blockresponse(blockid, offset, readlength));     filechannel channel = closer.register(file.getchannel());     channelfuture future = ctx.writeandflush(new defaultfileregion(channel, offset, readlength));     future.addlistener(channelfuturelistener.close); 

i think if did writeandflush in adapter response (and put file in there), writeandflush in encoder, encoder need close it. there way?

thanks!

edit:

here updated code works:

public static final class encoder extends messagetomessageencoder<blockresponse> {   private static final int header_length = 2 + 4 * 3; // short, 3 longs    @override   protected void encode(final channelhandlercontext ctx, final blockresponse msg,       final list<object> out) throws exception {     out.add(createheader(ctx, msg));     if (msg.getchannel() != null) {       out.add(new defaultfileregion(msg.getchannel(), msg.getoffset(), msg.getlength()));     }   }    private bytebuf createheader(final channelhandlercontext ctx, final blockresponse msg) {     bytebuf header = ctx.alloc().buffer(header_length);     header.writeshort(dataservermessage.data_server_response_message);     header.writelong(msg.getblockid());     header.writelong(msg.getoffset());     header.writelong(msg.getlength());     return header;   } } 

channelinboundhandleradapter

channelfuture future =     ctx.writeandflush(new blockresponse(blockid, offset, readlength, channel)); future.addlistener(channelfuturelistener.close); future.addlistener(new closableresourcechannellistener(file)); 

if need trigger fileregion within encoder need use messagetomessageencoder , allocate bytebuf own inside there.


Comments