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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 10:45:26