Every request is handled the same way.
When returning Mono.empty() from an @RestController the following occurs:
When Chrome is used to make the GET requests the first request is handled on reactor-http-nio-2 thread and seems to be handled correct.
When making a second request (using F5) after that (using keep-alive) the request is handled on the same reactor-http-nio-2 thread, however this request never completes according to chrome and keeps in the "pending" state forever.
When making another request (using F5) after that, the request is handled by reactor-http-nio-1 thread and seems to be handled correct.
When making another request (using F5) after that, the request is handled by the same reactor-http-nio-1 thread and again never completes.
The behavior is repeatable, failing exactly 50% of requests (the second request on the same reactor thread).
tested using Windows 10 / Chrome 70.0.3538.102
Note that the TRACE logging actually shows the same logging for both the properly handled and the failing requests as if completed succesfully.
Furthermore all requests that seem to be handled by the same tcp/ip connection and reactor-thread also use the same log prefix for which I'll make a separate ticket.
#21753 addressed a similar issue but for a client-side POST with an empty body. At the same time that solution does not work for the case here. For some reason, on an HTTP GET, writing byte to the Reactor Netty server response with "content-length" set to 0, never emits a completion signal. There may be a Reactor Netty issue. Violeta Georgieva, smaldini, let me know if you think that deserves a Reactor Netty issue to be opened?
That said, using response.setComplete() in case of empty content is cleaner than writing byte, so I'll switch to that.