知識庫 / Reactive RSS 訂閱

記錄反應式序列

Logging,Reactive,Spring Web
HongKong
10
01:36 PM · Dec 06 ,2025

1. 概述

隨着 Spring WebFlux 的引入,我們又獲得了一款強大的工具,用於編寫響應式、非阻塞應用程序。雖然使用這項技術現在比以前要容易得多,但在 Spring WebFlux 中調試響應式序列可能會相當繁瑣

在本快速教程中,我們將學習如何輕鬆地記錄異步序列中的事件,以及如何避免一些常見的錯誤。

2. Maven 依賴

讓我們將 Spring WebFlux 依賴添加到我們的項目中,以便我們可以創建反應式流:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-webflux</artifactId>
</dependency>

我們可以在 Maven Central 上獲取最新的 spring-boot-starter-webflux 依賴。

3. 創建一個反應式流

為了開始,讓我們使用 <em >Flux</em> 創建一個反應式流,並使用 <em >log()</em> 方法啓用日誌記錄:

Flux<Integer> reactiveStream = Flux.range(1, 5).log();

接下來,我們將訂閲它以消費生成的數值:

reactiveStream.subscribe();

4. 反應式流日誌記錄

運行上述應用程序後,我們看到日誌記錄器正在運行:

2018-11-11 22:37:04 INFO | onSubscribe([Synchronous Fuseable] FluxRange.RangeSubscription)
2018-11-11 22:37:04 INFO | request(unbounded)
2018-11-11 22:37:04 INFO | onNext(1)
2018-11-11 22:37:04 INFO | onNext(2)
2018-11-11 22:37:04 INFO | onNext(3)
2018-11-11 22:37:04 INFO | onNext(4)
2018-11-11 22:37:04 INFO | onNext(5)
2018-11-11 22:37:04 INFO | onComplete()

我們能夠監聽到流中所有發生的事件。五個值被髮射出來,然後通過一個onComplete()事件關閉了流。

5. 高級日誌記錄場景

我們可以修改我們的應用程序以查看更具吸引力的場景。讓我們添加 take()Flux,這會指示流僅提供特定數量的事件:

Flux<Integer> reactiveStream = Flux.range(1, 5).log().take(3);

執行代碼後,我們將看到以下輸出:

2018-11-11 22:45:35 INFO | onSubscribe([Synchronous Fuseable] FluxRange.RangeSubscription)
2018-11-11 22:45:35 INFO | request(unbounded)
2018-11-11 22:45:35 INFO | onNext(1)
2018-11-11 22:45:35 INFO | onNext(2)
2018-11-11 22:45:35 INFO | onNext(3)
2018-11-11 22:45:35 INFO | cancel()

如我們所見,take() 導致流在發出三個事件後取消。

在您的流中放置 log() 至關重要。 讓我們看看在 log() 之後放置 take() 會產生不同的輸出:

Flux<Integer> reactiveStream = Flux.range(1, 5).take(3).log();

以下是翻譯結果:

2018-11-11 22:49:23 INFO | onSubscribe([Fuseable] FluxTake.TakeFuseableSubscriber)
2018-11-11 22:49:23 INFO | request(unbounded)
2018-11-11 22:49:23 INFO | onNext(1)
2018-11-11 22:49:23 INFO | onNext(2)
2018-11-11 22:49:23 INFO | onNext(3)
2018-11-11 22:49:23 INFO | onComplete()

我們能看到,改變觀察點會改變輸出。現在流產生三個事件,但我們看到的不再是 cancel(),而是 onComplete()這是因為我們使用 take() 替代了該方法所請求的結果。

6. 結論

在本文中,我們學習瞭如何使用內置的 log() 方法記錄反應式流。

user avatar
0 位用戶收藏了這個故事!
收藏

發佈 評論

Some HTML is okay.