为何触发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方法
解决方案
禁止复用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);检查自定义Subscriber实现
如果是自己实现了Subscriber接口,务必确保onSubscribe方法仅被调用一次,不要在业务代码中手动触发该方法。排查WebClient链式逻辑
检查WebClient的请求处理链中,是否不小心将同一个Subscriber传递给了多个订阅操作,或者重复订阅了同一个序列且复用了Subscriber。
内容的提问来源于stack exchange,提问作者shennian07
相关产品推荐
相关产品推荐

