Можно ли получить ответ Jax-rs REST API (нереактивный) от netty HttpClient (реактивный)? - PullRequest
0 голосов
/ 24 мая 2019

Я несколько дней бился головой, выясняя проблему, и, наконец, решил обратиться к экспертам.У меня есть REST API (RESTEasy) для потоковой передачи json через StreamingOutput, а принимающий клиент написан с использованием Spring-boot Webflux.По какой-то причине потоковая передача не работает должным образом на стороне клиента.Блокирует, пока не будет загружен весь ответ для обработки.

Когда я использовал curl для получения ответа, он работает как положено, так же как и с помощью HttpClient of netty, но, похоже, не работает с WebClient (spring-webflux).

Server

return Response.status(Response.Status.OK)
                .entity(new JSONStreaming() { //implements javax.ws.rs.core.StreamingOutput;
                    @Override
                    public void streamOutput(OutputStream output) {
                        //passing output down the layers
                    }
                }).build();

Клиент

Метод 1: работает должным образом.

HttpClient.create().get()
                .uri(SERVICE_URL_TO_REST_API)
                .responseContent()
                .subscribe(byteBuf -> {
                    byte[] data = new byte[byteBuf.readableBytes()];
                    System.out.println(new String(data));
                });

Метод 2: Это тоже работает .. (не скручиваем)) curl -i URL

Заголовки:

Content-Type: application/json
Transfer-Encoding: chunked

Код клиента, который не работает:

WebClient.get()
         .uri(SERVICE_URL_TO_REST_API)
         .accept(MediaType.APPLICATION_JSON)
         .retrieve()
         .bodyToFlux(DataBuffer.class)
         .subscribe(byteBuf -> {
                         byte[] data = new byte[byteBuf.readableByteCount()];
                         byteBuf.read(data);
                         System.out.println(new String(data));
                });

Ожидает весьи затем записывает все данные целиком, а не сразу после получения.

...