首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >骆驼与netty4 4-http- EncoderException

骆驼与netty4 4-http- EncoderException
EN

Stack Overflow用户
提问于 2014-10-05 09:08:14
回答 1查看 804关注 0票数 0

我在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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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调用的结果到达编码器时-由于代码的这一部分,编码器不清理其状态:

代码语言:javascript
复制
 if (msg instanceof LastHttpContent) {
    state = ST_INIT;
 }

DefaultHttpRequest不是LastHttpContent的实例,所以状态保持为ST_CONTENT_NON_CHUNK,下一个请求将得到一个IllegalStateException,因为状态不是ST_INIT

此错误不存在于netty-http中,仅在我使用netty 4-http时才发生。

解决方法很简单--使用空字符串("")作为主体。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26201196

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档