rsocket-js 路由 fireAndForget 到 Spring Boot @MessageMapping
rsocket-js routing fireAndForget to Spring Boot @MessageMapping
据我了解,RSocket-JS 支持使用 encodeCompositeMetadata
和 encodeRoute
路由消息,但是,我无法让服务器接受 fireAndForget
消息。服务器不断记录以下消息:
o.s.m.r.a.support.RSocketMessageHandler : No handler for fireAndForget to ''
这是我要触发的服务器映射:
@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 代码:
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'
) 我在互联网上找到了,但 none 似乎有效。
我需要做什么才能以 Spring 引导服务器识别并正确路由消息的方式格式化路由?
Binary 仅在使用 CompositeMetadata
时进行通信
请确保您已将 ClientTransport
的二进制编解码器配置为 follows:
new RSocketWebSocketClient(
{
url: 'ws://<host>:<port>'
},
BufferEncoders,
),
有了二进制编码器,您将能够使用复合元数据正确发送您的路线。
此外,请确保您已将 metadataMimeType
配置为:
...
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,
),
});
注意,一旦启用BufferEncoders
,您的JSONSeriallizer 将无法工作,您需要将JSON 编码为二进制文件自己(我建议这样做,因为在未来的版本中,我们将完全删除对序列化器概念的支持)。因此,您的请求必须按照以下示例进行调整:
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 */ }
});
在spring 后端
为您的负载使用@Payload 注释
此外,要处理来自客户端的任何数据并让 Spring 知道指定的参数参数是您传入的请求数据,您必须使用 @Payload
注释对其进行注释:
@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();
}
}
据我了解,RSocket-JS 支持使用 encodeCompositeMetadata
和 encodeRoute
路由消息,但是,我无法让服务器接受 fireAndForget
消息。服务器不断记录以下消息:
o.s.m.r.a.support.RSocketMessageHandler : No handler for fireAndForget to ''
这是我要触发的服务器映射:
@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 代码:
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'
) 我在互联网上找到了,但 none 似乎有效。
我需要做什么才能以 Spring 引导服务器识别并正确路由消息的方式格式化路由?
Binary 仅在使用 CompositeMetadata
时进行通信请确保您已将 ClientTransport
的二进制编解码器配置为 follows:
new RSocketWebSocketClient(
{
url: 'ws://<host>:<port>'
},
BufferEncoders,
),
有了二进制编码器,您将能够使用复合元数据正确发送您的路线。
此外,请确保您已将 metadataMimeType
配置为:
...
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,
),
});
注意,一旦启用BufferEncoders
,您的JSONSeriallizer 将无法工作,您需要将JSON 编码为二进制文件自己(我建议这样做,因为在未来的版本中,我们将完全删除对序列化器概念的支持)。因此,您的请求必须按照以下示例进行调整:
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 */ }
});
在spring 后端
为您的负载使用@Payload 注释此外,要处理来自客户端的任何数据并让 Spring 知道指定的参数参数是您传入的请求数据,您必须使用 @Payload
注释对其进行注释:
@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();
}
}