이 글은 tech.io/playgrounds/929/reactive-programming-with-reactor-3/BlockingToReactive 에 대한 문제풀이이다.
Reactive 코드 속에서 레거시하고, Reactive하지 않은 코드는 어떻게 처리해야할까?
예를들어, JDBC connection과 같은 Blocking 코드가 있고 이를 Reactive pipeline에 통합해한다면 어떻게해야할까?
가장 좋은 방법은, blocking이 진행되는 부분을 Schedulers를 통해 별도의 스레드에서 실행되도록 고립시키는 것이다.
JDBC의 예에서는 fromIterable 팰터리 메서드를 사용할 수 있다.
subscribeOn
이 메서드는 제공된 스케줄러에서 시작부터 시퀀스를 분리해서 실행할수 있도록한다.
이 트릭을 사용한 첫번째 예제를 통해, repository의 모든 사용자를 천천히 읽어보자.
Flux<User> blockingRepositoryToFlux(BlockingRepository<User> repository) {
return Flux.defer(() -> Flux.fromIterable(repository.findAll())).subscribeOn(Schedulers.elastic());
}
defer메서드로 repository함수 호출을 감싸, 지연된 instance를 Flux에 등록할 수 있다.
publishOn
database에 저장하는것과 같은 느린 subscriber에서는, 시퀀스의 좀더 작은 부분에 publishOn을 사용하여 별도로 처리할 수 있다.
Mono<Void> fluxToBlockingRepository(Flux<User> flux, BlockingRepository<User> repository) {
return flux.publishOn(Schedulers.elastic()).doOnNext(repository::save).then();
}
위 함수가 Reactive Streams의 pipeline에서 실행되면, 이 시퀀스만 별도의 스케줄러를 사용하여 실행되게 된다.
참고
tech.io/playgrounds/929/reactive-programming-with-reactor-3/BlockingToReactive
사업자 정보 표시
1 | g | asdf | 사업자 등록번호 : 123-12-12345 | TEL : 010-111-1111 | Mail : asdf@gmail.com | 통신판매신고번호 : 호 | 사이버몰의 이용약관 바로가기
'Reactive Programmingaaa > Reactor 기초 문제풀이~' 카테고리의 다른 글
06 Reactive To Blocking (1) | 2021.03.30 |
---|---|
05 Others operations (0) | 2021.03.30 |
04 Adapt (0) | 2021.03.30 |
03 Request (0) | 2021.03.16 |
02 Merge (0) | 2021.03.16 |
01 Introduction to Reactive Programming (5) | 2021.03.02 |