<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>《Java 响应式编程·Reactive Streams 与背压原理》· 全书目录与章节索引（50 篇） on PlumePHP</title><link>https://plumephp.com/posts/books/java%E5%93%8D%E5%BA%94%E5%BC%8F%E5%9F%BA%E7%A1%80/</link><description>Recent content in 《Java 响应式编程·Reactive Streams 与背压原理》· 全书目录与章节索引（50 篇） on PlumePHP</description><generator>Hugo</generator><language>zh-CN</language><lastBuildDate>Fri, 30 Oct 2026 06:48:00 +0800</lastBuildDate><atom:link href="https://plumephp.com/posts/books/java%E5%93%8D%E5%BA%94%E5%BC%8F%E5%9F%BA%E7%A1%80/index.xml" rel="self" type="application/rss+xml"/><item><title>附录 E：RS TCK 测试方法参考</title><link>https://plumephp.com/java-rx-basic-appendix-e-tck-reference/</link><pubDate>Fri, 30 Oct 2026 06:48:00 +0800</pubDate><guid>https://plumephp.com/java-rx-basic-appendix-e-tck-reference/</guid><description>按 reactive-streams-tck 1.0.4 实际源码整理四类验证基类：PublisherVerification 38 个用例（22 required）、SubscriberWhiteboxVerification 27 个（14 required）、SubscriberBlackboxVerification 26 个（11 required）、IdentityProcessorVerification 68 个（38 required）。逐条列出真实方法名、对应规范条款、抽象方法签名与被标记为 untested 的规则，并给出 TestNG 运行方式、Flow 适配写法和实测通过/跳过计数。</description></item><item><title>附录 D：从 CompletableFuture 到响应式流迁移指南</title><link>https://plumephp.com/java-rx-basic-appendix-d-migration-guide/</link><pubDate>Fri, 30 Oct 2026 06:47:00 +0800</pubDate><guid>https://plumephp.com/java-rx-basic-appendix-d-migration-guide/</guid><description>CompletableFuture 与 Mono/Flux 的完整 API 映射表，涵盖异步创建、变换、组合、错误处理、超时与并发控制六大类操作。列出迁移过程中的常见陷阱（阻塞 get、异常处理差异、背压缺失）并给出修正代码，同时明确「不应迁移」的场景以避免过度设计。</description></item><item><title>附录 C：背压规则清单</title><link>https://plumephp.com/java-rx-basic-appendix-c-backpressure-rules/</link><pubDate>Fri, 30 Oct 2026 06:46:00 +0800</pubDate><guid>https://plumephp.com/java-rx-basic-appendix-c-backpressure-rules/</guid><description>按 Reactive Streams 1.0.4 原文重列 43 条规则：Publisher 11 条、Subscriber 13 条、Subscription 17 条、Processor 2 条，并标注每条规则与 request/emit 主链的关系及 TCK 覆盖情况。纠正旧文把 §2 与 §3 对调、「15 条中 9 条与背压相关」的错误，并用实测说明两参数 onBackpressureBuffer 的溢出语义，以及 delayElements 为什么不能当作背压缓冲边界。</description></item><item><title>附录 B：调度器选择指南</title><link>https://plumephp.com/java-rx-basic-appendix-b-scheduler-guide/</link><pubDate>Fri, 30 Oct 2026 06:45:00 +0800</pubDate><guid>https://plumephp.com/java-rx-basic-appendix-b-scheduler-guide/</guid><description>按 Reactor 3.8.8 的实际行为给出调度器选择依据：parallel 用于非阻塞 CPU 任务，boundedElastic 用于阻塞 I/O，single 用于需要串行执行的任务；同时纠正三个常见误解——interval 在 parallel 上不会并发执行、boundedElastic 的线程是按需创建而非固定 CPU×10、JDK 10+ 的 availableProcessors 已经容器感知。附 cgroup v1/v2 的核对方法与 VirtualTimeScheduler 的正确写法。</description></item><item><title>附录 A：Reactor/RxJava 操作符速查</title><link>https://plumephp.com/java-rx-basic-appendix-a-rx-cheatsheet/</link><pubDate>Fri, 30 Oct 2026 06:44:00 +0800</pubDate><guid>https://plumephp.com/java-rx-basic-appendix-a-rx-cheatsheet/</guid><description>按 Reactor 3.8.8 与 RxJava 3.1.12 的实际 API 核对过的操作符速查表：涵盖创建、变换、组合、错误处理、背压控制与实用工具六大类，标注了两库并不对等的操作符（如 first、mergeOrdered、throttleFirst）和已废弃的重载，避免把「名字像」当成「语义相同」。</description></item><item><title>14.3 v1 验收：RS 合规、背压可观测、文档</title><link>https://plumephp.com/java-rx-basic-14-3-v1-acceptance/</link><pubDate>Fri, 30 Oct 2026 06:43:00 +0800</pubDate><guid>https://plumephp.com/java-rx-basic-14-3-v1-acceptance/</guid><description>按仓库真实状态做验收，而不是把计划全部打勾：编译通过（约 3 秒），但仓库里没有 TCK 测试类、没有 eventd-app 入口、没有 README，因此合规与可运行两项尚未达成。列出实际命令与真实失败输出，区分「章节中验证过的独立实验」和「仓库内可重复的测试」，并给出补齐验收所需的最小工作清单。</description></item><item><title>14.2 eventd v1 性能基线</title><link>https://plumephp.com/java-rx-basic-14-2-performance-baseline/</link><pubDate>Fri, 30 Oct 2026 06:42:00 +0800</pubDate><guid>https://plumephp.com/java-rx-basic-14-2-performance-baseline/</guid><description>给出一套可复现的小型测量方法，而不是编造吞吐数字：1M 元素的 Flux.range、1M 次 Mono.just 订阅、1M 次 SyncSinglePublisher 订阅各跑 5 轮取中位数；另用 publishOn 测 10 万元素的调度延迟分位数。本机实测 Flux.range 约 6ms、Mono.just 单次订阅约 24ns、手写订阅约 6ns，p50 调度延迟 5μs、p99 11μs。同时说明为什么 onBackpressureBuffer 加在 Flux.range 上、totalMemory 差值和 delayElements 都不能当作有效的性能证据。</description></item><item><title>14.1 用 Project Reactor 重写 eventd</title><link>https://plumephp.com/java-rx-basic-14-1-reactor-rewrite/</link><pubDate>Fri, 30 Oct 2026 06:41:00 +0800</pubDate><guid>https://plumephp.com/java-rx-basic-14-1-reactor-rewrite/</guid><description>把第 2、3、13 章的手写实现逐个映射到 Reactor：SyncSinglePublisher 对应 Mono.just，AsyncRangePublisher 对应 Flux.range + subscribeOn，SensorSimulatorPublisher 对应 Flux.create + sink.onRequest。重点不是行数，而是语义差异：Mono.just(null) 直接抛 NPE，raw Subscription.request(0) 报 §3.9 错误而 BaseSubscriber.request(0) 被静默忽略，scheduleAtFixedRate 不等于有背压的传感器源。</description></item><item><title>13.3 背压演示面板：请求率 vs 消费率</title><link>https://plumephp.com/java-rx-basic-13-3-backpressure-dashboard/</link><pubDate>Fri, 30 Oct 2026 06:40:00 +0800</pubDate><guid>https://plumephp.com/java-rx-basic-13-3-backpressure-dashboard/</guid><description>用同一套指标对比 BUFFER、DROP、LATEST 三种策略：上游 10ms 一个元素，下游每次请求 1 个并处理 50ms。实测 BUFFER(10, DROP_LATEST) 丢弃 76 个、仍有 10 个留在缓冲区，DROP 丢弃 85 个，LATEST 通过 doOnDiscard 计数丢弃 84 个。重点说明 onBackpressureBuffer 两参数重载在溢出时会发 OverflowException，而不是静默丢弃。</description></item><item><title>13.2 传感器模拟器：带背压的随机数据流</title><link>https://plumephp.com/java-rx-basic-13-2-sensor-simulator/</link><pubDate>Fri, 30 Oct 2026 06:39:00 +0800</pubDate><guid>https://plumephp.com/java-rx-basic-13-2-sensor-simulator/</guid><description>实现一个真正响应 request 的 SensorSimulatorPublisher：指数分布间隔、饱和需求累加、wip 串行化、取消时中断工作线程、非正请求转 onError。给出 request(5)、request(0)、取消与慢消费者的实测输出，并说明为什么总耗时接近 max(到达时间, 处理时间) 而不是简单的「生产者等待」。最后给出使用 Flux.create + onRequest 的 Reactor 等价写法及其适用边界。</description></item><item><title>13.1 eventd v1 架构与模块划分</title><link>https://plumephp.com/java-rx-basic-13-1-eventd-architecture/</link><pubDate>Fri, 30 Oct 2026 06:38:00 +0800</pubDate><guid>https://plumephp.com/java-rx-basic-13-1-eventd-architecture/</guid><description>按仓库当前真实状态介绍 eventd v1：父 POM + eventd-core + eventd-app 三个模块，eventd-core 目前只有 SyncSinglePublisher 与 LoggingSubscriber 两个类。给出本机 mvn clean compile 的真实结果和 dependency:tree 原始输出，并解释一个容易踩的坑：这两个类实现的是 java.util.concurrent.Flow 接口，而 RS TCK 验证的是 org.reactivestreams 接口，两者形状相似但不能直接互传，需要适配。</description></item><item><title>12.3 装配时 vs 订阅时</title><link>https://plumephp.com/java-rx-basic-12-3-assembly-vs-subscription/</link><pubDate>Fri, 30 Oct 2026 06:37:00 +0800</pubDate><guid>https://plumephp.com/java-rx-basic-12-3-assembly-vs-subscription/</guid><description>用 Scannable 的实际输出说明装配阶段只是生成 Publisher 链：两个 map 是两个步骤，Reactor 不会把 lambda 合并。用 AtomicInteger 实测 Flux.just(load()) 在装配时立即执行、defer 在每次订阅时重新执行；并澄清 map 里的副作用不是装配时执行，log() 的两个位置都在订阅时打印、请求方向与数据方向相反。</description></item><item><title>12.2 调试技术：Hooks 与检查点</title><link>https://plumephp.com/java-rx-basic-12-2-debugging/</link><pubDate>Fri, 30 Oct 2026 06:36:00 +0800</pubDate><guid>https://plumephp.com/java-rx-basic-12-2-debugging/</guid><description>用同一段代码的实测栈对比三种手段：默认 subscribe() 会把错误交给 onErrorDropped 并只打印操作符内部帧；Hooks.onOperatorDebug() 增加 Assembly trace 与 Error has been observed 站点；checkpoint() 只在标记处报告，且 3.8.8 只有三个重载，没有所谓「条件检查点」。同时给出 log() 的真实输出格式、MDC 跨线程失效的原因，以及为什么不能用一次计时估算调试开销。</description></item><item><title>12.1 生命周期钩子：doOn* 系列</title><link>https://plumephp.com/java-rx-basic-12-1-hooked-lifecycle/</link><pubDate>Fri, 30 Oct 2026 06:35:00 +0800</pubDate><guid>https://plumephp.com/java-rx-basic-12-1-hooked-lifecycle/</guid><description>用实测输出纠正几个常见误解：doOnTerminate 在下游收到 onComplete/onError 之前执行，doAfterTerminate 在下游处理完之后执行；doOnEach 只看到 onNext/onError/onComplete，看不到 onSubscribe 和 cancel；doOnRequest 报告的是请求量而不是实际产量。同时给出 doFinally 的 SIGNAL 类型、取消路径的顺序、钩子所在线程，以及为什么不能用一次 nanoTime 测量钩子开销。</description></item><item><title>11.3 Subscriber 与 Processor 合规测试</title><link>https://plumephp.com/java-rx-basic-11-3-subscriber-verification/</link><pubDate>Fri, 30 Oct 2026 06:34:00 +0800</pubDate><guid>https://plumephp.com/java-rx-basic-11-3-subscriber-verification/</guid><description>分清 SubscriberWhiteboxVerification 与 SubscriberBlackboxVerification 的真实抽象方法：白盒通过 WhiteboxSubscriberProbe 注册 onSubscribe/onNext/onError/onComplete，并用 SubscriberPuppet 控制 request 与 cancel；黑盒的 triggerRequest 默认是空实现。给出可编译、14 个必测项全部通过的白盒骨架，用实测失败信息解释 spec205 要求取消的是「新收到的重复订阅」而不是旧订阅，并展示 IdentityProcessorVerification 的四个抽象方法与 PublishProcessor 的 14 项实败。</description></item><item><title>11.2 Publisher 合规测试</title><link>https://plumephp.com/java-rx-basic-11-2-publisher-verification/</link><pubDate>Fri, 30 Oct 2026 06:33:00 +0800</pubDate><guid>https://plumephp.com/java-rx-basic-11-2-publisher-verification/</guid><description>按真实方法名梳理 PublisherVerification 的必测项：createPublisher 精确元素数、spec101 请求与发射数量、spec102 可少发、spec103 串行信号、spec105 完成信号、spec107 终止后静默、spec109 订阅规则、spec302 同步 request、spec303 递归深度、spec306/307 取消后 no-op、spec309 非正请求、spec312/313 取消语义、spec317 长整型需求。实测 38 个用例中 29 通过、7 个 untested、2 个因无失败 Publisher 跳过，并给出两条真实失败信息与定位方法。</description></item><item><title>11.1 RS TCK：测试环境搭建</title><link>https://plumephp.com/java-rx-basic-11-1-tck-setup/</link><pubDate>Fri, 30 Oct 2026 06:32:00 +0800</pubDate><guid>https://plumephp.com/java-rx-basic-11-1-tck-setup/</guid><description>搭建 Reactive Streams TCK 1.0.4 测试环境：确认它依赖 TestNG 7.3.0、存在独立的 reactive-streams-tck-flow 构件与 FlowPublisherVerification 类，给出普通 Publisher 与 java.util.concurrent.Flow 两套最小依赖和验证基类的真实抽象方法。实测 TestEnvironment 默认超时为 100ms（可用 DEFAULT_TIMEOUT_MILLIS 覆盖），并用一次真实运行说明 38 个用例中 29 通过、9 跳过的构成。</description></item><item><title>10.3 RxJava 3 与 Reactor 的迁移对照</title><link>https://plumephp.com/java-rx-basic-10-3-rxjava-reactor-migration/</link><pubDate>Fri, 30 Oct 2026 06:31:00 +0800</pubDate><guid>https://plumephp.com/java-rx-basic-10-3-rxjava-reactor-migration/</guid><description>给出 RxJava 3 到 Project Reactor 的逐项映射：Observable/Single/Maybe/Completable 与 Flux/Mono 的类型对应，doOnEach、throttleFirst、throttleLast、sample、debounce、onErrorReturn、retryWhen 的真实差异，以及调度器命名对照。重点列出六个迁移陷阱：Observable 无背压、Reactor 没有 onErrorReturn(Function)、Subject 需要 toSerialized、Sinks 返回 FAIL_NON_SERIALIZED、flatMap 默认并发 2147483647 对 256、trampoline 不等于 immediate。示例基于 RxJava 3.1.12 与 reactor-core 3.8.8。</description></item><item><title>10.2 ConnectableObservable 与 connect</title><link>https://plumephp.com/java-rx-basic-10-2-connectable-observable/</link><pubDate>Fri, 30 Oct 2026 06:30:00 +0800</pubDate><guid>https://plumephp.com/java-rx-basic-10-2-connectable-observable/</guid><description>对比 RxJava 的 ConnectableObservable 与 Reactor 的 ConnectableFlux：publish/connect 的延迟连接、refCount 在订阅归零时断开并在下次订阅时重新订阅源、autoConnect(n) 只在凑够 n 个订阅者时连接一次。实测 RxJava refCount 重连后 starts=2、interval 从 0 重新计时，autoConnect(2) 在只有一个订阅者时完全不启动；并纠正「Reactor 的 connect() 没有返回值」的错误说法。示例基于 RxJava 3.1.12 与 reactor-core 3.8.8。</description></item><item><title>10.1 RxJava Subject：与 Sinks 的对照</title><link>https://plumephp.com/java-rx-basic-10-1-subject-rxjava/</link><pubDate>Fri, 30 Oct 2026 06:29:00 +0800</pubDate><guid>https://plumephp.com/java-rx-basic-10-1-subject-rxjava/</guid><description>对比 RxJava 3 的五种 Subject（PublishSubject、BehaviorSubject、ReplaySubject、AsyncSubject、UnicastSubject）与 Reactor Sinks 的语义映射。实测 late subscriber 在 PublishSubject 下丢失历史、BehaviorSubject 补最新值、AsyncSubject 只在完成时发射，并用并发探针证明裸 Subject 的 onNext 不会串行化（maxConcurrent=2），必须 toSerialized()（maxConcurrent=1）。示例基于 RxJava 3.1.12 与 reactor-core 3.8.8。</description></item><item><title>9.3 Sinks 重放：大小与时间限制</title><link>https://plumephp.com/java-rx-basic-09-3-sinks-replay/</link><pubDate>Fri, 30 Oct 2026 06:28:00 +0800</pubDate><guid>https://plumephp.com/java-rx-basic-09-3-sinks-replay/</guid><description>讲解 Sinks.Many.replay() 的五种策略：all() 无限历史、limit(n) 保留最近 n 个、limit(Duration) 按 TTL 淘汰、limit(n, Duration) 同时受限、latest() 只留最新值。实测 late subscriber 在 limit(3) 下只收到 [2,3,4]、只 request(1) 时只收到 1 个元素，证明重放仍受下游背压约束；并给出 latestOrDefault、过期后无新元素、完成后订阅的真实输出。示例基于 reactor-core 3.8.8。</description></item><item><title>9.2 Sinks 多播：背压与重放</title><link>https://plumephp.com/java-rx-basic-09-2-sinks-multicast/</link><pubDate>Fri, 30 Oct 2026 06:27:00 +0800</pubDate><guid>https://plumephp.com/java-rx-basic-09-2-sinks-multicast/</guid><description>用实跑对比 Sinks.Many 多播的三种背压策略：directBestEffort 只丢慢订阅者自己的元素，directAllOrNothing 只要一人无需求就让所有人收不到并返回 FAIL_OVERFLOW，onBackpressureBuffer 用共享队列导致队头阻塞，慢订阅者不补齐需求时快订阅者也拿不到元素。实测缓冲区容量取整（1→1、2/3/5→8、10→16）、默认 256，以及 busyLooping 只重试 FAIL_NON_SERIALIZED、不挽救 FAIL_OVERFLOW。示例基于 reactor-core 3.8.8。</description></item><item><title>9.1 Sinks：程序化发射数据</title><link>https://plumephp.com/java-rx-basic-09-1-sinks-api/</link><pubDate>Fri, 30 Oct 2026 06:26:00 +0800</pubDate><guid>https://plumephp.com/java-rx-basic-09-1-sinks-api/</guid><description>讲解 Reactor Sinks API 的设计目标——在 Publisher 外部程序化地发射数据。对比 unicast、multicast、replay 三种 Many 工厂的订阅模型与零订阅者行为，实测 tryEmitNext 的 EmitResult 语义、emitNext 在 FAIL_OVERFLOW 时会终止整条 sink，以及并发发射实测出现的 FAIL_NON_SERIALIZED，纠正「Sinks 线程安全、可任意线程发射」的误解。示例基于 reactor-core 3.8.8。</description></item><item><title>8.3 refCount、autoConnect 与 cache</title><link>https://plumephp.com/java-rx-basic-08-3-refcount-vs-cache/</link><pubDate>Fri, 30 Oct 2026 06:25:00 +0800</pubDate><guid>https://plumephp.com/java-rx-basic-08-3-refcount-vs-cache/</guid><description>对比 refCount(n)、autoConnect(n)、replay()、replay(n) 与 cache() 的启动时机、断开条件、后订阅者行为与内存代价。实测 refCount(1) 在订阅归零时取消源、在源完成后重新订阅源，autoConnect(1) 在订阅者全部取消后仍持续运行，replay(2) 只给后订阅者回放最近 2 个元素，cache(2) 只保留最近 2 个元素给后订阅者。示例基于 reactor-core 3.8.8。</description></item><item><title>8.2 Hot Publisher：广播与共享</title><link>https://plumephp.com/java-rx-basic-08-2-hot-publisher/</link><pubDate>Fri, 30 Oct 2026 06:24:00 +0800</pubDate><guid>https://plumephp.com/java-rx-basic-08-2-hot-publisher/</guid><description>深入讲解 Hot Publisher 的语义：源流独立于订阅存在，late subscriber 只能收到订阅之后的元素。用 Flux.create 手工驱动 publish、connect，确定性演示后订阅者丢失历史；实测 autoConnect(n) 的连接阈值、refCount(1) 在订阅归零时断开并在下次订阅时重新连接，并纠正「Hot Publisher 无背压、会无限缓冲」的误解。示例基于 reactor-core 3.8.8。</description></item><item><title>8.1 Cold Publisher：每次订阅重放</title><link>https://plumephp.com/java-rx-basic-08-1-cold-publisher/</link><pubDate>Fri, 30 Oct 2026 06:23:00 +0800</pubDate><guid>https://plumephp.com/java-rx-basic-08-1-cold-publisher/</guid><description>系统讲解 Cold Publisher 的语义：数据流与订阅绑定，每次 subscribe 独立启动新序列、重新执行副作用。用实跑输出对比 Flux.range 的重复订阅、Mono.fromCallable 的重复调用、Mono.cache 的成功与失败缓存、Flux.cache(n) 对后订阅者只回放最近 n 个元素，并区分 just 的急切求值与 fromCallable 的延迟求值。示例基于 reactor-core 3.8.8。</description></item><item><title>7.3 背压策略：Error 与请求发射速率控制</title><link>https://plumephp.com/java-rx-basic-07-3-error-strategy/</link><pubDate>Fri, 30 Oct 2026 06:22:00 +0800</pubDate><guid>https://plumephp.com/java-rx-basic-07-3-error-strategy/</guid><description>讲清 onBackpressureError 的快速失败语义，以及 limitRate、limitRate(highTide, lowTide)、limitRequest 三种请求控制手段的真实行为。用 doOnRequest 实测 limitRate(10) 的请求序列 [10, 8, 8, ...] 与 75% 补请求规则，实测 limitRequest(5) 取满即完成、limitRequest(0) 不订阅上游，并给出 Flux.create + onRequest 的生产端限流写法。示例基于 reactor-core 3.8.8。</description></item><item><title>7.2 背压策略：Drop Latest 与 Drop Oldest</title><link>https://plumephp.com/java-rx-basic-07-2-drop-latest-strategy/</link><pubDate>Fri, 30 Oct 2026 06:21:00 +0800</pubDate><guid>https://plumephp.com/java-rx-basic-07-2-drop-latest-strategy/</guid><description>区分 onBackpressureDrop、onBackpressureLatest 与 onBackpressureError 的真实语义：三者都向上游请求 Long.MAX_VALUE，只在下游没有需求时丢弃或覆盖。用确定性订阅实验实测「无需求」和「先请求 1 个」两种情况下保留与丢弃的元素，说明 delayElements 一次只请求一个元素因而会触发丢弃，并给出状态面板、日志采集与快速失败的选型边界。示例基于 reactor-core 3.8.8。</description></item><item><title>7.1 背压策略：Buffer</title><link>https://plumephp.com/java-rx-basic-07-1-buffer-strategy/</link><pubDate>Fri, 30 Oct 2026 06:20:00 +0800</pubDate><guid>https://plumephp.com/java-rx-basic-07-1-buffer-strategy/</guid><description>讲清 onBackpressureBuffer 的真实作用：向上游请求 Long.MAX_VALUE、把下游的需求不足转成队列，而不是让上游变慢。用确定性的订阅实验实测 DROP_LATEST、DROP_OLDEST、ERROR 三种策略的丢弃数量、保留元素、钩子参数与终止信号，并说明 delayElements 一次只请求一个元素、buffer 放在它前面会真实堆积。示例基于 reactor-core 3.8.8。</description></item><item><title>6.3 自定义调度器与 Worker 模型</title><link>https://plumephp.com/java-rx-basic-06-3-custom-scheduler/</link><pubDate>Fri, 30 Oct 2026 06:19:00 +0800</pubDate><guid>https://plumephp.com/java-rx-basic-06-3-custom-scheduler/</guid><description>从 Scheduler/Worker 的真实接口契约出发，手写一个可运行的 LoggingScheduler：直接调度与 Worker 串行调度的区别、Worker.dispose 的取消语义、Scheduler.dispose 对 Worker 的回收，以及延迟/周期调度默认被拒绝的原因。再用 reactor-test 的 VirtualTimeScheduler 演示 StepVerifier 虚拟时间与手动 advanceTimeBy 两种测试方式，并给出按 key 分区和包装现有调度器的完整实现。示例基于 reactor-core 3.8.8、reactor-test 3.8.8。</description></item><item><title>6.2 BoundedElastic 与线程池模型</title><link>https://plumephp.com/java-rx-basic-06-2-bounded-elastic/</link><pubDate>Fri, 30 Oct 2026 06:18:00 +0800</pubDate><guid>https://plumephp.com/java-rx-basic-06-2-bounded-elastic/</guid><description>深入 BoundedElastic 的实现：最多 10×CPU 个单线程 worker、每 worker 10 万任务队列、60 秒空闲 TTL，以及「空闲优先、再新建、最后选最闲 worker」的分配策略。用 reactor-core 3.8.8 实测线程创建、复用、回收与队列拒绝，区分直接 schedule 抛异常和 subscribeOn 转成 onError 两种表现，并说明 JDK 21+ 虚拟线程模式与 ExecutorService 的本质差异。</description></item><item><title>6.1 调度器：单线程、弹性、并行与立即</title><link>https://plumephp.com/java-rx-basic-06-1-schedulers/</link><pubDate>Fri, 30 Oct 2026 06:17:00 +0800</pubDate><guid>https://plumephp.com/java-rx-basic-06-1-schedulers/</guid><description>系统讲解 Reactor 四种内置调度器的线程模型：single 的单线程 FIFO、boundedElastic 的 10×CPU 上限与 10 万/线程队列、parallel 的核数线程与轮询分配、immediate 的调用线程执行。用 reactor-core 3.8.8 实跑输出对比线程名、线程创建数量与任务排队行为，并纠正「boundedElastic 只有 CPU 个线程」「parallel 能让单条流并行」等常见误解。</description></item><item><title>5.3 超时与取消传播</title><link>https://plumephp.com/java-rx-basic-05-3-timeout-cancellation/</link><pubDate>Fri, 30 Oct 2026 06:16:00 +0800</pubDate><guid>https://plumephp.com/java-rx-basic-05-3-timeout-cancellation/</guid><description>讲清 timeout(Duration) 的真实语义——首元素超时与元素间隔超时，而不是整个流的总时长；对比 take(Duration) 的完成语义。用实测代码展示取消信号如何向上游传播、doFinally 放在不同位置看到的信号差异、Disposable/CompositeDisposable 的生命周期管理，以及 timeout 无法中断同步阻塞调用的原因与替代方案。示例基于 reactor-core 3.8.8。</description></item><item><title>5.2 指数退避重试与熔断信号</title><link>https://plumephp.com/java-rx-basic-05-2-retry-backoff/</link><pubDate>Fri, 30 Oct 2026 06:15:00 +0800</pubDate><guid>https://plumephp.com/java-rx-basic-05-2-retry-backoff/</guid><description>剖析 retryWhen(Retry) 的 companion 协议：手写 companion 正常完成会向下游发 onComplete 并吞掉原始异常（实测），正确做法是在重试耗尽时显式发出原始错误。对比 Retry.fixedDelay、Retry.backoff、Retry.max 的订阅次数、退避序列与异常类型，给出线性/指数退避的可运行实现、重试与熔断的边界，以及避免无限重试和惊群的配置模板。示例基于 reactor-core 3.8.8。</description></item><item><title>5.1 错误处理：onErrorReturn、onErrorResume、retry</title><link>https://plumephp.com/java-rx-basic-05-1-error-handling/</link><pubDate>Fri, 30 Oct 2026 06:14:00 +0800</pubDate><guid>https://plumephp.com/java-rx-basic-05-1-error-handling/</guid><description>系统讲解 Reactor 错误处理操作符的语义与选型：onErrorReturn（替换默认值）、onErrorResume（切换备用流）、onErrorMap（异常转换）与 retry（重试N次）。通过实跑代码展示四种策略在数据库查询失败、HTTP 超时等场景下的行为差异，重点说明 retry 的「订阅级重试」本质与无限重试的资源泄漏风险。</description></item><item><title>4.3 组合操作符：zip、merge、combineLatest</title><link>https://plumephp.com/java-rx-basic-04-3-combine-operators/</link><pubDate>Fri, 30 Oct 2026 06:13:00 +0800</pubDate><guid>https://plumephp.com/java-rx-basic-04-3-combine-operators/</guid><description>对比 zip（配对等待）、merge（先到先发）、combineLatest（最新值组合）三种组合操作符的语义差异，说明它们在元素数量不对等、时序差异、错误传播场景下的行为。重点讲清 zip 的木桶效应与有界预取、merge 的 prefetch 回压（不是无限缓冲）、combineLatest 的初始等待陷阱，以及三种操作符在生产中的选型。</description></item><item><title>4.2 转换操作符：map、flatMap、concatMap</title><link>https://plumephp.com/java-rx-basic-04-2-transform-operators/</link><pubDate>Fri, 30 Oct 2026 06:12:00 +0800</pubDate><guid>https://plumephp.com/java-rx-basic-04-2-transform-operators/</guid><description>深入对比 map（同步一对一变换）、flatMap（异步一对多无序展开）与 concatMap（异步一对多有序展开）的语义差异与适用场景。用可复现示例说明 flatMap 的并发无序性、concurrency 与 prefetch 的真实含义、concatMap 的顺序代价，并纠正「flatMap 会无限缓冲导致 OOM」这一常见误解。示例基于 reactor-core 3.8.8。</description></item><item><title>4.1 Mono 与 Flux：零个、一个与多个元素</title><link>https://plumephp.com/java-rx-basic-04-1-mono-vs-flux/</link><pubDate>Fri, 30 Oct 2026 06:11:00 +0800</pubDate><guid>https://plumephp.com/java-rx-basic-04-1-mono-vs-flux/</guid><description>深入讲解 Project Reactor 的两个核心类型：Mono&lt;T&gt;（0 或 1 个元素）与 Flux&lt;T&gt;（0 到 N 个元素）。覆盖创建操作符（just、fromIterable、create、defer）、empty 与 error 的语义差异、Mono&lt;Void&gt; 的用法，以及它们与 CompletableFuture 的真实对应关系。示例基于 Reactor BOM 2025.0.8（reactor-core 3.8.8）。</description></item><item><title>3.3 调度切换：subscribeOn 与 publishOn</title><link>https://plumephp.com/java-rx-basic-03-3-subscribeon-pubishon/</link><pubDate>Fri, 30 Oct 2026 06:10:00 +0800</pubDate><guid>https://plumephp.com/java-rx-basic-03-3-subscribeon-pubishon/</guid><description>讲清 subscribeOn（决定订阅与 request 在哪个调度器上发生）与 publishOn（用队列 + WIP 把下游信号搬到另一个调度器）的语义差异，手写两个操作符并用三个线程归属实验验证。重点纠正「多次 subscribeOn 只有第一个生效」「publishOn 让计算并行」「subscribeOn 放末尾无效」三个常见误解。</description></item><item><title>3.2 操作符链：map、filter、take</title><link>https://plumephp.com/java-rx-basic-03-2-operator-chain/</link><pubDate>Fri, 30 Oct 2026 06:09:00 +0800</pubDate><guid>https://plumephp.com/java-rx-basic-03-2-operator-chain/</guid><description>从零手写三个核心操作符——MapOperator、FilterOperator、TakeOperator——说明「操作符返回新 Publisher」的装饰器模式、request 信号的累减与转发、cancel 向上游的传播链，以及 take(N) 在达到数量后主动 cancel 上游的实现细节。每段代码都配以运行输出与边界测试。</description></item><item><title>3.1 Processor：Subscriber 与 Publisher 的桥接</title><link>https://plumephp.com/java-rx-basic-03-1-processor-bridge/</link><pubDate>Fri, 30 Oct 2026 06:08:00 +0800</pubDate><guid>https://plumephp.com/java-rx-basic-03-1-processor-bridge/</guid><description>实现 MapProcessor&lt;T,R&gt;：同时扮演上游 Subscriber 与下游 Publisher。重点解决下游先订阅时 request 丢失的 pending demand 问题、cancel 双向上传播、终止信号只发一次，以及 mapper 抛异常时先取消上游再通知下游的顺序。附两个订阅顺序的实测与三条 Processor 专项规则。</description></item><item><title>2.3 Subscriber 实现与信号契约</title><link>https://plumephp.com/java-rx-basic-02-3-subscriber-rules/</link><pubDate>Fri, 30 Oct 2026 06:07:00 +0800</pubDate><guid>https://plumephp.com/java-rx-basic-02-3-subscriber-rules/</guid><description>实现三个有代表性的 Subscriber：LoggingSubscriber、逐元素请求的 CountingSubscriber 和批量消费的 BatchingSubscriber。按 §2.1（用 request 表达需求）、§2.7（request/cancel 串行）、§2.8（cancel 后可能有迟到元素）、§2.3（终止回调不得操作 Subscription）逐条落实，并指出「synchronized 不等于信号串行」和「onComplete 里再 request」两个真实 bug。</description></item><item><title>2.2 异步 Publisher 与背压信号</title><link>https://plumephp.com/java-rx-basic-02-2-async-publisher/</link><pubDate>Fri, 30 Oct 2026 06:06:00 +0800</pubDate><guid>https://plumephp.com/java-rx-basic-02-2-async-publisher/</guid><description>实现带背压的异步 Publisher——AsyncRangePublisher：用饱和加法累加 request、用 CAS 扣减额度、用 done 标志保证终止信号只发一次，并解释为什么必须用单线程 Executor 保证信号串行。给出完整实现、取消与空范围测试，以及三个容易写错的并发细节。</description></item><item><title>2.1 同步 Publisher 最小实现</title><link>https://plumephp.com/java-rx-basic-02-1-sync-publisher/</link><pubDate>Fri, 30 Oct 2026 06:05:00 +0800</pubDate><guid>https://plumephp.com/java-rx-basic-02-1-sync-publisher/</guid><description>从零实现符合 Reactive Streams 规范的最小同步 Publisher：SyncSinglePublisher。逐行剖析 subscribe 的 onSubscribe 时序（§1.9）、request 的额度与非法值处理（§1.1、§3.9）、终止后的信号禁令（§1.7）与 cancel 语义（§3.12），并给出编译运行、边界测试和常见错误写法。</description></item><item><title>1.3 规范规则逐条分析</title><link>https://plumephp.com/java-rx-basic-01-3-rule-analysis/</link><pubDate>Fri, 30 Oct 2026 06:04:00 +0800</pubDate><guid>https://plumephp.com/java-rx-basic-01-3-rule-analysis/</guid><description>按 Reactive Streams 1.0.4 官方编号逐条梳理 43 条规则：§1 Publisher（1.1–1.11）、§2 Subscriber（2.1–2.13）、§3 Subscription（3.1–3.17）、§4 Processor（4.1–4.2），给出完整速查表，并深入拆解 1.1 的 happens-before、1.9/2.12/2.5 的订阅语义、2.3 的终止回调禁令、2.8 的 cancel 延迟、3.2/3.3 的同步递归上限与 3.9/3.17 的请求边界，最后对应到 TCK 的真实测试方法名。</description></item><item><title>1.2 Reactive Streams 规范：四个接口</title><link>https://plumephp.com/java-rx-basic-01-2-rs-spec/</link><pubDate>Fri, 30 Oct 2026 06:03:00 +0800</pubDate><guid>https://plumephp.com/java-rx-basic-01-2-rs-spec/</guid><description>拆解 Reactive Streams 的四个核心接口 Publisher、Subscriber、Subscription、Processor 的定义、职责与交互时序；说明 org.reactivestreams 与 JDK 9 Flow 的语义等价但类型不兼容，给出双向适配器；澄清 onSubscribe 时序、重复订阅、null 元素与 request/cancel 串行化四个高频误解。</description></item><item><title>1.1 异步编程的演进</title><link>https://plumephp.com/java-rx-basic-01-1-async-evolution/</link><pubDate>Fri, 30 Oct 2026 06:02:00 +0800</pubDate><guid>https://plumephp.com/java-rx-basic-01-1-async-evolution/</guid><description>从同步阻塞到回调函数，从 Future/Promise 到 CompletableFuture 链式编排，再到 Stream 的惰性求值，逐层分析每种异步模型的能力与边界，引出「推模型没有刹车」这一根本矛盾，说明为什么需要 Reactive Streams 的 request-pull 混合模型来解决速率不匹配问题。</description></item><item><title>前言：环境、项目与读法</title><link>https://plumephp.com/java-rx-basic-preface/</link><pubDate>Fri, 30 Oct 2026 06:01:00 +0800</pubDate><guid>https://plumephp.com/java-rx-basic-preface/</guid><description>本书前言：说明读者画像与前置知识，给出环境清单（JDK 25 + Reactor BOM 2025.0.8 + RxJava 3.1.12 + RS TCK 1.0.4），搭建 eventd-v1 多模块 Maven 骨架，约定代码风格、编译命令与验证方式，并列出全部依赖版本与真实输出供读者核对。</description></item><item><title>《Java 响应式编程·Reactive Streams 与背压原理》目录与学习路径</title><link>https://plumephp.com/java-rx-basic-toc/</link><pubDate>Fri, 30 Oct 2026 06:00:00 +0800</pubDate><guid>https://plumephp.com/java-rx-basic-toc/</guid><description>《Java 响应式编程·Reactive Streams 与背压原理》全书 50 篇目录页：14 章 42 节覆盖 RS 规范、从零实现 Publisher、Project Reactor 核心（Mono/Flux/操作符/调度器）、背压四大策略、Hot 与 Cold 多播、RxJava 3 对照、RS TCK 合规测试，最后以 eventd v1 背压演示系统验收。另含序、前言与五份附录。</description></item><item><title>序：从回调地狱到背压契约</title><link>https://plumephp.com/java-rx-basic-foreword/</link><pubDate>Fri, 30 Oct 2026 06:00:00 +0800</pubDate><guid>https://plumephp.com/java-rx-basic-foreword/</guid><description>本序从回调地狱的三宗罪出发，说明为什么 Promise 和 CompletableFuture 都无法解决根本问题，引出 Reactive Streams 规范作为信号契约的诞生背景；同时声明三卷分工与本书边界——不写 Netty 源码、不写 Spring WebFlux 配置、不写 Kafka Streams 拓扑。</description></item></channel></rss>