1

私はSpring 3.1.0、com.springsource.com.caucho-3.2.1.jar、およびtomcat-6.0.33を両側(クライアント/サーバー)で使用しています。すべてのリモート サービス コールは、長時間かかるサービス (9/10 分以上) を除いて、問題なく正常に動作しています。

リモート呼び出しを保護するために Spring-Security を使用しています。

実際のシナリオでクライアントに応答するのに約 30 分かかる新しいリモート サービスを作成しました。実行にかかった時間が 9.xx/10 分未満の場合、サービスは完全に機能しますが、9.xx/10 分に達した後、Hessian クライアントで接続がリセットされます。

クライアント構成

<bean id="someService" class="org.springframework.remoting.caucho.HessianProxyFactoryBean">
    <property name="serviceUrl" value="http://hostname:8080/remoting/someService"/>
    <property name="serviceInterface" value="com.SomeService"/>
    <property name="username" value="${service.username}"/>
    <property name="password" value="${service.password}"/>
</bean>

サーバー構成

<bean id="someService" class="com.SomeService" />

<bean name="/someService" class="org.springframework.remoting.caucho.HessianServiceExporter">
    <property name="service" ref="someService" />
    <property name="serviceInterface" value="com.SomeService" />
</bean>

クライアント側 - スタック トレース:

2013-Feb-28 17:48:19 DEBUG [http-8080-1] com.SomeService:85 - Calling Some Service
2013-Feb-28 17:58:16 ERROR [http-8080-1] com.SomeService:113 - 
org.springframework.remoting.RemoteConnectFailureException: 
Cannot connect to Hessian remote service at [http://hostname:8080/remoting/someService]; 
nested exception is com.caucho.hessian.client.HessianConnectionException: 
500: java.net.SocketException: Connection reset
at org.springframework.remoting.caucho.HessianClientInterceptor.convertHessianAccessException(HessianClientInterceptor.java:262)

サーバー側 - Tomcat (localhost.log)

SEVERE: Servlet.service() for servlet [remoting] in context with path [/JTService] 
threw exception [Hessian skeleton invocation failed; nested exception is
ClientAbortException:  java.net.SocketException: Connection reset] with root cause
java.net.SocketException: Connection reset
    at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:96)

HessianProxyFactoryBean で使用可能な readTimeout の 30 分の値を設定しようとしましたが、9.xx/10 分後に同じ例外が発生しました。ただし、 readTimeout 2 minutes を試してみると、2分後に読み取りがタイムアウトしました。

readTimeout を 2 分に設定した後、次のようになります。

2013-Feb-28 17:44:10 ERROR [http-8080-1] com.SomeService:113 - org.springframework.remoting.RemoteConnectFailureException: 
Cannot connect to Hessian remote service at [http://hostname:8080/remoting/someService]; 
nested exception is com.caucho.hessian.client.HessianConnectionException: 500: java.net.SocketTimeoutException: Read timed out
org.springframework.remoting.RemoteConnectFailureException: 
Cannot connect to Hessian remote service at [http://hostname:8080/remoting/someService]; 
nested exception is com.caucho.hessian.client.HessianConnectionException: 500: java.net.SocketTimeoutException: Read timed out

readTimeout のように、 HessianProxyFactoryBean の下の接続タイムアウトに関連する設定は表示されませんでした。

何をすべきか提案してください。

4

1 に答える 1

2

いくつかのデバッグの後、数分後に Linux / CentOS サーバーがネットワーク接続を閉じていることがわかりました。*/proc/sys/net/ipv4/tcp_keepalive_time* で接続キープアライブ時間を増やした後、接続タイムアウトの問題が解決しました。

Linux コンソールのサンプル出力:

キープアライブ時間を秒単位で表示します

[root@hostname ~]# cat /proc/sys/net/ipv4/tcp_keepalive_time 
7200

次のコマンドを使用して値を増やします

[root@hostname ~]# echo "21600" > /proc/sys/net/ipv4/tcp_keepalive_time

これが他の人にも役立つことを願っています

于 2013-03-05T06:08:39.530 に答える