首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >rsocket-js路由fireAndForget到Spring @MessageMapping

rsocket-js路由fireAndForget到Spring @MessageMapping
EN

Stack Overflow用户
提问于 2021-05-13 08:23:46
回答 1查看 623关注 0票数 1

正如我所理解的,RSocket支持使用encodeCompositeMetadataencodeRoute路由消息,但是,我不能让服务器接受fireAndForget消息。服务器经常记录以下消息:

o.s.m.r.a.support.RSocketMessageHandler : No handler for fireAndForget to ''

这是我试图触发的服务器映射:

代码语言:javascript
复制
    @Controller
    public class MockController {
        private static final Logger LOGGER = LoggerFactory.getLogger(MockController.class);
    
        @MessageMapping("fire-and-forget")
        public Mono<Void> fireAndForget(MockData mockData) {
            LOGGER.info("fireAndForget: {}", mockData);
            return Mono.empty();
        }
    }

这是试图建立连接的TypeScript代码:

代码语言:javascript
复制
    client.connect().subscribe({
        onComplete: socket => {
            console.log("Connected to socket!")
            socket.fireAndForget({
                data: { someData: "Hello world!" },
                metadata: encodeCompositeMetadata([[MESSAGE_RSOCKET_ROUTING, encodeRoute("fire-and-forget")]])
            });
        },
        onError: error => console.error(error),
        onSubscribe: cancel => {/* call cancel() to abort */ }
    });

我也尝试过用我在互联网上找到的其他方式(metadata: String.fromCharCode('route'.length)+'route')添加这条路径,但似乎没有一条有效。

要将路由格式化为Spring服务器识别并能够正确路由消息的方式,我需要做什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-13 09:07:53

使用CompositeMetadata二进制仅进行通信

请确保您已将ClientTransport配置为二进制编解码器为下面是

代码语言:javascript
复制
new RSocketWebSocketClient(
    {
      url: 'ws://<host>:<port>'
    },
    BufferEncoders,
  ),

有了二进制编码器,您将能够使用复合元数据正确地发送路由。

此外,请确保您已将metadataMimeType配置为:

代码语言:javascript
复制
...
const metadataMimeType = MESSAGE_RSOCKET_COMPOSITE_METADATA.string; // message/x.rsocket.composite-metadata.v0

new RSocketClient<Buffer, Buffer>({
  setup: {
    ...
    metadataMimeType,
  },
  transport: new RSocketWebSocketClient(
    {
      url: 'ws://<host>:<port>',
    },
    BufferEncoders,
  ),
});

Note,一旦您启用了JSON,您的JSONSeriallizer就无法工作,您需要将您的JSON编码为二进制您自己(我建议这样做,因为在将来的版本中,我们将完全取消对序列化器概念的支持)。因此,您的请求必须按照下面的示例进行调整:

代码语言:javascript
复制
client.connect().subscribe({
        onComplete: socket => {
            console.log("Connected to socket!")
            socket.fireAndForget({
                data: Buffer.from(JSON.stringify({ someData: "Hello world!" })),
                metadata: encodeCompositeMetadata([[MESSAGE_RSOCKET_ROUTING, encodeRoute("fire-and-forget")]])
            });
        },
        onError: error => console.error(error),
        onSubscribe: cancel => {/* call cancel() to abort */ }
    });

对春季后端的有效负载使用@Payload注释

此外,要处理来自客户端的任何数据,并让Spring知道指定的参数参数是传入的请求数据,您必须用@Payload注释对其进行注释:

代码语言:javascript
复制
@Controller
    public class MockController {
        private static final Logger LOGGER = LoggerFactory.getLogger(MockController.class);
    
        @MessageMapping("fire-and-forget")
        public Mono<Void> fireAndForget(@Payload MockData mockData) {
            LOGGER.info("fireAndForget: {}", mockData);
            return Mono.empty();
        }
    }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67516095

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档