spring-boot - rsocket 使用 RSocket-Java 为 Spring Rsocket Server 路由元数据
问题描述
如何设置路由元数据(在服务器使用 Spring Boot Rsocket 时仅使用 RSocket-Java 在有效负载中。
Flux<Payload> s = connection.flatMapMany(requester -> requester.requestStream(DefaultPayload.create("Some Message")))
服务器正在使用 @MessageMapping("/route")
解决方案
交互类型
SpringBoot 上使用的 RSocket 交互类型@MessageMapping
是根据注释方法的签名决定的(spring docs中的更多信息)
假设它有签名:
@MessageMapping("/route")
Flux<String> getStreamOfStrings(String message) {...}
基于spring docs交互类型的基数表是Request-Stream。
RSocket 客户端
RSocket java 客户端需要为元数据指定 mime-type:
RSocket rsocketClient = RSocketConnector.create()
//metadata header needs to be specified
.metadataMimeType(WellKnownMimeType.MESSAGE_RSOCKET_COMPOSITE_METADATA.getString())
// value of spring.rsocket.server.port eg 7000
.connect(TcpClientTransport.create(7000))
.block();
数据
数据将是简单的字符串:
ByteBuf data = ByteBufAllocator.DEFAULT.buffer().writeBytes("request msg".getBytes());
元数据
RSocket中的路由被定义为元数据扩展,需要与数据一起发送来指定路由。这是如何创建它的示例(请参阅包io.rsocket.metadata中的其他类)
CompositeByteBuf metadata = ByteBufAllocator.DEFAULT.compositeBuffer();
RoutingMetadata routingMetadata = TaggingMetadataCodec.createRoutingMetadata(ByteBufAllocator.DEFAULT, List.of("/route"));
CompositeMetadataCodec.encodeAndAddMetadata(metadata,
ByteBufAllocator.DEFAULT,
WellKnownMimeType.MESSAGE_RSOCKET_ROUTING,
routingMetadata.getContent());
请求流请求
创建数据和元数据,以便您可以requestSteam
使用以下命令执行:
rsocketClient.requestStream(DefaultPayload.create(data, metadata))
.map(Payload::getDataUtf8)
.toIterable()
.forEach(System.out::println);
推荐阅读
- c - 从 git 中提取时,如何在 CLions 上使用 C 启用代码洞察力?
- c++ - 我正在寻找这个问题的正确答案,这是正确的吗?
- node.js - 在 Angular 中无法加载资源:net::ERR_EMPTY_RESPONSE
- firebase - 如何在 Cloud Firestore 中编辑文档中的密钥对?
- python - 在 Python 中使用 Openpxl,创建一个新的电子表格,其中包含具有特定子字符串的行
- fortran - 如何确定 Modern Fortran 中的时间步数
- node.js - 如何修复 aws ec2 服务器上的错误“无法打开浏览器进程”?
- r - Dplyr:从字符向量中添加多个具有变异/交叉的列
- java - 当我运行以下 servlet 时,在我的 Web 浏览器中得到一个空白页作为输出
- json - 基于 JSON Schema 的文档