subscriber가 publisher로 부터 받을 데이터의 개수를 조절, request 함수의 인자로 전달된 값 만큼 publisher에 요청하고 publisher는 요청 개수 만큼 subscriber에게 데이터 전달(단 publisher가 가진 데이터의 수가 요청 수가 보다 적으면 가진 데이터만 전달)
이벤트가 발생한 로그 출력
package io.pivotal.literx;
//generic imports to help with simpler IDEs (ie tech.io)
import java.util.*;
import java.util.function.*;
import java.time.*;
import io.pivotal.literx.domain.User;
import io.pivotal.literx.repository.ReactiveRepository;
import io.pivotal.literx.repository.ReactiveUserRepository;
import reactor.core.publisher.Flux;
import reactor.test.StepVerifier;
/**
* Learn how to control the demand.
*
* @author Sebastien Deleuze
*/
public class Part06Request {
ReactiveRepository<User> repository = new ReactiveUserRepository();
//========================================================================================
// TODO Create a StepVerifier that initially requests all values and expect 4 values to be received
StepVerifier requestAllExpectFour(Flux<User> flux) {
return StepVerifier.create(flux)
.expectNextCount(4)
.expectComplete();
}
//========================================================================================
// TODO Create a StepVerifier that initially requests 1 value and expects User.SKYLER then requests another value and expects User.JESSE then stops verifying by cancelling the source
StepVerifier requestOneExpectSkylerThenRequestOneExpectJesse(Flux<User> flux) {
return StepVerifier.create(flux)
.expectNext(User.SKYLER)
.thenRequest(1)
.expectNext(User.JESSE)
.thenCancel();
}
//========================================================================================
// TODO Return a Flux with all users stored in the repository that prints automatically logs for all Reactive Streams signals
Flux<User> fluxWithLog() {
return repository.findAll().log();
}
//========================================================================================
// TODO Return a Flux with all users stored in the repository that prints "Starring:" at first, "firstname lastname" for all values and "The end!" on complete
Flux<User> fluxWithDoOnPrintln() {
return repository.findAll()
.doOnSubscribe(sub -> System.out.println("Starring:"))
.doOnNext(user -> System.out.println(user.getFirstname() + " " + user.getLastname()))
.doOnComplete(() -> System.out.println("The end!"));
}
}