원자로 데이터 소스 생성

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); 
        }
    });

위의 기사에서는 데이터 소스를 생성하는 일반적인 방법과 방법을 분해하여 나열했습니다. 더 나은 입력과 이해의 편의를 위해 엄격함과 완전성을 보장하기 어렵습니다. 더 공부하고 싶거나 오류가 있다고 생각되면 공식 웹 사이트로 이동하여 더 많은 정보를 확인해야 합니다.

Supongo que te gusta

Origin blog.csdn.net/aofengdaxia/article/details/128906288
Recomendado
Clasificación