I am using Spring 5 Webclient using Reactor netty to make an HTTP API POST request. My code looks something like this:
HttpClient httpClient = HttpClient.create()
.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 5000)
.option(ChannelOption.SO_KEEPALIVE, true)
.option(EpollChannelOption.TCP_KEEPIDLE, 300)
.option(EpollChannelOption.TCP_KEEPINTVL, 60)
.option(EpollChannelOption.TCP_KEEPCNT, 8)
.doOnConnected(
connection ->
connection
.addHandler(
new ReadTimeoutHandler(1000,
TimeUnit.SECONDS))
.addHandler(
new WriteTimeoutHandler(1000)));
WebClient.builder()
.baseUrl("//some url")
.defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
.defaultHeader(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON_VALUE)
.clientConnector(new ReactorClientHttpConnector(httpClient))
.build();
I was trying to set the TCP configs like TCP_KEEPIDLE, TCP_KEEPINTERVAL
etc, and was hence reading about the same in the project reactor document.
The document said(I'm summarizing):
//The options below are available only when NIO transport (Java 11) is used
.option(NioChannelOption.of(ExtendedSocketOptions.TCP_KEEPIDLE), 300)
.option(NioChannelOption.of(ExtendedSocketOptions.TCP_KEEPINTERVAL), 60)
.option(NioChannelOption.of(ExtendedSocketOptions.TCP_KEEPCOUNT), 8);
//The options below are available only when Epoll transport is used
.option(EpollChannelOption.TCP_KEEPIDLE, 300)
.option(EpollChannelOption.TCP_KEEPINTVL, 60)
.option(EpollChannelOption.TCP_KEEPCNT, 8);
What I dont understand here is what is the difference between NIO and Epoll transport or to be more specific what is transport at all? I'm aware of Transport layer and other layers of the OSI stack, but could not understand in what context is Transport is being used here. Any answer explaining this would be appreciated.