You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Reactor-Core新手咨询:超时触发降级逻辑的timeout方法实现

解答:Reactor-Core 超时降级的实现方案

Hey there! Great question—since you come from an Erlang background, you’re already used to async timeout patterns, so Reactor’s timeout method should align nicely with what you’re looking for.

直接结论:完全可以用 timeout(Duration, Mono) 实现你的需求

你提到的官网API public final Mono<T> timeout(Duration timeout, Mono<? extends T> fallback) 正是为这类场景设计的:当原Mono在指定时长内没有产生元素(也就是你说的没收到响应),就会自动切换到你提供的降级逻辑Mono。

结合你的场景的代码示例

假设发送消息'A'并等待响应的逻辑封装成一个Mono,你可以这样实现超时降级:

import reactor.core.publisher.Mono;
import java.time.Duration;

// 模拟发送消息"A"并等待响应的核心逻辑
Mono<String> sendAndWaitForResponse = Mono.fromCallable(() -> {
    // 替换为实际发送消息"A"的代码
    sendMessage("A");
    // 替换为实际等待响应的逻辑
    return waitForIncomingResponse();
});

// 设置x分钟超时,超时后触发降级逻辑
Mono<String> resultWithFallback = sendAndWaitForResponse
    .timeout(
        Duration.ofMinutes(x), // x分钟的超时阈值
        Mono.fromCallable(() -> {
            // 这里写你的降级逻辑:比如返回默认响应、记录告警、执行备选操作等
            return "Fallback response: No reply received within " + x + " minutes";
        })
    );

关键细节提醒(适配你的Erlang经验)

  • 和Erlang中erlang:send_after配合消息处理的逻辑类似,Reactor的timeout是从订阅Mono开始计时的,所以一定要把发送消息的逻辑放在Mono内部(比如用fromCallable、flatMap),而不是在订阅前执行,否则计时会提前启动,导致超时判断不准确。
  • 降级用的fallback Mono是惰性执行的:只有当超时发生时,它才会被订阅和执行,不会影响正常流程的性能。
  • 如果你的响应是多元素的Flux,也有对应的timeout重载方法支持Flux的超时降级,用法和Mono版本一致。

内容的提问来源于stack exchange,提问作者Suchak Jani

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:34:07