最近、頭痛の種となる問題が発生しました。助けが必要です...
システムは、AとBと呼ばれる2つのサブシステムで構成され、それぞれがスタンドアロンの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の間のシステムコールが失敗すると、同じ例外を除いて、外部サービスへのHTTPを介したBシステムコールも失敗しました。
両方のTomcatサービスを再起動すると、システム全体が正しく機能します。
したがって、手順1〜5を繰り返し実行しても、根本的な理由は見つかりませんでした。
環境:
何か案は?
RestTemplateにも同じ問題がありました。 HttpClientを使用するように初期化を変更したところ、問題が修正されました。
これが私が使用した春の宣言です:
<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)の後)で、「接続」に関するエラーが発生しました。