오늘의 주제
Mono then() 메서드가 어떻게 동작하는지 흐름 파악하기.
배경
Java Reactive Programing 으로 채팅서버 구현중.
then()의 역할에 대해 의구심이 들었다.
A.then(B) 인 경우에 A의 값이 반환된 후 B가 실행된다고 생각하고 있었는데
A가 끝나기전 B가 실행되고 실행이 끝나버리는 경우가 발생.
목표
- sleep 동작하는 메서드 생성하기
- A.then(B) 에서 sleep을 걸고 A,B가 어떻게 실행되는지 확인하기
실행하기
Mono<Void>로 리턴하는 메서드를 두개를 then으로 연결해서 실행
@Test void mono_then_test() { first_sequence().then(second_sequence()).subscribe(); } Mono<Void> first_sequence() { System.out.println("------------first_sequence------------"); return Mono.create(sink -> { for (int i = 0; i < 10; i++) { System.out.println("first_sequence: " + i); if (i == 5) sink.success(); } }); } Mono<Void> second_sequence() { System.out.println("------------second_sequence------------"); return Mono.create(sink -> { System.out.println("------second_sequence mono start------"); sleep_mono().block(); sink.success(); System.out.println("------second_sequence mono end------"); }); } Mono<Long> sleep_mono() { System.out.println("sleep_mono"); return Mono.delay(Duration.ofSeconds(10L)); }
결과
------------first_sequence------------ ------------second_sequence------------ first_sequence: 0 first_sequence: 1 first_sequence: 2 first_sequence: 3 first_sequence: 4 first_sequence: 5 ------second_sequence mono start------ sleep_mono ------second_sequence mono end------ first_sequence: 6 first_sequence: 7 first_sequence: 8 first_sequence: 9
결론
A.then(B)의 경우,
A실행 후 B가 바로 실행된다.
Mono에 감싸져 있는 경우에만 A 메서드의 success signal이 오면 B메서드를 실행한다.
sink.sucess() 가 호출되지않으면 B메서드의 mono는 실행되지않는다.
mono delay가 원하는대로 sleep기능을 동작하게 하려면 block()을 걸어야 한다.
'Back > Java' 카테고리의 다른 글
[JAVA/멀티스레드] JAVA멀티스레딩 - 운영체제기초2 (컨텍스트 스위치) (0) | 2023.03.22 |
---|---|
[JAVA/멀티스레드] JAVA멀티스레딩 - 개요와 운영체제기초 (0) | 2023.03.22 |
[Spring/WebSocket] 초초초기본편 웹소켓 통신해보기 (1) (0) | 2022.09.18 |
[Spring/WebSocket] RSocket 예제코드 실행해보기(WIP) (1) | 2022.09.15 |
[Java/SpringBoot] 멀티 스레드 & static 테스트 (0) | 2022.01.02 |