RPC over STOMP使用Spring,并正确处理传播给客户端的服务器端错误

Ale*_*ini 11 java spring rpc stomp spring-websocket

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

虽然使用@MessageMapping对于正常消息传递很好,但我发现使用@SendToUser非常限制实现RPC,因为当客户端发出多个同时请求时,客户端很难理解哪个回复与场景中的哪个请求相关联.

当然只有一个请求就没有问题,并且客户端等待它的回复,但是当客户端必须跟踪多个"开放"rpc调用时会出现问题.

通过将ID与每个请求相关联,我设法使系统变得更好,即:客户端将id与消息一起发送,并且服务器回复包含此id的特殊消息包装器,因此客户端能够将异步回复与请求相关联.

这很好但有几个限制:

  • 我必须开发需要理解这种结构的代码,并且这使得uitlity无法使用简单的带注释的方法

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

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

我怎样才能在Spring中优雅地实现正确的RPC调用,正确处理服务器端异常?

我发现这是一个普遍的问题,我认为Spring可以大大有益于本地实现它.

Ore*_*ron 1

这不完全是您所需要的,但也许您可以尝试这样的事情: Spring WebSockets @SendTo 映射中的 Path 变量

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

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

该解决方案的工作原理与您提到的rabbit mq 解决方案相同。

希望这可以帮助。