在使用Spring Webflux时,我尝试在通过Rest API与Java应用程序交互的领域对象服务器中插入一些数据。所以基本上我有一组学生,他们有一套科目,我的目标是以非阻塞的方式坚持这些科目。因此,我使用通过 rest 端点公开的微服务,它为我提供了学生卷号的 Flux,对于该通量,我使用通过 rest 端点公开的另一个微服务,它为我提供了主题的 Flux,对于这些主题中的每一个,我想通过另一个 rest 端点将它们持久保存在领域服务器中。我想让这一切非常无阻塞,这就是为什么我希望我的代码看起来像这样。
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.
我能理解的是,执行此函数的线程在触发大部分函数之前就已过期。请帮助我以异步非阻塞方式处理此代码。
您一开始根本没有订阅发布服务器,这就是它不执行的原因。 您可以这样做:
studentService.getAllRollnumbers().flatMap(rollnumber -> {
return subjectDirectory.getAllSubjects().map(subject -> {
return dbService.addSubject(subject);
})
}).subscribe();
但是,通常最好让框架处理订阅,但是如果没有看到其余的代码,我不能建议。