마블 다이어그램은 비동기적인 데이터 흐름을 시간의 흐름에 따라 시각적으로 표시한 다이어그램 입니다.
Mono 퍼블리셔를 이용하여 데이터를 emit 하는 과정이며, X 표시를 통하여 onError 시그널을 emit 했다는 사실을 알 수 있습니다.
public class Example6_2 {
public static void main(String[] args) {
Mono
.empty()
.subscribe(
none -> System.out.println("# emitted onNext signal"), // Publisher 가 onNext signal 을 전송하면 실행됨, 구독자가 퍼블리셔로부터 데이터를 전달받을 때 사용
error -> {}, //Error 을 전달받기 위해 사용
() -> System.out.println("# emitted onComplete signal") // data emit 이 정상적으로 끝나 후처리를 하고 싶을 때
);
}
}
public class Example6_3 {
public static void main(String[] args) {
URI worldTimeUri = UriComponentsBuilder.newInstance().scheme("http")
.host("worldtimeapi.org")
.port(80)
.path("/api/timezone/Asia/Seoul")
.build()
.encode()
.toUri();
RestTemplate restTemplate = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));
Mono.just(
restTemplate
.exchange(worldTimeUri,
HttpMethod.GET,
new HttpEntity<String>(headers),
String.class)
)
.map(response -> {
DocumentContext jsonContext = JsonPath.parse(response.getBody());
String dateTime = jsonContext.read("$.datetime");
return dateTime;
})
.subscribe(
data -> System.out.println("# emitted data: " + data),
error -> {
System.out.println(error);
},
() -> System.out.println("# emitted onComplete signal")
);
}
}
Flux 의 마블 다이어그램을 보면 Mono 와 달리 타임라인 구슬의 개수가 여러개입니다. 이전 챕터에서 설명한 대로 Flux 퍼블리셔는 여러개의 데이터를 emit 할 수 있습니다.
public class Example6_4 {
public static void main(String[] args) {
Flux.just(6, 9, 13)
.map(num -> num % 2)
.subscribe(System.out::println);
}
}
public class Example6_5 {
public static void main(String[] args) {
Flux.fromArray(new Integer[]{3, 6, 7, 9})
.filter(num -> num > 6)
.map(num -> num * 2)
.subscribe(System.out::println);
}
}
public class Example6_6 {
public static void main(String[] args) {
Flux<String> flux =
Mono.justOrEmpty("Steve")
.concatWith(Mono.justOrEmpty("Jobs"));
flux.subscribe(System.out::println);
}
}
위 코드를 마블 다이어그램으로 나타내면 아래와 같습니다.