【问题标题】:How to combine Mono and Flux as parameters to create new Mono?如何结合 Mono 和 Flux 作为参数来创建新的 Mono?
【发布时间】:2020-01-02 15:37:11
【问题描述】:

我的 REST 控制器方法应该返回 Mono,它必须由 2 个并行请求构建到另一个 Web 服务并处理它们的响应,其中一个请求返回 Mono,另一个请求返回 Flux

如何将 Mono 和 Flux 的响应结合起来处理?

型号:

@Document
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ClassModel {

    @Id
    private String id;
    private String roomNr;
    private String className;
    private String teacherId;
    private List<String> studentIds;

    public void addStudentId(String studentId) {
        studentIds.add(studentId);
    }

}

控制器:

public Mono<ClassModel> addRandomClassFull() {
    return Mono.zip(
        //request teacher microservice and return Mono - single teacher
        reactiveNetClient.addRandomTeacher(),
        //request students microservice and return Flux - list of students
        reactiveNetClient.addRandomStudents(10),
        (teacher, students) -> {
            ClassModel classModel = new ClassModel();
            classModel.setRoomNr("24B");
            classModel.setClassName(faker.educator().course());
            classModel.setTeacherId(teacher.getId());
            students.forEach(student -> classModel.addStudentId(student.getId());
            return classModel;
        }).flatMap(classRepository::save);
}

显然,控制器是错误的:
1) Mono.zip() 需要 2 个或更多 Mono,我有 Mono 和 Flux - 如何组合它们?
2) 也不确定:
students.forEach(student -&gt; classModel.addStudentId(student.getId());
是正确的方法吗?

有什么建议吗?

【问题讨论】:

    标签: mono flux project-reactor


    【解决方案1】:
    1. 您可以将方法addRandomStudents() 更改为返回Mono&lt;List&lt;Student&gt;&gt;
    2. 您可以在Flux&lt;Student&gt; 上使用collectList(),它会返回然后Mono&lt;List&lt;Student&gt;&gt;,然后在addStudents() 中会将Student 对象转换为id。

      public Mono<ClassModel> addRandomClassFull() {
          return Mono.zip(
              reactiveNetClient.addRandomTeacher(),
              reactiveNetClient.addRandomStudents(10).collectList(),
              (teacher, students) -> {
                   ClassModel classModel = new ClassModel();
                   classModel.setRoomNr("24B");
                   classModel.setClassName(faker.educator().course());
                   classModel.setTeacherId(teacher.getId());
                   classModel.addStudents(students);
              return classModel;
          }).flatMap(classRepository::save);
      }
      

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-02
      • 2019-01-07
      • 1970-01-01
      • 2021-09-30
      • 1970-01-01
      • 2020-05-04
      • 1970-01-01
      • 2019-09-21
      相关资源
      最近更新 更多