so far have been amp'd upgrading netty version 3.5.7.final 4.0.0cr3 until ran final problem during upgrade.... lengthfieldbasedframedecoder. each available constructor requires maxframelength set integer.max_value when running client/server several stack traces (one shown below) state integer.max_value has been exceeded (2147483647). have tried take shot @ configuring maximum channel buffer size digging through channelconfig class in api docs , various other stackoverflow post, still no prevail. know if there missing option can set or way prevent reads being high?
stack trace:
io.netty.handler.codec.toolongframeexception: adjusted frame length exceeds 2147483647: 4156555235 - discarded @ io.netty.handler.codec.lengthfieldbasedframedecoder.fail(lengthfieldbasedframedecoder.java:486) @ io.netty.handler.codec.lengthfieldbasedframedecoder.failifnecessary(lengthfieldbasedframedecoder.java:462) @ io.netty.handler.codec.lengthfieldbasedframedecoder.decode(lengthfieldbasedframedecoder.java:397) @ io.netty.handler.codec.lengthfieldbasedframedecoder.decode(lengthfieldbasedframedecoder.java:352) @ io.netty.handler.codec.bytetomessagedecoder.calldecode(bytetomessagedecoder.java:111) @ io.netty.handler.codec.bytetomessagedecoder.inboundbufferupdated(bytetomessagedecoder.java:69) @ io.netty.channel.channelinboundbytehandleradapter.inboundbufferupdated(channelinboundbytehandleradapter.java:46) @ io.netty.channel.defaultchannelhandlercontext.invokeinboundbufferupdated(defaultchannelhandlercontext.java:1031) @ io.netty.channel.defaultchannelhandlercontext.fireinboundbufferupdated0(defaultchannelhandlercontext.java:998) @ io.netty.channel.defaultchannelhandlercontext.fireinboundbufferupdated(defaultchannelhandlercontext.java:978) @ io.netty.handler.timeout.idlestatehandler.inboundbufferupdated(idlestatehandler.java:257) @ io.netty.channel.defaultchannelhandlercontext.invokeinboundbufferupdated(defaultchannelhandlercontext.java:1057) @ io.netty.channel.defaultchannelhandlercontext.fireinboundbufferupdated0(defaultchannelhandlercontext.java:998) @ io.netty.channel.defaultchannelhandlercontext.fireinboundbufferupdated(defaultchannelhandlercontext.java:978) @ io.netty.channel.defaultchannelpipeline.fireinboundbufferupdated(defaultchannelpipeline.java:828) @ io.netty.channel.nio.abstractniobytechannel$niobyteunsafe.read(abstractniobytechannel.java:118) @ io.netty.channel.nio.nioeventloop.processselectedkey(nioeventloop.java:429) @ io.netty.channel.nio.nioeventloop.processselectedkeys(nioeventloop.java:392) @ io.netty.channel.nio.nioeventloop.run(nioeventloop.java:322) @ io.netty.util.concurrent.singlethreadeventexecutor$2.run(singlethreadeventexecutor.java:114) @ java.lang.thread.run(thread.java:680)
my client configured followed:
peerclient.bootstrap = new bootstrap(); peerclient.bootstrap.group(new nioeventloopgroup()) .channel(niosocketchannel.class) .option(channeloption.allocator, unpooledbytebufallocator.default) .option(channeloption.connect_timeout_millis, 120000) .option(channeloption.so_keepalive, true) .option(channeloption.tcp_nodelay, true) .option(channeloption.so_reuseaddr, true) .handler(peerinitializer.newinstance());
my server configuration:
result.serverbootstrap = new serverbootstrap(); result.serverbootstrap.group(new nioeventloopgroup(), new nioeventloopgroup()) .channel(nioserversocketchannel.class) .handler(new logginghandler(loglevel.info)) .childhandler(peerinitializer.newinstance()) .childoption(channeloption.allocator, unpooledbytebufallocator.default);
the initchannel method overridden custom class extending channelinitializer
public class peerinitializer extends channelinitializer<socketchannel> @override protected void initchannel(socketchannel ch) throws exception { final channelpipeline pipeline = ch.pipeline(); pipeline.addlast( messageencoder, handshakedecoder.newinstance(), connectionhandler, handshakehandler, new lengthfieldbasedframedecoder(integer.max_value, 0, 4), messagehandler); }
in netty, converting 4 bytes length field unsigned int(actually long)
lengthfieldbasedframedecoder.java
private long getframelength(bytebuf in, int actuallengthfieldoffset) { in = in.order(byteorder); long framelength; switch (lengthfieldlength) { case 1: framelength = in.getunsignedbyte(actuallengthfieldoffset); break; case 2: framelength = in.getunsignedshort(actuallengthfieldoffset); break; case 3: framelength = in.getunsignedmedium(actuallengthfieldoffset); break; // code case 4: framelength = in.getunsignedint(actuallengthfieldoffset); break; case 8: framelength = in.getlong(actuallengthfieldoffset); break; default: throw new error("should not reach here"); } return framelength; }
abstractbytebuf.java
@override public long getunsignedint(int index) { return getint(index) & 0xffffffffl; }
4156555235 -138412061.
code:
int = 0xf7bfffe3; system.out.println(i);
check value of length field.
try this:
your channelinitializer
public class peerinitializer extends channelinitializer<socketchannel> @override protected void initchannel(socketchannel ch) throws exception { final channelpipeline pipeline = ch.pipeline(); pipeline.addlast( new bytelogginghandler(loglevel.info), // add messageencoder, handshakedecoder.newinstance(), connectionhandler, handshakehandler, new lengthfieldbasedframedecoder(integer.max_value, 0, 4), messagehandler); }
hope helps.
Comments
Post a Comment