2013-07-31 3 views
0

Я использую старые библиотеки на основе JDK 1.4, и я обнаружил, что существует огромный тайм-аут для попыток подключения к неисключительным URL-адресам. Исследование показало следующую проблему:Как переопределить тайм-аут TCP по умолчанию

До JDK 1.5 не было задано значение для таймаута соединения в объекте URLConnection. Вместо этого он просто использовал значение тайм-аута уровня ОС по умолчанию для таймаута TCP (которое по умолчанию составляет 1800 секунд/30 минут). JDK1.5 и после этого включил опцию для установки пользовательского тайм-аута, который отменяет настройку по умолчанию, предоставляемую операционной системой.

Возможно ли переопределить параметр «Настройка времени ожидания TCP» из java, поэтому код, написанный на java 1.4, использует эти параметры?

ответ

2

Вы должны вызвать системную команду, которая изменит это на вашей машине

  • вы должны быть корень или иметь доступ SUDO
  • он изменяет его для каждой программы
  • вы должны знать, что это для каждой поддерживаемой платформы.

Или вы можете перейти на Java 7. Даже Java 6 - это конец строки.

1

Вместо этого просто использовать значение уровня OS по умолчанию тайм-аут для TCP тайм-аут (который по умолчанию случается 1800 секунд/30 минут)

Это не так. Существует несколько тайм-аутов TCP, но тот, который здесь применяется, - это таймаут соединения, который состоит из трех попыток с внутренними таймаутами, такими как 10, 20, 40 секунд, всего 70 секунд. Конечно, не полчаса. На самом деле, я не знаю ни одного тайм-аута TCP, который по умолчанию составляет полчаса.

Можно ли переопределить параметр «Настройка времени ожидания TCP» из java, поэтому код, написанный на java 1.4, использует эти параметры?

Вы можете использовать regedit или что-то подходящее в целевой системе, но вы будете менять его для всех, что, безусловно, нецелесообразно.

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

0

Если у вас есть доступ к объектам (-ам) сокета, вы можете изменить таймаут, установив опцию сокета SO_TIMEOUT. Это позволяет вам изменить таймаут для всех блокирующих вызовов (например, connect()). Он доступен по крайней мере в 1.4.2.

+0

Это не влияет на таймауты подключения. Это влияет на таймаут чтения. Он также не устанавливает тайм-аут записи. -1 – EJP

+0

А, простите, я этого не видел. Вы можете изменить вызов для подключения? Я вижу, что у него есть параметр тайм-аута. Или библиотека использует что-то вроде SocketChannel? Если последнее, извлечение сокета (socket()) и выполнение соединения вручную работает (если моя память служит мне правильно). Или у вас есть достаточный доступ для установки socketchannel как неблокирующего (для подключения)? –

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