有没有一种方法可以成功执行嵌套的助焊剂操作而又不会实际阻塞您的代码?

时间:2019-03-28 08:46:59

标签: java realm spring-webflux realm-object-server

在使用Spring Webflux时,我正在尝试在领域对象服务器中插入一些数据,该服务器通过Rest API与Jav​​a应用程序进行交互。因此,基本上,我有一组学生,他们都有一组科目,而我的目标是以无阻碍的方式坚持这些科目。因此,我使用了通过休息端点公开的微服务,该服务向我提供了学生分数的通量,对于该通量,我使用了通过休息端点公开的另一种微服务,该服务使我获得了科目通量,对于每个科目,我想通过另一个剩余端点将它们持久化在领域服务器中。我想使这一切变得非常无阻塞,这就是为什么我希望我的代码看起来像这样。

void foo() {
studentService.getAllRollnumbers().flatMap(rollnumber -> {
    return subjectDirectory.getAllSubjects().map(subject -> {
        return dbService.addSubject(subject);
    })
});

}

但是由于某些原因,这不起作用。但是,一旦我在这些东西上调用了块,它们就会就位,像这样。

Flux<Done> foo() {
    List<Integer> rollNumbers = studentService.getAllRollnumbers().collectList().block();

    rollNumbers.forEach(rollNumber -> {
        List<Subject> subjects = subjectDirectory.getAllSubjects().collectList().block();

    subjects.forEach(subject -> {dbService.addSubject(subject).block();});
    });

    return Flux.just(new NotUsed());
}

getAllRollnumbers() returns a flux of integers.
getAllSubjects() returns a flux of subject.
and addSubject() returns a Mono of DBResponse pojo.

我能理解的是,执行此功能的线程在其大部分被触发之前已经过期。请帮助我以异步非阻塞方式工作此代码。

1 个答案:

答案 0 :(得分:0)

在第一个实例中,您根本没有订阅发布者,这就是为什么它不执行。您可以这样做:

studentService.getAllRollnumbers().flatMap(rollnumber -> {
    return subjectDirectory.getAllSubjects().map(subject -> {
        return dbService.addSubject(subject);
    })
}).subscribe();

但是,通常最好让框架来处理订阅,但最好不要看剩下的代码,我不建议这样做。