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