我正在使用带有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.runAllTasks(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个
答案 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
时解决方法很简单 - 使用空字符串(“”)作为正文