Есть ли способ успешно выполнить вложенные операции потока без фактической блокировки вашего кода? - PullRequest
1 голос
/ 28 марта 2019

Работая с Spring Webflux, я пытаюсь вставить некоторые данные в сервер объектов области, который взаимодействует с приложениями Java через API 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.

Я могу понять, что поток, выполняющий эту функцию, истекаетдо того, как многое из этого станетПожалуйста, помогите мне работать с этим кодом асинхронно, без блокировки.

1 Ответ

0 голосов
/ 28 марта 2019

В первом случае вы вообще не подписываетесь на издателя, поэтому он не выполняется. Вы можете сделать это:

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

Однако обычно лучше позволить платформе позаботиться о подписке, но я не могу посоветовать, не видя остальной код.

...