我们使用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.
不幸的是,我没有看到另一个解决方案,而是创建一个自定义的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)
| 归档时间: |
|
| 查看次数: |
5949 次 |
| 最近记录: |