Как использовать `Mono.subscriberContext ()` в функции `.reduce (...)` - PullRequest
1 голос
/ 21 июня 2019

У меня есть поток объектов, и я пытаюсь уменьшить его, пока есть данные, сохраненные в контексте полученных Monos, которые мне нужно использовать в функции сокращения.

//I've reduced it successfully But I don't have the Context Data :( 
return Flux.merge(someClient.getSomeDTO(request.getId()),
                  anotherClient.getAnotherDTO(request.getId())
                )
                .onErrorMap(e -> new ResponseStatusException(
                        HttpStatus.BAD_REQUEST,
                        "An error occurred!", e))
                .reduce(OutboundDTO.builder(),
                        (builder, dto) -> 
                                pageAdapter.buildOutboundDTO(builder, dto, null/*Empty*/)
                )
                .flatMap(builder -> ServerResponse.ok()
             .body(BodyInserters.fromObject(builder.build())));
/*This Doesn't Work It gave compilation error 
and it works well with .map(...) but this means I can't reduce it! */
return Flux.merge(someClient.getSomeDTO(request.getId()),
                  anotherClient.getAnotherDTO(request.getId())
                )
                .onErrorMap(e -> new ResponseStatusException(
                        HttpStatus.BAD_REQUEST,
                        "An error occurred!", e))
                .reduce(OutboundDTO.builder(),
                        (builder, dto) -> Mono.subscriberContext().flatMap(ctx->
                                pageAdapter.buildOutboundDTO(builder, dto, ctx.get(SavedObject.class))
                        )
                )
                .flatMap(builder -> ServerResponse.ok()
             .body(BodyInserters.fromObject(builder.build())));

Я ожидаю, что основная цель Mono.subscriberContext() состоит в том, чтобы делиться между всеми цепочками внизу, а не только в некоторых методах, таких как map, как упомянуто в их справочном руководстве , поэтому вопрос в том, возможно ли это сделать в функции .reduce или есть альтернатива, или, если это невозможно, было бы интересно узнать, почему? :)

...