使用Project Reactor進行反應式資料流 - spring.io
Spring團隊開發了Project Reactor,以支援Spring生態系統中的反應式工作。您不需要Spring即可使用Project Reactor,但是Spring生態系統中的所有反應式API均基於Project Reactor來提供資料流選項。
讓我們看一個示例,該示例說明Project Reactor如何簡化不同資料流源和接收器的組合工作,並消除所有手動執行緒化程式碼。
您需要以下依賴項:
org.springframework.boot:spring-boot-starter-webflux
下面示例說明了在給定不同資料型別的情況下標準化處理的難易程度。在此示例中,我們比較一下Java 8的java.util.Stream<T?>和a CompletableFuture<T>,在大多數反應式應用程式中,您不必從事將非反應性型別轉換為反應性型別(如Flux<T>或Mono<T>)的業務。這些例子將更加直接。本示例假定您有兩個資料來源,需要將它們組合在一起。
package bootiful.rx; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.context.event.ApplicationReadyEvent; import org.springframework.context.ApplicationListener; import org.springframework.context.annotation.Bean; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; import java.util.concurrent.CompletableFuture; import java.util.stream.Stream; @SpringBootApplication public class BootifulApplication { CompletableFuture<String> returnCompletableFuture(int counter) { return CompletableFuture.supplyAsync(() -> { var start = System.currentTimeMillis(); try { Thread.sleep((long) (Math.max((Math.random() * 10), 5) * 1000)); } catch (InterruptedException e) { // threads smdh } var stop = System.currentTimeMillis(); var delta = stop - start; return "(" + Thread.currentThread().getName() + ") Hello, #" + counter + "! (after " + delta + " ms.)"; }); } Stream<Integer> returnStream() { return Stream.iterate(0, integer -> integer + 1); } @Bean ApplicationListener<ApplicationReadyEvent> begin() { return event -> { Flux<String> count = Flux// .fromStream(this.returnStream()) // .take(10) // .flatMap(c -> Flux.zip(Mono.just(c), Mono.fromCompletionStage(this.returnCompletableFuture(c)))) // .map(tuple -> tuple.getT2() + " #" + tuple.getT1()); // count.subscribe(System.out::println); }; } public static void main(String[] args) { SpringApplication.run(BootifulApplication.class, args); } } |
相關文章
- 聊聊Spring Reactor反應式程式設計SpringReact程式設計
- Java反應式框架Reactor中的Mono和FluxJava框架ReactMonoUX
- 使用Reactor響應式程式設計React程式設計
- WebClient: Spring的新的HTTP反應式客戶端 - spring.ioWebclientSpringHTTP客戶端
- 使用Apache Flink和Apache Ignit進行資料流分析Apache
- 解構反應式程式設計——Java8,RxJava,Reactor之比較程式設計RxJavaReact
- 如何使用傳統資料庫思維進行實時資料流分析? – thenewstack資料庫
- [譯] 使用 NumPy 和 Pandas 進行 Python 式資料清理Python
- 使用反應式關聯式資料庫連線規範R2DBC操作MySQL資料庫資料庫MySql
- 使用AndroidKiller進行APK反編譯AndroidAPK編譯
- 使用pandas進行資料分析
- 嵌入式STT-MRAM效應與流致反轉
- vue3 - 使用reactive定義響應式資料進行資料修改賦值時,資料更新但檢視不更新VueReact賦值
- [Tools] 使用 Charles 對 Android 應用進行 HTTPS 資料抓包AndroidHTTP
- 使用KepServerEx進行資料模擬Server
- 使用Mysql工具進行資料清洗MySql
- Burp Suite 攔截手機資料包還未進行釋放,為什麼還能進行請求,釋放資料後沒反應?UI
- 響應式程式設計簡介之:Reactor程式設計React
- 《反應式應用開發》之“什麼是反應式應用”
- Django中views資料查詢使用locals()函式進行優化DjangoView函式優化
- 使用Java 9 Flow進行響應式程式設計Java程式設計
- 如何使用Java串列埠進行資料通訊及應用案例Java串列埠
- 使用 Dynatrace 對 Node.js 應用的效能資料進行分析Node.js
- 使用netcat進行反彈連結的shellcode
- Elasticsearch 使用 NFS 進行資料備份ElasticsearchNFS
- 使用ETL進行資料接入的方式
- 使用python進行合併資料集Python
- 使用 Python 進行資料視覺化Python視覺化
- 漸進式web應用開發---promise式資料庫(五)WebPromise資料庫
- 使用應用程式(Java/Python)訪問MaxCompute Lightning進行資料開發JavaPython
- 使用Spring實現反應式事務(Reactive Transactions)SpringReact
- 使用反應式程式設計替換Java自動資源管理 - Arvind程式設計Java
- 使用RSocket進行服務通訊的反應性服務簡介 - Rafał Kowalski
- 使用MySQL Workbench進行資料庫備份MySql資料庫
- 使用 Python 進行資料分析:入門指南Python
- 使用 useLazyFetch 進行非同步資料獲取非同步
- 使用Spring Data JPA進行資料庫操作Spring資料庫
- 使用Excel資料進行條件刪除Excel