Сброс подключения сокета клиента Spring Hessian

Я использую 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)

Я попытался установить 30-минутное значение readTimeout, доступное в HessianProxyFactoryBean, но получило то же исключение через 9.xx/10 минут. Однако, когда я попытался с readTimeout 2 минуты, я получаю Тайм-аут чтения через 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.

Подскажите пожалуйста что делать?

1 ответ

Решение

После некоторой отладки я обнаружил, что мой сервер 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

Надеюсь, что это помогает другим

Другие вопросы по тегам