gpt4 book ai didi

java - 使用 Spring 的 STOMP 上的 RPC,并正确处理传播到客户端的服务器端错误

转载 作者:IT老高 更新时间:2023-10-28 13:47:36 25 4
gpt4 key购买 nike

我需要通过 STOMP 实现 RPC,其中客户端在浏览器中使用 javascript 运行,而服务器端使用 Spring 消息传递功能实现。

虽然使用@MessageMapping 对于普通消息传递来说很好,但我发现使用@SendToUser 对实现 RPC 有很大的限制,因为客户端很难理解在多个同时请求来自的场景中哪个回复与哪个请求相关联客户。

当然,只发出一个请求,并且客户端等待其回复时没有问题,但是当客户端必须跟踪多个“打开”的 rpc 调用时,就会出现问题。

通过将 ID 与每个请求相关联,我已经设法使系统基本正常,即:客户端与消息一起发送一个 ID,服务器回复一个包含此 ID 的特殊消息包装器,因此客户端能够将异步回复与请求相关联。

这很好用,但有几个限制:

  • 我必须开发需要理解这种结构的代码,并且不具备简单的带注释方法的功能

  • 当服务器端代码生成异常时,会调用 Spring @MessageExceptionHandler 并将正确的异常返回给客户端,但请求 id 会丢失,因为处理程序无法(简单)访问它。

我知道,使用rabbitmq,我们可以将“reply-to” header 添加到需要与特殊回复(rpc 响应)关联的每个请求中,这是通过创建用户自动创建的特殊临时队列来实现的订阅了,但是我如何在 Spring 中使用这个方案?另外,这会为我绑定(bind)一个特定的经纪人。

如何在 Spring 中优雅地实现正确处理服务器端异常的正确 RPC 调用?

我发现这是一个普遍的问题,我认为 Spring 在 native 实现它会受益匪浅。

最佳答案

这并不完全符合您的要求,但也许您可以尝试这样的事情: Path variables in Spring WebSockets @SendTo mapping

您在客户端上定义一个 ID 并将 id 发送到队列/user/queue/{myid}在服务器端,您将有一个如下所示的类:

@MessageMapping("/user/queue/{myid}")
public void simple(@DestinationVariable String id, Object requestDto) {
simpMessagingTemplate.convertAndSendToUser(userId, "/user/queue/" + id, responseDto);
}

这个解决方案可以和你提到的rabbit mq解决方案使用相同的原理。

希望这会有所帮助。

关于java - 使用 Spring 的 STOMP 上的 RPC,并正确处理传播到客户端的服务器端错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24991275/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com