我需要在javascript浏览器客户端上实现RPC over STOMP,并使用Spring消息功能实现服务器端。
对于普通消息使用@MessageMapping很好,但我发现在实现RPC时使用@SendToUser会有限制,因为当客户端同时发出多个请求时,客户端很难理解哪个回复与哪个请求相关。
当只有一个请求被发送并且客户端等待其回复时,当然没有问题,但是当客户端必须跟踪多个“开放的”rpc调用时,问题就会出现。
我成功地通过与每个请求关联的ID来解决了这个问题,例如:客户端将id与消息一起发送,服务器回复一个特殊的消息包装,其中包含此id,因此客户端能够将异步的回复与请求关联起来。
这样做很好,但有几个限制:
我必须编写代码来理解此结构,这样就无法使用简单的注释方法
当服务器端代码生成异常时,Spring @MessageExceptionHandler会被调用,并将正确的异常返回给客户端,但是请求id会丢失,因为处理程序没有(易于)访问它的方式。
我知道使用rabbitmq可以为每个需要与特定回复(rpc响应)关联的请求添加“回复到”头文件,并通过创建一个特殊的临时队列来实现,用户会自动订阅该队列,但我如何在Spring中使用此方案?而且,这将束缚我于特定的代理。
我该如何优雅地在Spring中实现正确处理服务器端异常的RPC调用?
我认为这是一个普遍的问题,我认为Spring可以从本质上实现它。