Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring boot rsocket js路由FireAnd忘记Spring引导@MessageMapping_Spring Boot_Rsocket_Rsocket Js - Fatal编程技术网

Spring boot rsocket js路由FireAnd忘记Spring引导@MessageMapping

Spring boot rsocket js路由FireAnd忘记Spring引导@MessageMapping,spring-boot,rsocket,rsocket-js,Spring Boot,Rsocket,Rsocket Js,据我所知,RSocket JS支持使用encodeCompositeMetadata和encodeRoute路由消息,但是,我无法让服务器接受fireAndForget消息。服务器不断记录以下消息: o.s.m.r.a.support.RSocketMessageHandler:没有FireAnd的处理程序,忘记了“” 这是我试图触发的服务器映射: @控制器 公共类模拟控制器{ 私有静态最终记录器Logger=LoggerFactory.getLogger(MockController.clas

据我所知,RSocket JS支持使用
encodeCompositeMetadata
encodeRoute
路由消息,但是,我无法让服务器接受
fireAndForget
消息。服务器不断记录以下消息:

o.s.m.r.a.support.RSocketMessageHandler:没有FireAnd的处理程序,忘记了“”

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

@控制器
公共类模拟控制器{
私有静态最终记录器Logger=LoggerFactory.getLogger(MockController.class);
@MessageMapping(“点火并忘记”)
公共Mono fireAndForget(MockData MockData){
info(“fireAndForget:{}”,mockData);
返回Mono.empty();
}
}
这是尝试建立连接的TypeScript代码:

client.connect().subscribe({
onComplete:socket=>{
log(“已连接到套接字!”)
socket.fireAndForget({
数据:{someData:“你好,世界!”},
元数据:encodeCompositeMetadata([[MESSAGE_RSOCKET_ROUTING,encodeRoute(“fire and forget”)]]
});
},
onError:error=>console.error(错误),
onSubscribe:cancel=>{/*调用cancel()中止*/}
});
我也尝试过以其他方式添加路由(
metadata:String.fromCharCode('route'.length)+'route'
),但似乎都不起作用

我需要做些什么来格式化路由,使Spring引导服务器能够识别路由并正确路由消息?

二进制文件仅在使用复合元数据时进行通信 请确保已使用二进制编解码器将
ClientTransport
配置为:

新的RSocketWebSocketClient(
{
url:'ws://:'
},
缓冲编码器,
),
使用二进制编码器,您将能够使用复合元数据正确发送路由

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

。。。
const metadataMimeType=MESSAGE\u RSOCKET\u COMPOSITE\u METADATA.string;//message/x.rsocket.composite-metadata.v0
新RSocketClient({
设置:{
...
metadataMimeType,
},
传输:新的RSocketWebSocketClient(
{
url:'ws://:',
},
缓冲编码器,
),
});
注意,一旦您启用了
缓冲编码器
,您的JSONSerializer将无法工作,您需要将JSON编码为二进制(我建议这样做,因为在未来的版本中,我们将完全取消对序列化器概念的支持)。因此,您的请求必须进行调整,如下例所示:

client.connect().subscribe({
onComplete:socket=>{
log(“已连接到套接字!”)
socket.fireAndForget({
data:Buffer.from(JSON.stringify({someData:“Hello world!”})),
元数据:encodeCompositeMetadata([[MESSAGE_RSOCKET_ROUTING,encodeRoute(“fire and forget”)]]
});
},
onError:error=>console.error(错误),
onSubscribe:cancel=>{/*调用cancel()中止*/}
});
在spring后端为您的负载使用@Payload注释 此外,要处理来自客户端的任何数据并让Spring知道指定的参数参数是您的传入请求数据,您必须使用
@Payload
注释对其进行注释:

@控制器
公共类模拟控制器{
私有静态最终记录器Logger=LoggerFactory.getLogger(MockController.class);
@MessageMapping(“点火并忘记”)
公共Mono fireAndForget(@Payload MockData MockData){
info(“fireAndForget:{}”,mockData);
返回Mono.empty();
}
}

我将代码更改为您提供的示例,起初它似乎有效。服务器停止输出有关无法识别路由的错误。现在它只是不输出任何东西。。。服务器映射的配置如Java代码所示。你知道为什么它不会触发fireAndForget()?是因为服务器无法识别复合元数据吗?我猜我可能只是使用消息_RSOCKET _routingmimetype,但是编码路由的代码是什么呢?fireAndForget不会向客户端做出任何响应。尝试
requestResponse
如果您希望返回任何值(我在您的问题中遗漏了什么吗?),也可以尝试rsocket js和spring的工作示例->另外,刚刚注意到,您的输入参数没有注释。请在MockData附近添加
@Payload
注释,这可能是您出现问题的原因。我没有等待服务器的响应。我试图让服务器将接收到的数据记录到控制台,但它没有。我用RSocket CLI尝试了它,但效果很好,这意味着客户端出现了问题。