Java響應式編程

Java 響應式編程是一種基于異步數據流處理的編程范式,它強調數據流的聲明式構建和傳播變化的自動響應。Java 9 引入的Flow API為響應式編程提供了標準接口,而 Reactor 和 RxJava 等第三方庫則提供了更豐富的操作符和工具。

核心概念

  1. Publisher(發布者):產生數據流的源頭。
  2. Subscriber(訂閱者):消費數據流的接收者。
  3. Subscription(訂閱):連接發布者和訂閱者的橋梁,管理背壓(Backpressure)。
  4. Processor(處理者):兼具發布者和訂閱者的功能,用于轉換數據流。

簡單示例:使用 Java Flow API

下面是一個使用 Java 標準庫Flow API的簡單響應式編程示例:

import java.util.concurrent.Flow;
import java.util.concurrent.SubmissionPublisher;public class ReactiveExample {public static void main(String[] args) throws InterruptedException {// 創建發布者try (SubmissionPublisher<String> publisher = new SubmissionPublisher<>()) {// 創建訂閱者Flow.Subscriber<String> subscriber = new Flow.Subscriber<>() {private Flow.Subscription subscription;@Overridepublic void onSubscribe(Flow.Subscription subscription) {System.out.println("訂閱成功");this.subscription = subscription;subscription.request(1); // 請求1個數據}@Overridepublic void onNext(String item) {System.out.println("接收到數據: " + item);subscription.request(1); // 處理完后再請求1個}@Overridepublic void onError(Throwable throwable) {System.out.println("發生錯誤: " + throwable.getMessage());}@Overridepublic void onComplete() {System.out.println("數據流處理完成");}};// 訂閱publisher.subscribe(subscriber);// 發布數據publisher.submit("Hello");publisher.submit("Reactive");publisher.submit("World");// 等待所有數據處理完成Thread.sleep(1000);}}
}

常用操作符(以 Reactor 庫為例)

Reactor 是 Spring 生態中推薦的響應式編程庫,提供了Mono(0-1 個元素)和Flux(0-N 個元素)兩種核心類型:

import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;public class ReactorExample {public static void main(String[] args) {// 創建FluxFlux<String> flux = Flux.just("A", "B", "C").map(String::toLowerCase)  // 轉換操作.filter(s -> s.startsWith("a"));  // 過濾操作// 創建MonoMono<String> mono = Mono.just("Hello").flatMap(s -> Mono.just(s + " World"));  // 異步轉換// 訂閱并消費flux.subscribe(System.out::println,  // 正常數據處理Throwable::printStackTrace,  // 錯誤處理() -> System.out.println("Flux完成")  // 完成回調);mono.subscribe(System.out::println);}
}

背壓(Backpressure)處理

響應式編程的重要特性是支持背壓,即消費者可以控制生產者發送數據的速率:

Flux.range(1, 1000)  // 生成1到1000的整數.onBackpressureBuffer(100)  // 緩沖100個元素.subscribe(num -> {// 模擬慢速處理try { Thread.sleep(100); } catch (InterruptedException e) {}System.out.println(num);},Throwable::printStackTrace,() -> System.out.println("處理完成"));

響應式 Web 示例(Spring WebFlux)

Spring WebFlux 是基于 Reactor 的響應式 Web 框架:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Mono;@SpringBootApplication
public class WebFluxExample {public static void main(String[] args) {SpringApplication.run(WebFluxExample.class, args);}
}@RestController
class HelloController {@GetMapping("/hello")public Mono<String> hello() {return Mono.just("Hello, Reactive Web!");}
}

總結

Java 響應式編程通過異步數據流提供了高效處理大量并發請求的能力,適合構建非阻塞、低延遲的應用程序。主要應用場景包括微服務、實時數據處理和高并發系統。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/93270.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/93270.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/93270.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【重學數據結構】二叉搜索樹 Binary Search Tree

目錄 二叉搜索樹的數據結構 手寫實現二叉搜索樹 樹節點定義 插入節點 源碼 流程圖 二叉樹插入步驟圖解 第一步: 插入 20 第二步: 插入 10 第三步: 插入 30 第四步: 插入 5 查找節點 源碼 場景一: 查找成功 (search for 25) 第一步: 從根節點開始 第二步:…

四、計算機組成原理——第1章:計算機系統概述

目錄 1.1計算機發展歷程 1.1.1計算機硬件的發展 1.計算機的四代變化 2.計算機元件的更新換代 1.1.2計算機軟件的發展 1.2計算機系統層次結構 1.2.1計算機系統的組成 1.2.2計算機硬件 1.馮諾依曼機基本思想 2.計算機的功能部件 (1)輸入設備 (2)輸出設備 (3)存儲器 (4)運算器 (5)…

flutter TextField 失去焦點事件

在 Flutter 中&#xff0c;處理 TextField 的失去焦點事件&#xff08;即失去焦點時觸發的操作&#xff09;通常有兩種常用方式&#xff1a;使用 FocusNode 或 onEditingComplete 回調。以下是具體實現&#xff1a; import package:flutter/material.dart;class MyTextField e…

Moonlight for ChromeOS 常見問題解決方案

Moonlight for ChromeOS 常見問題解決方案 項目基礎介紹 Moonlight for ChromeOS 是一個開源的 NVIDIA GameStream 客戶端&#xff0c;允許用戶將他們的游戲從高性能的桌面電腦流式傳輸到運行 ChromeOS 的設備上。該項目還支持 Android 和 iOS/tvOS 平臺。Moonlight for Chrome…

SQL語句:讀操作、寫操作、視圖

文章目錄讀操作分類基礎查詢語句示例高級查詢--分組查詢、子查詢、表連接、聯合查詢分組查詢&#xff1a;子查詢&#xff08;嵌套查詢&#xff09;表連接聯合查詢寫操作視圖SQL&#xff1a;結構化查詢語言讀操作 重點是where查詢&#xff0c;即高級查詢部分 分類 DML &#…

Python 機器學習實戰:基于 Scikit-learn

本文圍繞《Python 機器學習實戰&#xff1a;基于 Scikit-learn 的項目開發》展開&#xff0c;先介紹 Scikit-learn 庫的基礎特性與優勢&#xff0c;再闡述機器學習項目開發的完整流程&#xff0c;包括數據收集與預處理、模型選擇與訓練、評估與優化等。通過具體實戰案例&#x…

java里List鏈式編程

java里對list的操作&#xff0c;我們一遍使用for遍歷&#xff0c;輸出或改變里面的內容。單經常在代碼里面我們發現&#xff0c;也可以使用這樣的代碼結構daPaymentActionVo.setApnolist(paymentActionVo.getApnolist().stream().map(PaymentActionVo.Voucher::getApno).collec…

【esp32s3】7 - VSCode + PlatformIO + Arduino + 構建項目

一、PlatformIO 1.1. 概述 官方文檔&#xff1a;What is PlatformIO? PlatformIO 是一個跨平臺的物聯網開發生態系統&#xff0c;專門為嵌入式系統開發設計&#xff0c;支持多種開發板和框架。 1.1.1. 主要特點 跨平臺&#xff1a;支持 Windows、macOS 和 Linux多框架支持&…

LE AUDIO CIS/BIS音頻傳輸時延的計算

LE AUDIO音頻總時延計算方法 按照BAP的規范,LE AUDIO音頻總延時包括三個部分:Audio Processing Time,Transport Latency,Presentation Delay。如下圖所示是播放音樂的示例圖: 這里還有一個麥克風錄音的總時延示例圖: Audio Processing Time:這個就是音頻DSP獲取音頻數…

git 修改 更新

git 修改 更新先更新&#xff0c;后修改# 暫存當前修改 git add . git stash# 獲取最新的 main 分支 git checkout main git pull# 新建開發分支 git checkout -b lbg_0727# ?? 先把 main 的最新代碼合并/變基到當前分支&#xff08;用于消除沖突&#xff09; # 方法1&#x…

飛鶴困局:增長神話的裂痕

增長天花板已然逼近&#xff0c;飛鶴需要探尋新方向。作者|安德魯編輯|文昌龍“飛鶴&#xff0c;更適合中國寶寶體質”——這句曾讓無數媽媽點頭的廣告語&#xff0c;幫飛鶴坐上了中國奶粉市場的頭把交椅。可多年后&#xff0c;時代紅利退潮&#xff0c;故事不好講了。飛鶴的利…

Java設計模式之<建造者模式>

目錄 1、建造者模式 2、建造者模式結構 3、實現 4、工廠模式對比 5、適用場景差異 前言 建造者模式是一種創建型設計模式。用于封裝復雜對象的構建過程&#xff0c;通過步驟構建產品類。它包括產品類、抽象建造者、具體建造者和指揮者角色。 優點在于靈活性、解耦和易擴展…

fchown/fchownat系統調用及示例

55. fchmod - 通過文件描述符改變文件權限 函數介紹 fchmod是一個Linux系統調用&#xff0c;用于通過文件描述符來改變文件的訪問權限。它是chmod函數的文件描述符版本&#xff0c;避免了路徑名解析。 函數原型 #include <sys/stat.h> #include <unistd.h>int fchm…

20250726-5-Kubernetes 網絡-Service 代理模式詳解(iptables與ipvs)_筆記

一、服務三種常用類型 ?? 1. LoadBalancer類型 工作原理:與NodePort類似,在每個節點上啟用端口暴露服務,同時Kubernetes會請求底層云平臺(如阿里云、騰訊云、AWS等)的負載均衡器,將每個Node([NodeIP]:[NodePort])作為后端添加。 自動化實現:云廠商通過官方實現的控制…

horizon置備出錯

報錯內容如下&#xff1a; [2025/7/28 19:15] 置備 Customization failure: Customization of the guest operating system is not supported due to the given reason: 期間出錯 解決方法&#xff1a;將模板轉換為虛擬機&#xff0c;安裝vmtools&#xff1b;再安裝vmtools之后…

【unitrix】 6.19 Ord特質(ord.rs)

一、源碼 這段代碼定義了一個標記特征&#xff08;marker trait&#xff09;Ord 和三個實現&#xff0c;用于將類型標記與 Rust 標準庫中的 Ordering 枚舉關聯起來。 use crate::sealed::Sealed; use core::cmp::Ordering; use crate::number::{Greater, Equal, Less}; /// 用于…

數據結構之順序表鏈表棧

順序表 什么是 list list 的使用 線性表是什么 順序表是什么 順序表和線性表的關系 順序表和數組的區別 List 和 ArrayList 的關系 如何自己模擬實現 myArrayList ArrayList 的構造 ArrayList 的常見方法 以下兩種寫法有什么區別 ArrayList<Integer> arrayLis…

day062-監控告警方式與Grafana優雅展示

文章目錄0. 老男孩思想-馬太效應1. API監控2. zabbix的API接口2.1 生成zabbix的api token2.2 訪問格式2.3 前端添加web監測3. 監控告警方式3.1 云監控-郵件告警3.1.1 郵箱開啟授權碼3.1.2 zabbix前端配置3.1.3 消息模板3.1.4 配置郵箱收件人信息3.1.5 配置觸發器3.2 企業微信告…

Ettus USRP X410/X440 運行 ADC 自校準

Ettus USRP X410/X440 運行 ADC 自校準 打開一個接收&#xff08;Rx&#xff09;會話到您在設備名稱輸入中指定的設備并返回會話句柄 out&#xff0c;您可以使用該句柄在所有后續 NI-USRP VI 中識別此儀器會話。 支持設備&#xff1a;Ettus USRP X410/X440輸入/輸出 文明.png 會…

Qt元類型系統(QMetaType)詳解

Qt元類型系統詳解一、Qt元類型系統(QMetaType)詳解1. 核心功能2. 注冊機制3. 關鍵技術點4. 信號槽支持5. 流式傳輸支持6. 使用場景7. 注意事項二、完整示例1、基本實例2、基本實例3、元類型在信號槽中的應用4、高級用法三、元對象編譯器moc元對象編譯器&#xff08;Moc&#xf…