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
Post a Comment