我在netty4 4-http中使用camel 2.14.0,并得到以下异常。
场景是这样的:我有一个发送请求的路由,等待响应(inOut),然后发送另一个请求。第一个请求起作用,然后第二个请求失败。
而且,如果我在失败后做得足够快,那么第一个请求也会失败。
在调试bit (HttpObjectEncoder)时,我看到在工作流程中,请求的状态是: state = ST_INIT (0),在失败的请求中是: ST_CONTENT_NON_CHUNK (1),当消息类型为HttpMessage时,ST_CONTENT_NON_CHUNK(1)会导致非法状态。
这是一个bug,还是有什么我可以配置来修复它?
原因: io.netty.handler.codec.EncoderException: java.lang.IllegalStateException:意外消息类型: DefaultFullHttpRequest at io.netty.channel.CombinedChannelDuplexHandler.write(CombinedChannelDuplexHandler.java:192) at io.netty.channel.AbstractChannelHandlerContext.invokeWrite(AbstractChannelHandlerContext.java:658) at io.netty.channel.AbstractChannelHandlerContext.access$2000(AbstractChannelHandlerContext.java:32) at io.netty.channel.AbstractChannelHandlerContext$AbstractWriteTask.write(在io.netty.channel.AbstractChannelHandlerContext$WriteAndFlushTask.write(AbstractChannelHandlerContext.java:991),io.netty.channel.AbstractChannelHandlerContext$AbstractWriteTask.run(AbstractChannelHandlerContext.java:924),io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:380),io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:357),io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:116),java.lang。由: io.netty.handler.codec.http.HttpObjectEncoder.encode(HttpObjectEncoder.java:63)引起的Thread.run(Thread.java:745):意外消息类型: DefaultFullHttpRequest at io.netty.handler.codec.http.HttpClientCodec$Encoder.encode(HttpClientCodec.java:106) at io.netty.handler.codec.MessageToMessageEncoder.write(MessageToMessageEncoder.java:89) . 10
发布于 2014-10-08 04:29:31
我设法找出了问题所在:
我发送的第一个请求是带有空主体的GET请求。在类org.apache.camel.component.netty4.http.NettyHttpProducer中,方法getRequestBody( exchange )从交换中创建实际的请求对象。在它中,类org.apache.camel.component.netty4.http.DefaultNettyHttpBinding中的"toNettyRequest“方法检查主体是否为null,如果为null,则它正在创建一个DefaultHttpRequest,而不是DefaultHttpFullRequest。
当请求作为writeAndFlush调用的结果到达编码器时-由于代码的这一部分,编码器不清理其状态:
if (msg instanceof LastHttpContent) {
state = ST_INIT;
}DefaultHttpRequest不是LastHttpContent的实例,所以状态保持为ST_CONTENT_NON_CHUNK,下一个请求将得到一个IllegalStateException,因为状态不是ST_INIT
此错误不存在于netty-http中,仅在我使用netty 4-http时才发生。
解决方法很简单--使用空字符串("")作为主体。
https://stackoverflow.com/questions/26201196
复制相似问题