当前位置: 首页 > 知识库问答 >
问题:

如何组合单声道和流量作为参数来创建新的单声道?

甄德寿
2023-03-14

我的REST控制器方法应该返回Mono,它必须由两个并行请求构建到另一个web服务,并处理它们的响应,其中一个请求返回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->classmodel.addstudentid(student.getid());
是否正确?

有什么建议吗?

共有1个答案

蒋星雨
2023-03-14

>

  • 您可以将方法addrandomstudents()更改为返回mono
  • 您可以在flux 上使用collectlist(),它将返回mono ,然后在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);
    }
    

  •  类似资料:
    • 我的代码如下。我需要从mongo db获得每次旅行的车费,然后将每次旅行的所有车费相加,得到总车费。我被一种我不知道如何阅读的单声道音乐所困扰。我试着把它转换成通量,但我得到了通量 "'

    • 我有一个方法,可以尝试使用WebClient返回Mono 它可以返回我期望的结果。然后我尝试创建另一个方法来支持列表作为参数 但这一次返回一个奇怪的结果。 我是反应式编程新手,将流和单声道结合起来,然后转换为流量的正确方法是什么?

    • 想象一下,我有一个CourseID对象列表(CourseID,Name)。让我们把这个列表称为'CourseNameList'。 当某人将请求发送到“ 然而,在发送结果之前,我还需要追加每个课程的价格。价格将从另一个微服务中检索,并返回Mono对象。 因此,用户将看到带有(ID、名称、价格)的课程列表。价格来源于其他服务。 控制器方法可能如下所示 我尝试了多种方法来返回Flux。但是,我不知道怎么

    • 我有一个例子,我想使用通量。生成,因为我不想进行昂贵的阻塞呼叫,除非/直到用户提出要求。具体来说,我多次调用Elasticsearch(有效地进行分页),直到没有更多点击。我在迭代器中使用标准的阻塞调用实现了这一点 下面是前面使用阻塞的代码: 上面的工作原理很好,因为它等待对ES进行下一次调用,直到(该)订阅者准备好接收下一个数据块。 在下面,我尝试使用Spring的,但问题是在订阅者处理第一个之

    • 给定以下monos: 双: 和: 具有相同的输出: 和之间有什么区别,在这种情况下? 从https://projectreactor.io/docs/core/release/reference/index.html#which-operator: [如果你]有一个序列,但[你]对值不感兴趣,并且[你]想在最后切换到另一个单声道,[使用]。 [如果您]希望通过将发布者从1个Mono和任何源端协调到

    • 我有一个类,它从通量源填充地图。我希望能够动态地更新thedata(),但我希望能够返回解析为当前或挂起数据的Mono。 基本上如果数据!=null和no in progress flux,返回Mono。仅返回(数据),否则返回最终将发出数据的单声道。 编辑:这是目前为止我能做的最好的了 但是仍然存在一个问题,在第一次完成updateTheData()之前,