본문 바로가기
토비의봄

10. Mono & Flux

by 이석준석이 2021. 3. 15.

1. Mono

 

Mono로 감싸놓은것이 어떤의미인가?

  • 아래의 코드는 중, mono 부분은 Subscriber가 subscribe 하는 순간에 실행
@GetMapping("/")
Mono<String> hello() {
    log.info("pos1");
    Mono<String> m = Mono.just("Hello WebFlux").log();
    log.info("pos2");
    return m;
}
더보기
결과 출력

 

pos1

pos2

onSubscribe()

request(unbounded) => backPressure

onNext(Hello WebFlux)

onComplete()


Mono.just() 는 준비된 결과를 필요로 하므로 아래의 순서로 수행

@GetMapping("/")
Mono<String> hello() {
    log.info("pos1");
    Mono<String> m = Mono.just(generateHello()).log();
    log.info("pos2");
    return m;
}

private String generateHello() {
    log.info("method generateHello()");
    return "Hello Webflux";
}
더보기

결과 출력

pos1

method generateHello()

pos2

onSubcribe()

...


Mono.supplier Subscribe 이후에 수행

@GetMapping("/")
Mono<String> hello() {
    log.info("pos1");
    Mono<String> m = Mono.fromSupplier(() -> generateHello()).log();
    log.info("pos2");
    return m;
}

private String generateHello() {
    log.info("method generateHello()");
    return "Hello Webflux";
}
더보기

결과 출력

pos1

pos2

onSubscribe()

request()

method generateHello()


Mono 나 Flux 는 여러개의 Subscriber를 가질 수 있다.

  • Cold Type
    • 데이터가 만들어져서 고정이 돼있는 것
    • 어느 subscriber가 요청을해도 동일하게 Publishing 하는 경우
  • Hot Type
    • 실시간에서 일어나는 외부의 이벤트들

block()

  • 내부에서 subscribe() 를 수행
  • publisher 가 제공하는 결과값을 Mono/Flux 컨테이너에서 제거하고 블로킹됨

2. Flux

 

결과값이 같다.

  • Flux 는 하나하나의 엔티티레벨의 Operator 를 사용할 수 있음
  • HttpStream 을 지원하려면 결과를 리턴할 때 chunk 단위로 데이터를 보내려면 flux가 좋다.
@GetMapping("/event/{id}")
Mono<List<Event>> event(@PathVariable long id) {
    List<Event> list = Arrays.asList(new Event(1L, "event1"), new Event(2L, "event2"));
    return Mono.just(list);
}

@GetMapping("/events")
Flux<Event> events() {
    return Flux.just(new Event(1L, "event1"), new Event(2L, "event2"));
}

 

@GetMapping(value = "/events", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
Flux<Event> events() {
    Flux<Event> es = Flux
            .<Event, Long>generate(() -> 1L, (id, sink) -> {
                sink.next(new Event(id, "value" + id));
                return id + 1;
            });

    Flux<Long> interval = Flux.interval(Duration.ofSeconds(1));

    // 한쌍씩 묶는다.
    return Flux.zip(es, interval)
            .map(tu -> tu.getT1());
}

'토비의봄' 카테고리의 다른 글

9. Webflux  (0) 2021.03.11
8. CompletableFuture  (2) 2021.03.09
7. AsyncTemplate 의 콜백헬, 중복작업 문제  (0) 2021.03.08
6. 비동기 RestTemplate, 비동기 MVC/Servlet  (0) 2021.03.06
5. 자바와 스프링의 비동기 개발기술  (0) 2021.03.05