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() 方法記錄反應式流。