Spring WebFlux Junit Асинхронный / Параллельный

У меня есть класс со следующими двумя методами.

      public class Test1 {
    public Mono<String> blah1() {
        Mono<String> blah = Mono.just("blah1");
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.println("blah1 done");
        return blah;
    }
    
    public Mono<String> blah2() {
        Mono<String> blah = Mono.just("blah2");
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.println("blah2 done");
        return blah;
    }
}

У меня есть следующий JUnit:

      @Test
public void blah1Test() {
    Flux<Tuple2<String, String>> s = Flux.zip(test1.blah1(), test1.blah2());    
}

Мой результат таков:

      blah1 done
blah2 done

Я ожидаю, что blah2 закончит раньше blah1. Таким образом, я считаю, что это блокирование обработки, а не неблокирование. Что мне нужно сделать, чтобы переключить выход на blah2, а затем на blah1? В основном, почему они не обрабатываются параллельно?

Спасибо заранее за ваше время!

1 ответ

Оба sleepа также printlnвыполняются вне реактивного конвейера. Следовательно, оба blah1()а также blah2()вести себя как обычные нереактивные методы.

Попробуй это:

      public Mono<String> blah1() {
    System.out.println("blah1 start");
    return Mono.just("blah1")
        .delayElement(Duration.ofMillis(5000))
        .doOnNext(e -> System.out.println("blah1 done"));
}

public Mono<String> blah2() {
    System.out.println("blah2 start");
    return Mono.just("blah2")
        .delayElement(Duration.ofMillis(1000))
        .doOnNext(e -> System.out.println("blah2 done"));
}

Здесь мы имеем ожидаемый результат, потому что печать происходит в реактивном конвейере.

Выход:

      blah1  start 
blah2 start 
blah2 done
blah1 done
Другие вопросы по тегам