Java 流量:过滤异常
我试图用Java 流量:过滤异常,java,spring-webflux,project-reactor,Java,Spring Webflux,Project Reactor,我试图用onErrorContinue从Flux/Mono中过滤异常,但它从未被触发 import org.junit.jupiter.api.Test; import reactor.core.publisher.Flux; import reactor.test.StepVerifier; class FluxOnErrorContinueTest { @Test public void fluxTest() { Flux<String> f
onErrorContinue
从Flux/Mono中过滤异常,但它从未被触发
import org.junit.jupiter.api.Test;
import reactor.core.publisher.Flux;
import reactor.test.StepVerifier;
class FluxOnErrorContinueTest {
@Test
public void fluxTest() {
Flux<String> fluxOne = Flux.just("one")
.onErrorContinue(IllegalArgumentException.class, (ex, value) -> System.out.println("fluxOne: " + ex.getMessage()));
Flux<String> fluxTwo = Flux.<String>error(() -> new IllegalArgumentException("error"))
.onErrorContinue(IllegalArgumentException.class, (ex, value) -> System.out.println("fluxTwo: " +ex.getMessage()));
Flux<String> fluxThree = Flux.just("three", "four", "five")
.onErrorContinue(IllegalArgumentException.class, (ex, value) -> System.out.println("fluxThree: " +ex.getMessage()));
Flux<String> sourceFlux = fluxOne.concatWith(fluxTwo).concatWith(fluxThree);
Flux<String> filteredFlux = sourceFlux
.onErrorContinue(IllegalArgumentException.class, (ex, value) -> System.out.println("filteredFlux: " + ex.getMessage()));
StepVerifier.create(filteredFlux)
.expectNextCount(4)
.verifyComplete();
}
}
如何筛选异常(尝试捕获等效项)
我还尝试了Mono和WebClient的响应
在Javadoc中提到了“错误模式支持Javadoc部分”,但我找不到该部分。您有任何链接吗?这里的问题是测试中的
onErrorContinue
应用于整个sourceFlux
。可能,您需要的是使用操作员从每个发布者的故障中恢复,即concatWith
:
@Test
public void fluxTest() {
Function<Throwable, Publisher<String>> fallback = error -> {
if (error instanceof IllegalArgumentException) {
System.out.println(error.getMessage());
return Flux.empty();
} else {
return Flux.error(error);
}
};
Flux<String> sourceFlux = Flux.just("one")
.concatWith(Flux.<String>error(() -> new IllegalArgumentException("error"))
.onErrorResume(fallback))
.concatWith(Flux.just("three", "four", "five")
.onErrorResume(fallback));
StepVerifier.create(sourceFlux)
.expectNextCount(4)
.verifyComplete();
}
我尝试了两种方法,但是onErrorContinue
没有被触发。嗯,您使用的是onErrorResume
。是的,似乎不适合此任务。那么,在哪些情况下可以使用onErrorContinue
?它甚至没有被触发(没有输出)。来自Javadoc:“让上游兼容的操作符通过从序列中删除有罪元素并继续后续元素来从错误中恢复。”onErrorContinue
不是所有操作符都支持的(我相信Javadoc中提到了它)。顺便说一句,甚至没有提到onErrorContinue
。因此,我建议明智地使用它,不要过分依赖它。
@Test
public void fluxTest() {
Function<Throwable, Publisher<String>> fallback = error -> {
if (error instanceof IllegalArgumentException) {
System.out.println(error.getMessage());
return Flux.empty();
} else {
return Flux.error(error);
}
};
Flux<String> sourceFlux = Flux.just("one")
.concatWith(Flux.<String>error(() -> new IllegalArgumentException("error"))
.onErrorResume(fallback))
.concatWith(Flux.just("three", "four", "five")
.onErrorResume(fallback));
StepVerifier.create(sourceFlux)
.expectNextCount(4)
.verifyComplete();
}
@Test
public void fluxTest() {
Function<Throwable, Publisher<String>> fallback = error -> {
System.out.println(error.getMessage());
return Flux.empty();
};
Flux<String> sourceFlux = Flux.just("one")
.concatWith(Flux.<String>error(() -> new IllegalArgumentException("error"))
.onErrorResume(IllegalArgumentException.class, fallback))
.concatWith(Flux.just("three", "four", "five")
.onErrorResume(IllegalArgumentException.class, fallback));
StepVerifier.create(sourceFlux)
.expectNextCount(4)
.verifyComplete();
}