Reactor ‐ Debugging - CCH0124/spring-sandbox GitHub Wiki
當在每個步驟執行時,需要設置幾個條件斷點並分析數據流。然而,這是一項繁瑣的任務,特別是當有許多反應式過程在運行並共享資源時。此外,在許多情況下,由於安全原因,我們無法啟動調試會話。
@Test
void givenVehicle_whenProcessFoo_thenLogsWithDebugTrace() {
Vehicle one = new Vehicle(new VehicleDto(UUID.randomUUID().toString(), "volvo", "xc90"));
Vehicle two = new Vehicle(new VehicleDto(UUID.randomUUID().toString(), "volvo", "xc95"));
Flux<Vehicle> flux = Flux.just(one, two);
service.processFoo(flux);
}
00:12:25.700 [main] INFO reactor.Flux.MapFuseable.1 - | onSubscribe([Fuseable] FluxMapFuseable.MapFuseableSubscriber)
00:12:25.700 [main] INFO reactor.Flux.MapFuseable.1 - | request(unbounded)
00:12:25.700 [main] INFO reactor.Flux.MapFuseable.1 - | onNext(org.reactor.debugging.model.Vehicle@6f3187b0)
00:12:25.702 [main] INFO reactor.Flux.MapFuseable.1 - | cancel()
00:12:25.702 [main] ERROR o.r.debugging.service.VehicleService - The following error happened on processFoo method!
java.lang.IllegalArgumentException: Vehicle name is not valid!
可以提供 Consumer
作為 subscribe
方法的第二個參數來添加有用的上下文資訊
flux.map(VehicleNameHelp::concatBrandName)
.map(VehicleNameHelp::substringVehicleName)
.log()
.map(VehicleReporter::reportResult)
.subscribe(vehicle -> {
LOGGER.info("Finish with Id {}", vehicle.getId());
}, error -> {
LOGGER.error("The following error happened on processFoo method!",
error);
});
Reactor 提供 Hooks 類,可以配置 Flux 和 Mono 的行為。