Apache Camel:为什么收到200 OK后TCP连接没有关闭

ops*_*alj 8 http apache-camel

我们使用Apache Camel作为编排引擎.通常,以下情形:

客户端发送HTTP请求< - > CAMEL代码< - >外部服务器

当我们的客户端向我们的CAMEL代码发送HTTP请求时,球开始滚动.Camel代码将通过REST HTTP调用触发外部服务器.最终,Camel代码会将回复发送回客户端.

在将响应发送回客户端之前的最后一个操作,Camel代码向外部服务器发送HTTP GET.因此首先设置TCP连接,然后发送数据.一段时间后(这可能需要5到10秒),外部服务器回复200 OK.

问题:收到200 OK后,Camel不会向外部服务器发送TCP FIN.结果,TCP连接保持打开状态...(外部服务器然后在超时200秒后关闭TCP连接,但这意味着TCP资源在200秒内丢失).

所以,在TCP级别,它是这样的:

Camel <---------->外部服务器

   TCP SYN  -->
   <-- TCP SYN,ACK
   TCP ACK  -->

   HTTP GET -->
   <-- 200 OK
   TCP ACK  -->

   <200 seconds later>
   <-- TCP FIN,ACK
   TCP ACK  -->
Run Code Online (Sandbox Code Playgroud)

知道如何让Camel收到200 OK之后关闭TCP连接吗?

注意:我尝试添加"Connection:close"标题,但是Camel没有添加标题?!它似乎忽略了它......

这是添加标头的代码:

exchange.getOut().setHeader("Connection","Close");
Run Code Online (Sandbox Code Playgroud)

我在使用Eclipse IDE的Spring框架中使用Camel 2.9.1.

ops*_*alj 5

不幸的是,我没有看到另一个解决方案,而是创建一个自定义的HttpHeaderFilterStrategy类,它不会过滤掉Connection标头.然后在将请求发送到外部服务器之前,我设置标题"Connection:close".一旦此请求得到回复,Camel代码就会发送TCP FIN,ACK以关闭TCP连接.

更多细节:

1)创建一个自定义的HttpHeaderFilterStrategy类,例如:CustomHttpHeaderFilterStrategy

2)调整applicationContext.xml,使其指向该类,例如:

<bean id="http" class="org.apache.camel.component.http.HttpComponent">
    <property name="camelContext" ref="camel"/>
    <property name="headerFilterStrategy" ref="myHeaderFilterStrategy"/>
</bean>

<bean id="myHeaderFilterStrategy" class="com.alu.iptc.com.CustomHttpHeaderFilterStrategy">
</bean>
Run Code Online (Sandbox Code Playgroud)

3)调整你的代码,以便设置Connection:close标头,例如:

exchange.getOut().setHeader("Connection","close");
Run Code Online (Sandbox Code Playgroud)