예를 들어 HotDeploy
는 서버를 재시작하지 않고 응용 프로그램의 변경 사항을 적용할 수 있는 기능
간단 요약하자면 Cold는 무언가를 새로 시작하고, Hot은 무언가를 새로 시작하지 않는 것
public class Example7_2 {
public static void main(String[] args) throws InterruptedException {
String[] singers = {"Singer A", "Singer B", "Singer C", "Singer D", "Singer E"};
log.info("# Begin concert:");
Flux<String> concertFlux =
Flux
.fromArray(singers) //원본 flux
.delayElements(Duration.ofSeconds(1))
.share();
concertFlux.subscribe(
singer -> log.info("# Subscriber1 is watching {}'s song", singer)
);
Thread.sleep(2500);
concertFlux.subscribe(
singer -> log.info("# Subscriber2 is watching {}'s song", singer)
);
Thread.sleep(3000);
}
}
share
: 원본 flux를 여러 subscriber가 공유public class Example7_4 {
public static void main(String[] args) throws InterruptedException {
URI worldTimeUri = UriComponentsBuilder.newInstance().scheme("http")
.host("worldtimeapi.org")
.port(80)
.path("/api/timezone/Asia/Seoul")
.build()
.encode()
.toUri();
Mono<String> mono = getWorldTime(worldTimeUri).cache(); //cache 이용
mono.subscribe(dateTime -> log.info("# dateTime 1: {}", dateTime));
Thread.sleep(2000);
mono.subscribe(dateTime -> log.info("# dateTime 2: {}", dateTime));
Thread.sleep(2000);
}
private static Mono<String> getWorldTime(URI worldTimeUri) {
return WebClient.create()
.get()
.uri(worldTimeUri)
.retrieve()
.bodyToMono(String.class)
.map(response -> {
DocumentContext jsonContext = JsonPath.parse(response);
String dateTime = jsonContext.read("$.datetime");
return dateTime;
});
}
}
cache()
: operator로 cold sequence 를 hot sequence로 동작하게 해줌, 결과적으로 캐시된 데이터 전달하게 된다.대표적인 예로는 REST API 인증을 위해 인증 토큰을 발급하는 경우가 있다. cache 를 이용해 매번 새로운 토큰을 발급받지 않고 캐시된 인증 토큰을 사용하면 효율적인 동작 과정을 구성할 수 있다.