Ключ конфигурации server.connection-timeout
не поддерживается для серверов Netty (пока), я поднял spring-boot # 15368 , чтобы исправить это.
Время ожидания соединения составляет околомаксимальное количество времени, которое мы должны ждать для установления соединения.Если вы хотите настроить таймауты чтения / записи, это разные варианты.Вы можете добавить ReadTimeoutHandler
, который закрывает соединение, если сервер не получает данные от клиента в течение заданного времени.То же самое с WriteTimeoutHandler
, но на этот раз с сервером, записывающим данные клиенту.
Вот полный пример для этого:
@Configuration
public class ServerConfig {
@Bean
public WebServerFactoryCustomizer serverFactoryCustomizer() {
return new NettyTimeoutCustomizer();
}
class NettyTimeoutCustomizer implements WebServerFactoryCustomizer<NettyReactiveWebServerFactory> {
@Override
public void customize(NettyReactiveWebServerFactory factory) {
int connectionTimeout = //...;
int writetimeout = //...;
factory.addServerCustomizers(server -> server.tcpConfiguration(tcp ->
tcp.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, connectionTimeout)
.doOnConnection(connection ->
connection.addHandlerLast(new WriteTimeoutHandler(writetimeout)))));
}
}
}
Вернемся к вашему вопросу сейчас, я 'мы проверили эту конфигурацию со следующим контроллером:
@RestController
public class TestController {
@GetMapping(path = "/", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<String> textStream() {
return Flux.interval(Duration.ofSeconds(5)).map(String::valueOf);
}
}
Пока интервал меньше настроенного времени записи, соединение не закрывается сервером.Вы можете проверить это с помощью httpie и следующей команды http localhost:8080/ --stream --timeout 60
.
Я протестировал эту команду netcat на своем локальном компьютере, и пока у меня нет таймаута.
time nc -vv 192.168.0.28 8080
192.168.0.28 8080 (http-alt) open
^CExiting.
Total received bytes: 0
Total sent bytes: 0
nc -vv 192.168.0.28 8080 0.01s user 0.00s system 0% cpu 2:36.53 total
Может быть, это что-то настроено на уровне ОС, или, может быть, сетевое устройство настроено на закрытие таких соединений?Я только что увидел, что вы добавили ярлык spring-cloud-gateway - может быть, это что-то особенное для этого проекта?