camel with netty4-http - EncoderException

时间:2014-10-05 09:08:15

标签: apache-camel netty

我正在使用带有netty4-http的camel 2.14.0 我得到以下例外。

场景是这样的: 我有一个发送请求的路由,等待响应(inOut)然后发送另一个请求。 第一个请求有效,然后第二个请求失败。

另外,如果我在失败后做得足够快 - 第一个请求也会失败。

同时调试一下(HttpObjectEncoder) - 我在工作流程中看到请求的状态是:state = ST_INIT(0) 在失败的请求中:ST_CONTENT_NON_CHUNK(1) 当消息类型为HttpMessage

时,会导致非法状态

这是一个错误还是我可以配置什么来修复它?

  

引起:io.netty.handler.codec.EncoderException:java.lang.IllegalStateException:意外的消息类型:DefaultFullHttpRequest       at io.netty.handler.codec.MessageToMessageEncoder.write(MessageToMessageEncoder.java:107)       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(AbstractChannelHandlerContext.java:939)       at io.netty.channel.AbstractChannelHandlerContext $ WriteAndFlushTask.write(AbstractChannelHandlerContext.java:991)       at io.netty.channel.AbstractChannelHandlerContext $ AbstractWriteTask.run(AbstractChannelHandlerContext.java:924)       at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTask​​s(SingleThreadEventExecutor.java:380)       在io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:357)       at io.netty.util.concurrent.SingleThreadEventExecutor $ 2.run(SingleThreadEventExecutor.java:116)       在java.lang.Thread.run(Thread.java:745)   引起:java.lang.IllegalStateException:意外的消息类型:DefaultFullHttpRequest       at io.netty.handler.codec.http.HttpObjectEncoder.encode(HttpObjectEncoder.java:63)       at io.netty.handler.codec.http.HttpClientCodec $ Encoder.encode(HttpClientCodec.java:106)       at io.netty.handler.codec.MessageToMessageEncoder.write(MessageToMessageEncoder.java:89)       ......还有10个

1 个答案:

答案 0 :(得分:0)

我设法确定了问题:

我发送的第一个请求是一个带有null body的GET请求。 在类org.apache.camel.component.netty4.http.NettyHttpProducer中 - 方法getRequestBody(Exchange exchange)正在从交换中创建实际的请求对象。 在其中 - 类org.apache.camel.component.netty4.http.DefaultNettyHttpBinding中的方法“toNettyRequest” 检查主体是否为空,如果是 - 它正在创建DefaultHttpRequest,而不是DefaultHttpFullRequest

当请求因writeAndFlush调用而到达编码器时 - 由于代码的这部分,编码器不会清除其状态:

 if (msg instanceof LastHttpContent) {
    state = ST_INIT;
 }

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

这个bug在netty-http中不存在,它只发生在我移动使用netty4-http

解决方法很简单 - 使用空字符串(“”)作为正文