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

为何触发Subscriber.onSubscribe重复调用异常?附WebClient代码示例

解决Subscriber.onSubscribe MUST NOT be called more than once异常

异常核心原因

这个错误的本质是同一个Subscriber实例被重复用于订阅操作——不管是订阅同一个Publisher(如Mono/Flux),还是多个不同的Publisher,Reactor的规范都要求每个Subscriber只能被订阅一次,重复调用会触发该异常。

你的代码排查

你提供的代码本身不会触发这个异常,两次订阅操作使用的都是独立的Subscriber实例:

  • 第一个mono.subscribe(...)用lambda创建了匿名Subscriber
  • 第二个resultMono.subscribe(System.out::println)通过方法引用生成了新的Subscriber

如果实际运行中出现该异常,大概率是你的真实代码存在以下情况:

  • 复用了同一个Subscriber实例多次调用subscribe()
  • 自定义Subscriber实现时,手动重复调用了onSubscribe方法

解决方案

  1. 禁止复用Subscriber实例
    每次调用subscribe()时,都生成新的Subscriber实例,不要将Subscriber存为变量重复使用。
    错误示例:

    // 错误:复用同一个Subscriber实例
    Consumer<String> subscriber = System.out::println;
    resultMono.subscribe(subscriber);
    resultMono.subscribe(subscriber); // 触发异常
    

    正确示例:

    // 方式1:每次使用lambda生成新实例
    resultMono.subscribe(s -> System.out.println(s));
    // 方式2:显式创建新的Consumer实例
    resultMono.subscribe(new Consumer<String>() {
        @Override
        public void accept(String s) {
            System.out.println(s);
        }
    });
    // 方式3:直接使用方法引用(只要不将其存为变量重复使用即可)
    resultMono.subscribe(System.out::println);
    
  2. 检查自定义Subscriber实现
    如果是自己实现了Subscriber接口,务必确保onSubscribe方法仅被调用一次,不要在业务代码中手动触发该方法。

  3. 排查WebClient链式逻辑
    检查WebClient的请求处理链中,是否不小心将同一个Subscriber传递给了多个订阅操作,或者重复订阅了同一个序列且复用了Subscriber。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 07:16:00