spring 在Sping Boot 中,是否可以为每个stomp端点使用不同的控制器?

e5nszbig  于 2022-12-17  发布在  Spring
关注(0)|答案(1)|浏览(170)

是否可以为每个stomp端点分配不同的Controller或至少分配不同的MessageMapping?我的目标是让client 1连接到/endpoint 1,client 2连接到/endpoint 2,而client 1不能访问/endpoint 2的任何主题/队列,反之亦然(它们是完全不同的应用程序)。所以它们将是基于它们所连接的端点的完全封装的实现。
能够为每个端点使用不同的JacksonObjectMapper也是加分。
到目前为止,我已经创建了一个具有2个端点(/endpoint 1和/endpoint 2)的WebSocket配置:

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfiguration implements WebSocketMessageBrokerConfigurer {
   @Override
   public void registerStompEndpoints(StompEndpointRegistry registry) {
      registry.addEndpoint("/endpoint1", "/endpoint2")
              .setAllowedOriginPatterns("*")
              .withSockJS();
   }

   // etc...

}

我还有一个控制器,它可以处理请求并将它们发送到相应的用户响应队列,但它可以从两个端点访问:

@Controller
public class WebSocketController {
   @MessageMapping("/request")
   @SendToUser("/queue/response")
   public MyResponse handleMessage(MyRequest request) {
      // implementation
   }
}

**当前行为:**在我当前的实现中,我的客户端连接到哪个端点并不重要,两者都可以访问相同的主题,这是不希望出现的行为。

bq8i3lrv

bq8i3lrv1#

您应该更改应用程序设计,以便客户机只能将消息发送到它们各自的 STOMP 目标。可以使用特定于客户机的前缀方式命名 STOMP 目标,例如:

/endpoint1/request
/endpoint2/request

然后,您应该能够按照上面的命名模式定义不同的带@MessageMapping注解的消息处理程序:

@Controller
public class WebSocketController {

    @MessageMapping("/endpoint1/request")
    @SendToUser("/endpoint1/queue/response")
    public MyResponse handleClient1Message(MyRequest request) {
      // process STOMP message from client 1
    }

    @MessageMapping("/endpoint2/request")
    @SendToUser("/endpoint2/queue/response")
    public MyResponse handleClient2Message(MyRequest request) {
      // process STOMP message from client 2
    }
}

相关问题