Apache camel 带有netty4 http-EncoderException的camel

Apache camel 带有netty4 http-EncoderException的camel,apache-camel,netty,Apache Camel,Netty,我正在使用camel 2.14.0和netty4 http 我得到了以下例外 情况是这样的: 我有一个发送请求、等待响应(inOut)然后发送另一个请求的路由。 第一个请求有效,第二个请求失败 此外,如果我在失败后足够快地完成,第一个请求也会失败 在调试bit(HttpObjectEncoder)时,我看到在工作流程中请求的状态是:state=ST_INIT(0) 在失败的请求中,它是:ST_CONTENT_NON_CHUNK(1) 当消息类型为HttpMessage时,会导致非法状态 这是一个

我正在使用camel 2.14.0和netty4 http 我得到了以下例外

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

此外,如果我在失败后足够快地完成,第一个请求也会失败

在调试bit(HttpObjectEncoder)时,我看到在工作流程中请求的状态是:state=ST_INIT(0) 在失败的请求中,它是:ST_CONTENT_NON_CHUNK(1) 当消息类型为HttpMessage时,会导致非法状态

这是一个bug还是我可以配置任何东西来修复它

原因:io.netty.handler.codec.EncoderException:java.lang.IllegalStateException:意外消息类型:DefaultFullHttpRequest 在io.netty.handler.codec.MessageToMessageEncoder.write(MessageToMessageEncoder.java:107) 位于io.netty.channel.CombinedChannelDuplexHandler.write(CombinedChannelDuplexHandler.java:192) 位于io.netty.channel.AbstractChannelHandlerContext.invokeWrite(AbstractChannelHandlerContext.java:658) 位于io.netty.channel.AbstractChannelHandlerContext.access$2000(AbstractChannelHandlerContext.java:32) 位于io.netty.channel.AbstractChannelHandlerContext$AbstractWriteTask.write(AbstractChannelHandlerContext.java:939) 位于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) 运行(Thread.java:745) 原因:java.lang.IllegalStateException:意外消息类型:DefaultFullHttpRequest 位于io.netty.handler.codec.http.HttpObjectEncoder.encode(HttpObjectEncoder.java:63) 位于io.netty.handler.codec.http.HttpClientCodec$Encoder.encode(HttpClientCodec.java:106) 在io.netty.handler.codec.MessageToMessageEncoder.write(MessageToMessageEncoder.java:89) ... 10多


我设法找出了问题:

我发送的第一个请求是一个带有空主体的GET请求。 在org.apache.camel.component.netty4.http.nettyhttproducer类中- 方法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\u NON_CHUNK,下一个请求将获得非法StateException,因为状态不是ST_INIT

这个bug在NettyHTTP中并不存在,它只在我使用Netty4HTTP时发生

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