我有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过期后套接字关闭了。但是如何在不关闭连接的情况下使用池?
答案 0 :(得分:1)
这是CachingClientConnectioNFactory
中的错误;它没有正确处理以这种方式超时的连接;连接实际上没有关闭,读者线程终止。
请打开JIRA Issue;感谢。
解决方法可能是删除soTimeout属性;您也可以在服务器端放置一个soTimeout,以便启动关闭。
实际上,假设您正在使用single-use="true"
(每个连接都有一个新套接字),那么使用CachingClientConnectionFactory
将无法获益;它旨在提供一个共享连接池。