我最近遇到了一个令我头疼的问题,需要帮助......
该系统由两个子系统组成,分别称为 A 和 B,每个子系统都运行在一个独立的 Tomcat 实例上,并且当前在同一台机器上运行。A 通过 Spring httpInvoker
(即通过 HTTP)调用 B 的服务。B 系统还通过 HTTP 调用另一个系统的服务。
症状:
系统开始运行并正常运行约10-15天;
发生异常后系统还会运行一段时间:
org.springframework.remoting.RemoteAccessException: Could not access HTTP invoker remote service at [http://xxx.xxx.xxx.xxx/remoting/call];
嵌套异常是
java. net.SocketException: **Permission denied: connect**
发生异常时,系统继续运行。这种情况总是发生,而不仅仅是偶尔发生。(看起来有些资源耗尽了,但 CPU 率 < 5%,内存 < 15%,网络 < 5%)。
当 A 和 B 之间的系统调用失败时,B 通过 HTTP 对外部服务的系统调用也会失败,并出现同样的异常。
重新启动两个 Tomcat 服务可以使整个系统正常运行。
于是反复按照步骤1-5,还是没有找到根本原因。
环境:
- 视窗 2008 R2
- tomcat7.0.42 x86_64
- oralce-jdk-1.7.0_40
有任何想法吗?
答案1
我在使用 RestTemplate 时遇到了同样的问题。我将初始化更改为使用 HttpClient,这解决了我的问题。
这是我使用的 spring 声明:
<code>
<bean id="httpClient" class="org.apache.http.impl.client.DefaultHttpClient">
<constructor-arg>
<bean class="org.apache.http.impl.conn.PoolingClientConnectionManager"/>
</constructor-arg>
</bean>
<bean id="restTemplate" class="org.springframework.web.client.RestTemplate" >
<constructor-arg>
<bean class="org.springframework.http.client.HttpComponentsClientHttpRequestFactory">
<constructor-arg ref="httpClient"/>
</bean>
</constructor-arg>
</bean>
</code>
这彻底解决了该问题(之前,在多次 http 请求(约 14500 次)之后,我出现了有关“连接”的错误。