【问题标题】:How to save object to reactive repository inside flux如何将对象保存到通量内的反应性存储库
【发布时间】:2018-07-08 20:24:30
【问题描述】:

我有问题的答案列表。我想保存这些答案,然后(在 mongo 给他们一个 id 之后)将它们添加到他们的问题中。

现在我是这样做的:

public Flux<Answer> createAnswers(List<Answer> answers) {
    return answerRepository.saveAll(answers)
            .map(answer -> {
                questionRepository.findById(answer.getQuestionId())
                        .subscribe(question -> {
                            question.getAnswers().removeIf(ans -> Objects.equals(ans.getId(), answer.getId()));
                            question.getAnswers().add(answer);
                            questionRepository.save(question).block();
                        });
                return answer;
            });
}

我也尝试过使用..saveAll(answers).doOnNext()doOnEach(),但这种方式不会保存问题。

似乎 map 用于转换数据,但不用于对每个元素进行操作。另外,我对拨打block() 有点困惑。

有没有更好的方法来实现我的目标?

【问题讨论】:

    标签: java-8 spring-webflux project-reactor


    【解决方案1】:

    您不应该在返回反应类型本身的方法中调用FluxMono 上的subscribe/block

    这样做会使当前管道与您想要实现的目标脱钩。最好的情况下,这将打破背压支持。在许多情况下,这也可能以令人惊讶的方式中断。例如,如果您的方法正在处理 HTTP 请求/响应或某种类型的会话,则响应/会话可能会在您的其他订阅者仍在尝试对其执行某些操作时关闭。

    我相信这样的事情更加一致(尽管我在这里遗漏了很多上下文,所以它可能不是实现这一目标的最佳方式):

    public Flux<Answer> createAnswers(List<Answer> answers) {
            return answerRepository.saveAll(answers)
                    .flatMap(answer -> {
                        return questionRepository
                                .findById(answer.getQuestionId())
                                .flatMap(question -> {
                                    question.getAnswers().removeIf(ans -> Objects.equals(ans.getId(), answer.getId()));
                                    question.getAnswers().add(answer);
                                    return questionRepository.save(question);
                                })
                                .thenReturn(answer);
                    });
        }
    

    【讨论】:

      猜你喜欢
      • 2019-09-25
      • 2020-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-03
      • 2015-03-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多