是否保证在基于临时主题的请求/响应方案中处理请求之前建立响应订阅?

时间:2017-12-29 09:29:37

标签: spring spring-boot websocket activemq stomp

我想在以下部分实现请求/响应模式:

  • 服务器:使用ActiveMQ的Springboot
  • 客户端:在websocket上使用stompjs的JavaScript

我想要像http请求这样的行为。

发送请求,获得相应的响应。

我尝试用临时频道来做这件事 我发送3条消息

步骤如下:

  1. 订阅临时频道

    SUBSCRIBE
    id:mysub
    destination:/temp-queue/example
    
  2. 发送请求并在步骤1

    的订阅频道中添加回复标头
    destination:/queue/PO.REQUEST
    reply-to:/temp-queue/example
    
  3. 从服务器获取响应消息

    MESSAGE
    subscription:foo
    reply-to:/queue/temp.default.23.example
    destination:/queue/PO.REQUEST
    reply-to:/temp-queue/example
    
  4. 但是现在(因为客户端发送消息异步)我不确定服务器上的步骤1是否已完成,因此服务器准备好在步骤2的请求到达服务器时将响应发送到队列。

    服务器是否有可能在完成步骤1之前完成步骤2,因此将响应发送到哪里?或者ActiveMQ是否确保以正确的顺序处理和完成从客户端收到的消息1和2?

    消息1和2之间的任何竞争条件都可以发生吗?

    非常感谢!

1 个答案:

答案 0 :(得分:0)

您的客户端发送的任何STOMP帧都可以与收据请求一起发送,该请求使该帧的处理同步。因此,如果您想在发送之前确保订阅已完成,请在订阅框架上附加receipt-id并等待spec mandated RECEIPT框架,然后再继续执行发送,这可确保您的订阅是在任何其他处理之前设置的。