Java 有没有一种方法可以在不阻塞代码的情况下成功执行嵌套的通量操作?

Java 有没有一种方法可以在不阻塞代码的情况下成功执行嵌套的通量操作?,java,realm,spring-webflux,realm-object-server,Java,Realm,Spring Webflux,Realm Object Server,在使用SpringWebFlux时,我试图在RealmObject服务器中插入一些数据,该服务器通过RESTAPI与Java应用程序交互。所以基本上我有一组学生,他们有一组科目,我的目标是以非阻塞的方式坚持这些科目。因此,我使用一个通过rest端点公开的微服务,该端点为我提供了学生人数的流量,对于该流量,我使用另一个通过rest端点公开的微服务,该端点为我提供了主题的流量,对于这些主题中的每一个,我希望通过另一个rest端点将它们持久化到域服务器中。我想让这一切都非常非阻塞,这就是为什么我希望我

在使用SpringWebFlux时,我试图在RealmObject服务器中插入一些数据,该服务器通过RESTAPI与Java应用程序交互。所以基本上我有一组学生,他们有一组科目,我的目标是以非阻塞的方式坚持这些科目。因此,我使用一个通过rest端点公开的微服务,该端点为我提供了学生人数的流量,对于该流量,我使用另一个通过rest端点公开的微服务,该端点为我提供了主题的流量,对于这些主题中的每一个,我希望通过另一个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());
}
}

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

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());
}


我能理解的是,执行这个函数的线程在大部分被触发之前就已经过期了。请帮助我以异步非阻塞方式处理此代码。

您首先根本没有订阅发布服务器,这就是它没有执行的原因。您可以这样做:

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

但是,通常最好让框架负责订阅,但不查看我无法建议的其余代码。

您一开始根本没有订阅发布服务器,这就是它没有执行的原因。您可以这样做:

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

但是,通常最好让框架负责订阅,但不查看我无法建议的其余代码。

这恰好是一个计划的过程,因此这里发生的一切是,此函数是已启用计划的配置类的一部分。没有其他代码!这恰好是一个已调度的进程,因此这里发生的一切是,此函数是已启用调度的配置类的一部分。没有其他代码!