Flux와 Mono를 데이터 소스로 사용하는데, 데이터를 생성하는 방법에는 여러 가지가 있는데, 이 글에서는 일반적으로 사용되는 방법을 나열하고 간략하게 설명합니다. 불충분한 위치는 보기 위해 소스 문서로 이동할 수 있습니다.
빈 데이터 소스 또는 특수 데이터 소스
비어 있는
empty 메서드를 사용하면 빈 데이터 스트림을 만들 수 있습니다.
Flux.empty();
Mono.empty();
오류
오류 방법을 사용하면 잘못된 데이터 스트림이 생성될 수 있습니다.
Flux.error(new RuntimeException("error"));
Mono.error(new RuntimeException("error"));
절대
never 메서드를 사용하면 신호를 내보내지 않는 데이터 스트림을 만들 수 있습니다.
Flux.never();
Mono.never();
간단한 데이터 소스
단지
just 메서드를 사용하면 고정 요소를 포함하는 데이터 스트림을 만들 수 있습니다.
Flux.just("foo", "bar", "foobar");
Mono.just("foo");
범위
범위 방법을 사용하면 지정된 정수 범위를 포함하는 데이터 스트림을 만들 수 있습니다.
FLux<Integer> flux = Flux.range(1, 10);
fromArray
fromArray 메서드를 통해 배열 요소를 포함하는 데이터 스트림을 만들 수 있습니다.
Flux.fromArray(new Integer[]{
1, 2, 3});
Iterable에서
fromIterable 메소드를 통해 Iterable 요소를 포함하는 데이터 스트림을 생성할 수 있습니다.
Flux.fromIterable(Arrays.asList("foo", "bar", "foobar"));
스트림에서
fromStream 메서드를 통해 Stream 요소를 포함하는 데이터 스트림을 생성할 수 있습니다.
Flux.fromStream(Stream.of("foo", "bar", "foobar"));
미래에서
fromFuture 메소드를 통해 CompletableFuture 요소를 포함하는 데이터 스트림을 생성할 수 있습니다.
Mono.fromFuture(CompletableFuture.completedFuture("foo"));
fromRunnable
fromRunnable 메소드를 통해 Runnable 요소를 포함하는 데이터 스트림을 생성할 수 있습니다.
Mono.fromRunnable(() -> System.out.println("foo"));
간격은 데이터를 보낼 간격 시간을 생성합니다.
간격
간격 방법을 사용하면 일정한 간격으로 요소를 보내는 데이터 스트림을 만들 수 있습니다.
Flux.interval(Duration.ofSeconds(1));
간격밀리
intervalMillis 메서드를 사용하면 일정한 간격으로 요소를 보내는 데이터 스트림을 만들 수 있습니다.
Flux.intervalMillis(1000);
고급 방법 생성 및 생성
생성하다
생성 메소드를 통해 데이터 스트림 생성을 사용자 정의할 수 있습니다. generate 메소드는 요소를 한 번에 하나씩 동기식으로 생성합니다. 이는 요소가 소비되면 다음 요소가 생성됨을 의미합니다. 싱크는 요소를 생성하는 next() 메서드를 제공하는 SynchronousSink입니다.
generate에는 여러 오버로드된 메서드가 있습니다.
Flux.generate(generator);
Flux.generate(stateSupplier,generator);
/**
* @param stateSupplier 一个无参函数,返回一个初始状态
* @param generator 一个BiFunction,接受状态和SynchronousSink,返回新的状态
* @param stateConsumer 一个Consumer,接受状态,用于清理资源
*/
Flux.generate(stateSupplier,generator,stateConsumer)
구체적인 데모는 다음과 같습니다.
Flux.generate(sink->{
sink.next("Hello");
sink.complete();
});
Flux.generate(()->0,(state,sink)->{
sink.next("3 x "+state+" = "+3*state);
if(state==10)sink.complete();
return state+1;
});
만들다
create 메서드를 통해 데이터 스트림 생성을 사용자 지정할 수 있습니다. create 메소드는 generate 메소드보다 고급이며 동기식으로 한 번에 하나의 요소를 생성하거나 비동기식으로 한 번에 여러 요소를 생성할 수 있습니다. 이 방법은 다음, 오류 및
완료 방법도 제공하는 FluxSink를 사용합니다. 생성과 달리 생성에는 상태 값이 필요하지 않지만 콜백에서 여러 이벤트를 실행할 수 있습니다(미래의 어느 시점에도).
//create方法的接口
Flux.create(Consumer<? super FluxSink<T>>emitter)
/**
*
*/
Flux.create(Consumer<? super FluxSink<T>>emitter,FluxSink.OverflowStrategy overflowStrategy)
청크 단위로 데이터를 처리하는 리스너 API가 있다고 가정하면 (1) 청크 데이터 준비 이벤트, (2) 처리 종료 이벤트의 두 가지 이벤트가 있습니다. 다음과 같이:
interface MyEventListener<T> {
void onDataChunk(List<T> chunk);
void processComplete();
}
create 메소드를 사용하여 이 API를 구현할 수 있습니다.
Flux.create(sink->{
MyEventListener<T> listener=new MyEventListener<T>(){
@Override
public void onDataChunk(List<T> chunk){
for(T value:chunk){
sink.next(value);
}
}
@Override
public void processComplete(){
sink.complete();
}
};
source.register(listener);
});
또한 생성은 비동기식이고 배압을 제어할 수 있으므로 OverflowStrategy를 제공하여 배압 동작을 정의할 수 있습니다.
- IGNORE: 다운스트림 역압 요청을 완전히 무시합니다. 다운스트림 대기열이 가득 차면 IllegalStateException이 발생할 수 있습니다.
- ERROR: IllegalStateException은 다운스트림이 따라갈 수 없을 때 신호를 받습니다.
- 삭제: 다운스트림이 새 요소를 받을 준비가 되지 않은 경우 이 요소를 버립니다.
- LATEST: 다운스트림이 업스트림에서 최신 요소만 가져오도록 합니다.
- BUFFER: (기본값) 다운스트림으로 처리되지 않은 모든 요소를 버퍼링합니다(이 무제한 크기 버퍼는 OutOfMemoryError를 유발할 수 있음).
푸시 모드
푸시 모드에서 데이터 소스는 능동적으로 데이터를 다운스트림으로 푸시합니다. 이 모드에서 데이터 소스는 생산자이고 다운스트림은 소비자입니다. create의 변형은 이벤트 스트림을 생성하는 데 적합한 푸시입니다. 푸시 만들기 类似,
는 비동기식일 수도 있으며 위의 오버플로 전략(오버플로
전략)을 사용하여 배압을 관리할 수 있습니다. 한 번에 하나의 스폰 스레드만 다음, 완료 또는 오류를 호출할 수 있습니다.
Flux<String> bridge=Flux.push(sink->{
myEventProcessor.register(new SingleThreadEventListener<String>(){
public void onDataChunk(List<String> chunk){
for(String s:chunk){
sink.next(s);
}
}
public void processComplete(){
sink.complete();
}
public void processError(Throwable e){
sink.error(e);
}
});
});
푸시/풀(푸시/풀) 하이브리드 모드
푸시와 달리 create는 푸시 또는 풀 모드에서 사용할 수 있으므로 이벤트 메시지가 언제든지 비동기식으로 오기 때문에 브리지 리스너 API에 적합합니다. 요청을 추적하기 위해 FluxSink에 콜백 메서드 onRequest를 등록할 수 있습니다
. 이 콜백은 소스에서 더 많은 데이터를 요청하거나 다운스트림 요청이 도착할 때 데이터를 싱크로 전달하여 배압을 관리하는 데 사용할 수 있습니다. 이는 다운스트림이 업스트림에서 준비된 데이터를 가져올 수 있고 업스트림이 준비가 되면 데이터를 다운스트림으로 푸시할 수도 있기 때문에 하이브리드 푸시/풀 패턴입니다.
Flux<String> bridge = Flux.create(sink -> {
myMessageProcessor.register(
new MyMessageListener<String>() {
public void onMessage(List<String> messages) {
for(String s : messages) {
sink.next(s);
}
}
});
sink.onRequest(n -> {
List<String> messages = myMessageProcessor.request(n);
for(String s : message) {
sink.next(s);
}
});
위의 기사에서는 데이터 소스를 생성하는 일반적인 방법과 방법을 분해하여 나열했습니다. 더 나은 입력과 이해의 편의를 위해 엄격함과 완전성을 보장하기 어렵습니다. 더 공부하고 싶거나 오류가 있다고 생각되면 공식 웹 사이트로 이동하여 더 많은 정보를 확인해야 합니다.
- 공식 홈페이지 주소
- 중국어 번역판 주소 (중국어 주소판이 최신은 아닌 듯)