1分钟后Tcp连接池无法正常工作

时间:2013-09-21 18:18:06

标签: spring sockets soap spring-integration

我有SOAP服务,它使用tcp连接与外部服务进行交互。   我正在为此tcp服务使用连接池。当我启动我的应用程序并发送第一个SOAP请求 - 一切正常,但如果我等待1分钟 - 那么我没有得到响应。但是当我用Wireshark嗅到流量时 - 我知道,返回的是什么响应。   小额外 - 如果我不等待1分钟并发送新请求 - 一切正常。只有等待1分钟才会出现问题。这是我对pool和tcp的配置:

<beans profile="single">
    <bean id="testConnectionFactory" class="com.test.provider.impl.ProviderTcpConnectionFactory">
        <constructor-arg name="host" value="localhost"/>
        <constructor-arg name="port" value="7700"/>
        <property name="connectionTimeout" value="10000"/>
        <property name="soTimeout" value="60000"/>
        <property name="deserializer" ref="testDeserializer"/>
        <property name="singleUse" value="true"/>
    </bean>
</beans>

<beans profile="pool">
    <bean id="testConnection" class="com.test.provider.impl.ProviderTcpConnectionFactory">
        <constructor-arg name="host" value="localhost"/>
        <constructor-arg name="port" value="7700"/>
        <property name="connectionTimeout" value="10000"/>
        <property name="soTimeout" value="60000"/>
        <property name="deserializer" ref="testDeserializer"/>
        <property name="singleUse" value="true"/>
    </bean>
    <bean id="testConnectionFactory" class="org.springframework.integration.ip.tcp.connection.CachingClientConnectionFactory">
        <constructor-arg ref="testConnection"/>
        <constructor-arg value="5"/>
    </bean>
</beans>

在日志中,我看到下一行

DEBUG [org.springframework.integration.ip.tcp.connection.TcpNetConnection] Closed single use socket after timeout

据我所知 - 在soTimeout过期后套接字关闭了。但是如何在不关闭连接的情况下使用池?

1 个答案:

答案 0 :(得分:1)

这是CachingClientConnectioNFactory中的错误;它没有正确处理以这种方式超时的连接;连接实际上没有关闭,读者线程终止。

请打开JIRA Issue;感谢。

解决方法可能是删除soTimeout属性;您也可以在服务器端放置一个soTimeout,以便启动关闭。

实际上,假设您正在使用single-use="true"(每个连接都有一个新套接字),那么使用CachingClientConnectionFactory将无法获益;它旨在提供一个共享连接池。