在使用Spring Webflux时,我正在尝试在领域对象服务器中插入一些数据,该服务器通过Rest API与Java应用程序进行交互。因此,基本上,我有一组学生,他们都有一组科目,而我的目标是以无阻碍的方式坚持这些科目。因此,我使用了通过休息端点公开的微服务,该服务向我提供了学生分数的通量,对于该通量,我使用了通过休息端点公开的另一种微服务,该服务使我获得了科目通量,对于每个科目,我想通过另一个剩余端点将它们持久化在领域服务器中。我想使这一切变得非常无阻塞,这就是为什么我希望我的代码看起来像这样。
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.
我能理解的是,执行此功能的线程在其大部分被触发之前已经过期。请帮助我以异步非阻塞方式工作此代码。
答案 0 :(得分:0)
在第一个实例中,您根本没有订阅发布者,这就是为什么它不执行。您可以这样做:
studentService.getAllRollnumbers().flatMap(rollnumber -> {
return subjectDirectory.getAllSubjects().map(subject -> {
return dbService.addSubject(subject);
})
}).subscribe();
但是,通常最好让框架来处理订阅,但最好不要看剩下的代码,我不建议这样做。