web-dev-qa-db-ja.com

SocketExceptionを解決する方法:許可が拒否されました:接続

最近、頭痛の種となる問題が発生しました。助けが必要です...

システムは、AとBと呼ばれる2つのサブシステムで構成され、それぞれがスタンドアロンのTomcatインスタンスで実行され、現在同じマシンで実行されています。 Aは、Spring httpInvokerを介して(つまり、HTTPを介して)Bのサービスを呼び出します。 Bシステムは、HTTPを介して他のシステムのサービスも呼び出します。

症状:

  1. システムが実行を開始し、約10〜15日間正常に動作しているように見えます。

  2. システムは、例外の後、一定期間実行されます。

    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**
    
  3. 例外が発生すると、システムは続行します。これはたまに起こるだけでなく、常に起こります。 (一部のリソースが使い果たされているように見えますが、CPUレート<5%、メモリ<15%、ネットワーク<5%)。

  4. aとBの間のシステムコールが失敗すると、同じ例外を除いて、外部サービスへのHTTPを介したBシステムコールも失敗しました。

  5. 両方のTomcatサービスを再起動すると、システム全体が正しく機能します。

したがって、手順1〜5を繰り返し実行しても、根本的な理由は見つかりませんでした。

環境:

  • windows 2008 R2
  • Tomcat7.0.42 x86_64
  • オーラルス-jdk-1.7.0_40

何か案は?

2
luxinxian

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)の後)で、「接続」に関するエラーが発生しました。

1
JNG