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 的行為。

⚠️ **GitHub.com Fallback** ⚠️