2009-05-12 2 views
1

У меня есть приложение Java, которое использует сторонний COM-компонент через мост Java-COM. Этот компонент COM открывает соединение сокета с удаленным хостом.Конфигурация тайм-аута сокета TCP

Этот хост может занять некоторое время, чтобы ответить, и я подозреваю, что получаю тайм-аут. Я не уверен, потому что, как я уже сказал, это сторонний компонент с закрытым исходным кодом.

API этого компонента не предоставляет мне сокет, поэтому у меня нет способа настроить таймаут. Поэтому мне интересно, есть ли способ настроить тайм-аут по умолчанию для системы.

Я использую Windows Server 2008 x64 Enterprise Edition.

ответ

1

Вы хотите создать приложение так, чтобы оно было известно во время выполнения независимо от того, произошло ли время ожидания или вы хотите проверить поведение COM-компонента с закрытым исходным кодом? Если это последний, установите Wireshark в свою dev-бокс и посмотрите соединение. Если это первый, вы хотите, чтобы ваш Java-вызов на родину не вешал вечно? Если это так, загляните в материал службы исполнителей java.util.concurrent - есть способ вызвать метод в другом потоке и дождаться не более N секунд, прежде чем возвращать управление вашему потоку.

0

Вы можете представить свой собственный SocketImplFactory (см. Статический метод setSocketImpl() класса java.net.Socket). Затем вы можете создавать объекты SocketImpl с собственным значением параметра SO_TIMEOUT.

+0

Сокет не создается с помощью кода Java, но с помощью COM-объекта в C++ I Угадай. – tuler

+0

А, да. Ты прав. Ну, мне интересно, невозможно ли что-то подобное и с родными библиотеками Windows. – Matej

0

Параметры реестра, описанные в «Конфигурационные параметры Windows Vista Tcp Ip» в Microsoft для TcpMaxDataRetransmissions, могут позволить вам установить глобальные тайм-ауты, которые вам нужны.

Вы, конечно, должны быть осторожны, чтобы вы не нанесли ущерб оставшейся части сервера в процессе с отложенными ответами на реальные ошибки.

Смежные вопросы