Я как бы новичок в реактивном программировании и в настоящее время работаю над приложением на основе Spring webflux. Я застрял между несколькими вопросами.
public class FooServiceImpl {
@Autowired
private FooDao fooDao;
@Autowired
private AService aService;
@Autowired
private BService bService;
public long calculateSomething(long fooId) {
Foo foo = fooDao.findById(fooId); // Blocking call one
if (foo == null) {
foo = new Foo();
}
Long bCount = bService.getCountBByFooId(fooId); // Blocking call two
AEntity aEntity = aService.getAByFooId(fooId); // Blocking call three
// Do some calculation using foo, bCount and aEntity
// ...
// ...
return someResult;
}
}
Таким образом мы пишем блокирующий код, который использует три результата вызова внешнего API (рассмотрим как вызовы БД). Я изо всех сил пытаюсь преобразовать это в реактивный код. Если все три станут моно, и если я подпишусь на все три, будет ли внешний подписчик заблокирован?
public Mono<Long> calculateSomething(long fooId) {
return Mono.create(sink -> {
Mono<Foo> monoFoo = fooDao.findById(fooId); // Reactive call one
monoFoo.subscribe(foo -> {
if (foo == null) {
foo = new Foo();
}
Mono<Long> monoCount = bService.getCountBByFooId(fooId); // Reactive call two
monoCount.subscribe(aLong -> {
Mono<AEntity> monoA = aService.getAByFooId(fooId); // Reactive call three
monoA.subscribe(aEntity -> {
//...
//...
sink.success(someResult);
});
});
});
};
}
Я видел, что есть функция под названием zip, но она работает только с двумя результатами. Есть ли способ применить ее здесь?
Также что произойдет, если мы подпишемся на что-то внутри метода create. Будет ли он блокировать поток?
Был бы очень благодарен, если бы вы мне помогли.
subscribe
, который вы делаете, блокирует, поэтому никогда не подписывайтесь (почти, есть некоторые крайние случаи) - person Toerktumlare   schedule 10.03.2020