Тайм-аут соединения означает, что ваша программа вообще не смогла подключиться к серверу в указанное время.
Время ожидания может быть настроено, так как, как вы говорите, для подключения некоторых систем может потребоваться больше времени, и, если это известно заранее, его можно разрешить. В противном случае тайм-аут служит защитой для предотвращения бесконечного ожидания приложения, что в большинстве случаев не очень удобно для пользователя.
Обычно для чтения данных можно настроить отдельный тайм-аут (тайм-аут сокета). Они не включают друг друга.
Чтобы решить вашу проблему:
Убедитесь, что сервер работает и принимает входящие соединения.
Возможно, вы захотите использовать curl
или, в зависимости от того, что именно ваш браузер пытается подключить.
Если один инструмент может подключиться, а другой - нет, проверьте настройки брандмауэра и убедитесь, что исходящие подключения из вашей программы Java разрешены. Самый простой способ проверить, является ли это проблемой, это временно отключить антивирус и брандмауэр . Если это разрешает соединение, вам нужно либо отключить FW, либо лучше добавить соответствующее исключение.
Оставьте тайм-аут на более высоком уровне (или попробуйте установить его на 0, который интерпретируется как бесконечный) во время тестирования. Как только он заработает, вы можете настроить его так, чтобы он соответствовал спецификациям вашего сервера и требованиям юзабилити.
Edit:
Я понял, что это не обязательно поможет, поскольку вы в конечном итоге подключились. Я оставлю вышеупомянутое положение как общая информация.
как долго я могу пытаться подключиться к API и от чего это зависит?
Скорее всего, сервер, на котором размещен API. Если он перегружен, время отклика может увеличиться.
Откуда эти 20 секунд?
Опять же, это зависит от сервера API. Он может быть случайным или обрабатывать каждый запрос в течение фиксированного периода времени, прежде чем окажется в состоянии ошибки. В этом случае это может занять 20 секунд каждый раз.
Что если API ответит через 40 минут, и я не смогу уловить этот конкретный момент и просто потерять данные. Я не хочу, чтобы это случилось. Какие у меня варианты?
- Используйте более надежный API, возможно, заплатив за гарантию обслуживания.
- Настройте время соединения и сокета, чтобы учесть возможности серверной стороны, если это известно заранее.
- Если ответ действительно 40 минут, это действительно плохой сервис, но перейдем к этому предположению - если набор данных настолько велик, исследуйте, предлагает ли API обратный вызов потоковой передачи, посредством чего вы передаете OutputStream в API методы библиотеки, в которые он будет (асинхронно) записывать ответ, когда он будет готов.
- Имейте в виду, что соединение и время ожидания сокета - это разные вещи После того, как вы подключились, тайм-аут соединения становится неактуальным (сокет установлен). Пока вы начинаете получать и продолжаете получать данные (от пакета к пакету) в течение времени ожидания сокета, время ожидания сокета также не сработает.
- Используйте бесконечные тайм-ауты (установите на 0), но это может привести к плохому удобству использования в ваших приложениях, а также к утечкам ресурсов, если сервер фактически отключен и никогда не будет отвечать. В этом случае у вас останутся оборванные связи.