Причина в том, что WebFluxInboundEndpoint прекращает обработку запросов POST без тела в doHandle()
, строка
.map(body -> new HttpEntity<>(...))
никогда не выполняется, если нет содержимого тела запроса:
private Mono<Void> doHandle(ServerWebExchange exchange) {
return extractRequestBody(exchange)
.doOnSubscribe(s -> this.activeCount.incrementAndGet())
.map(body -> new HttpEntity<>(body, exchange.getRequest().getHeaders()))
.map(entity -> buildMessage(entity, exchange))
.flatMap(requestMessage -> {
if (this.expectReply) {
return sendAndReceiveMessageReactive(requestMessage)
.flatMap(replyMessage -> populateResponse(exchange, replyMessage));
}
else {
send(requestMessage);
return setStatusCode(exchange);
}
})
.doOnTerminate(this.activeCount::decrementAndGet);
}
Обходной путь: вызывающий должен отправить любое непустое тело запроса, чтобы оно заработало, например, достаточно одной кавычки, переданной с -d:
curl -d ' http://localhost:8080/message/4
При таком запросе мой журнал содержит ожидаемый входящий GenericMessage, и ресурс / events начинает генерировать SSE.
2018-05-05 17:25:24.777 TRACE 40436 --- [ctor-http-nio-8] o.s.w.r.r.method.InvocableHandlerMethod : Method [org.springframework.integration.webflux.inbound.WebFluxInboundEndpoint.handle] returned [MonoDefer]
2018-05-05 17:25:24.777 DEBUG 40436 --- [ctor-http-nio-8] o.s.w.r.r.method.InvocableHandlerMethod : Response fully handled in controller method
2018-05-05 17:25:24.778 INFO 40436 --- [ctor-http-nio-8] o.s.integration.handler.LoggingHandler : GenericMessage [payload=4, headers={http_requestMethod=POST, Accept=*/*, User-Agent=curl/7.49.1, http_requestUrl=http://localhost:8080/message/4, Host=localhost:8080, id=9a09294d-280a-af3b-0894-23597cf1cb5f, Content-Length=1, contentType=application/x-www-form-urlencoded, timestamp=1525533924778}]