Spring RSocket无法获取Mono响应,请求-响应模式调用异常求助
RSocket请求-响应模式:Spring服务端无法获取Dart客户端响应
问题背景
使用RSocket请求-响应模式实现Spring服务端主动向Dart客户端发起调用,客户端基于rsocket-dart库。调试发现:
- 客户端能正常接收服务端请求并打印Payload
- 服务端已收到客户端返回的COMPLETE类型帧,但服务端订阅
Mono<String>的逻辑无任何输出,无法获取响应内容 - 尝试用
route("")替换route(null),问题未解决
服务端代码(Spring)
rsocketRequester.route(null).data("this is server reqeust!") .retrieveMono(String.class) .subscribe((value) -> { // 预期:控制台打印响应数据 // 实际:无输出 System.out.println(value); });
客户端代码(Dart)
import 'dart:typed_data'; import 'package:rsocket/rsocket.dart'; List<int> list = 'this is client response!'.codeUnits; Uint8List bytes = Uint8List.fromList(list); RSocketConnector connector = RSocketConnector.create().acceptor(requestResponseAcceptor((payload) { print(convertor(payload!.data!)); // 正常打印服务端请求Payload,确认收到请求 return Future.value(Payload.from(null, bytes)); })); var rsocket = await connector.connect("ws://localhost:7000/rsocket");
调试信息
- 客户端:控制台正常输出服务端发送的请求内容,确认请求接收成功
- 服务端:调试日志显示已接收包含Payload的COMPLETE帧,但订阅回调未执行
排查与解决方案
1. 处理元数据兼容性
Spring RSocketRequester默认会将路由作为元数据发送,若客户端返回响应时元数据格式不匹配,服务端可能无法正确解析响应。
- 方案1:服务端明确指定元数据类型
rsocketRequester.route(null) .metadataMimeType(MimeTypeUtils.TEXT_PLAIN) .data("this is server reqeust!") .retrieveMono(String.class) .subscribe(System.out::println);
- 方案2:客户端返回响应时传入空的合法元数据(避免直接传
null)
return Future.value(Payload.from(Uint8List(0), bytes));
2. 统一编码解码格式
服务端用retrieveMono(String.class)期望将Payload解码为UTF-8字符串,确保客户端用相同编码生成字节:
// 导入dart:convert后替换原字节生成逻辑 import 'dart:convert'; Uint8List bytes = utf8.encode('this is client response!') as Uint8List;
3. 添加错误订阅排查异常
在服务端订阅中添加错误处理,定位是否有未捕获的异常:
rsocketRequester.route(null).data("this is server reqeust!") .retrieveMono(String.class) .subscribe( System.out::println, Throwable::printStackTrace // 打印错误日志排查问题 );
4. 确认RSocketRequester实例有效性
确保使用的rsocketRequester是已成功与客户端建立连接的实例,而非未初始化或已断开的对象。
内容的提问来源于stack exchange,提问作者Kaustubh Dixit
相关产品推荐
相关产品推荐

