1. 개요
프로젝트 리액터 소개에서 T 유형 인스턴스의 게시자인 Mono<T> 에 대해 배웠습니다 .
이 빠른 사용방법(예제)에서는 Mono : block 및 subscribe 에서 T 를 추출하는 차단 및 비차단 방법을 모두 보여줍니다 .
2.차단 방법
일반적으로 Mono 는 특정 시점에서 요소를 방출하여 성공적으로 완료됩니다.
예제 게시자 Mono<String> 부터 시작하겠습니다 .
Mono<String> blockingHelloWorld() {
return Mono.just("Hello world!");
}
String result = blockingHelloWorld().block();
assertEquals("Hello world!", result);
여기에서는 게시자가 값을 내보내지 않는 한 실행을 차단합니다. 그러나 완료하는 데 시간이 오래 걸릴 수 있습니다.
더 많은 제어를 위해 명시적인 기간을 설정합니다.
String result = blockingHelloWorld().block(Duration.of(1000, ChronoUnit.MILLIS));
assertEquals(expected, result);
게시자가 설정된 기간 내에 값을 내보내지 않으면 RuntimeException 이 발생합니다.
또한 Mono 는 비어 있을 수 있으며 위의 block() 메서드는 null 을 반환 합니다. 이 경우 선택적 블록 을 사용할 수 있습니다 .
Optional<String> result = Mono.<String>empty().blockOptional();
assertEquals(Optional.empty(), result);
일반적으로 블로킹은 리액티브 프로그래밍의 원칙에 위배됩니다. 반응형 애플리케이션에서 실행을 차단하는 것은 매우 권장되지 않습니다.
이제 비 차단 방식으로 값을 얻는 방법을 살펴 보겠습니다.
3. 논블로킹 방식
먼저 subscribe() 메소드를 사용하여 non-blocking 방식으로 구독해야 합니다. 또한 최종 값의 소비자를 지정합니다.
blockingHelloWorld()
.subscribe(result -> assertEquals(expected, result));
여기서는 값을 생성하는 데 다소 시간이 걸리더라도 subscribe() 호출 을 차단하지 않고 즉시 실행을 계속합니다 .
경우에 따라 중간 단계에서 값을 사용하려고 할 수 있습니다. 따라서 연산자를 사용하여 동작을 추가할 수 있습니다.
blockingHelloWorld()
.doOnNext(result -> assertEquals(expected, result))
.subscribe();
4. 결론
이 짧은 기사에서는 Mono<String> 에서 생성된 값을 소비하는 두 가지 방법을 살펴보았습니다 .
항상 그렇듯이 코드 예제는 GitHub 에서 찾을 수 있습니다 .