Пользовательские тайм-ауты TCP Java Socket не работают только на докере

Этот код работает с ОС по умолчанию отлично на моей машине, но с не в докере, и я не нашел никакой документации по этому поводу.

    clientSocket = new Socket();

    SocketAddress sockaddr = new InetSocketAddress(propertyFile.getProperty("tcp.pod.ip"),
            Integer.parseInt(propertyFile.getProperty("tcp.pod.port")));

    clientSocket.connect(sockaddr, 150);

    clientSocket.setTcpNoDelay(true);

Часть, которая не работает в докере, — это clientSocket время ожидания подключения (второй параметр), он использует тайм-аут по умолчанию вместо того, который я ему передаю. Все остальное работает идеально.

Пожалуйста, добавьте содержимое вашего Dockerfile. Вы использовали инструкцию EXPOSE?

Alon 29.06.2019 10:57

Этот сокет работает на вашем хосте, и вы хотите подключиться к нему из своего контейнера?

Michał Krzywański 29.06.2019 11:18

Добавлены Dockerfile и docker-compose-yml

Victor Callejas 29.06.2019 11:51

Дайте определение «не работает».

user207421 29.06.2019 11:59

Он использует тайм-аут по умолчанию вместо тайм-аута, который я передаю в функции

Victor Callejas 29.06.2019 12:00

Имеет ли это? Тайм-аут по умолчанию, например, что?

user207421 29.06.2019 12:12

Я оставил его работать более 30 секунд и до сих пор не распознал тайм-аут (и отключил прототип). Без докера ровно столько времени, сколько я прохожу в функции 150 мс или что-то в этом роде.

Victor Callejas 29.06.2019 12:22

Я нашел это в другом посте: «Количество повторных попыток и интервал между ними определяются реализацией TCP/IP в ОС, а Java не позволяет ни узнать, каковы эти значения, ни изменить их».

Victor Callejas 29.06.2019 12:22

Вы не ответили на мой вопрос. Какое время ожидания по умолчанию у вас было? И какое значение имеет количество повторных попыток?

user207421 29.06.2019 12:38

Я знаю, что без докера это работает, а с докером нет, и поведение такое же, как если бы я поставил очень длинное значение во втором параметре функции socker.connect. Точное время не замерял, отключал через 30 секунд при разных тестах. Я постараюсь предоставить сегодня днем ​​или завтра точное время, оставив его все время, необходимое для работы, и два короткометражных видео.

Victor Callejas 29.06.2019 12:44

Например, если поставить 9000 мс. Если я отключаю плату, я вижу отключение через 9 секунд, если я ставлю 150 мс, я вижу отключение почти сразу, но в докере я его никогда не вижу. Выхожу из теста через 30 секунд, думаю проблема с розеткой

Victor Callejas 29.06.2019 12:46

Все остальное работает как в докере, так и без него. Я думал, что это может быть из-за разных реализаций или из-за того, что этот образ докера не является целым Linux из-за конфликтов.

Victor Callejas 29.06.2019 12:47

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

user207421 29.06.2019 13:56

Да, вы правы @user207421. Я хочу знать, почему это занимает время по умолчанию, или что происходит, и как я могу это решить.

Victor Callejas 29.06.2019 16:53
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
14
277
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Мы тестировали в течение нескольких месяцев, но телеметрия была только от нашей ОС через две точки доступа к прототипам, поэтому, если подтверждение не будет получено из-за того, что прототип умер, я увижу это (мы использовали это, чтобы увидеть, была ли связь)

С докером между ОС и механизмом докера есть прокси-сервер, поэтому вы всегда будете видеть, что есть соединение, потому что acks всегда поступает из контейнера в сокет ОС.

Решение для реализации поддержки на уровне приложения (вы не можете сделать это на уровне протокола).

Этот пост объясняет это лучше: Узнать, было ли доставлено сообщение по tcp

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