Spring websocket实现

时间:2016-02-16 04:32:56

标签: spring-websocket

我正在创建一个websocket服务器,它与一侧的Web服务端点接口,另一侧接收来自多个客户端的Web套接字连接请求。我找到了两种方法:

  1. 实现Web套接字配置程序和Web套接字处理程序:
  2. 配置器

    @Configuration
    @EnableWebSocket
    public class TestConfig implements WebSocketConfigurer {
       @Override
       public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
            registry.addHandler(testHandler(), "/testHandler")
               .addInterceptors(new HttpSessionHandshakeInterceptor())
               .withSockJS();
       }
    
       @Bean
       public WebSocketHandler testHandler() {
           return new TestHandler();
       }
    

    处理程序

    public class TestHandler extends TextWebSocketHandler {
       @Override
       public void afterConnectionEstablished(WebSocketSession session) throws Exception {
          //Take request params and check if a current subscription to external webservice exists, if yes then directly add this session to a map cache repository with the subscription id as key
          //If it is a new request then add session to a map cache repository and make new subscription to the external webservice
       }
    
       @Override
       public void handleTextMessage(WebSocketSession session, TextMessage message) {
       }
    
    1. 配置要订阅被叫/订阅

      的消息代理端点
      public class TestWebSocketConfig implement WebSocketMessageBrokerConfigurer {
      
      @Override
      public void addArgumentResolvers(List<HandlerMethodArgumentResolver> arg0) {}
      
      @Override
      public void addReturnValueHandlers(List<HandlerMethodReturnValueHandler> arg0) {}
      
      @Override
      public void configureClientInboundChannel(ChannelRegistration arg0) {
          System.out.println("");
      }
      
      @Override
      public void configureClientOutboundChannel(ChannelRegistration arg0) {
      }
      
      @Override
      public void configureMessageBroker(MessageBrokerRegistry registry) {
      }
      
      @Override
      public boolean configureMessageConverters(List<MessageConverter> arg0) {
         return true;
      }
      
      @Override
      public void configureWebSocketTransport(WebSocketTransportRegistration arg0) {}
      
      @Override
      public void registerStompEndpoints(StompEndpointRegistry registry) {
         registry.addEndpoint("/subscribe").withSockJS();
      }
      
    2. 创建websocket客户端可与之通信的控制器

      @Controller
      public class SubscriptionController {
      @Autowired
      private SimpMessagingTemplate template;
      
      @MessageMapping("/subscribe1")
      @SendTo("/subscribe")
      public void addSubscription(String message) {
          System.out.println("hi");
      }
      

      这是我的问题,我是否误解了我所说的这两种方法应该结合在一起的地方?我正在使用websocket的tomcat实现,之前匹配方法1,这使我可以轻松直接控制会话,因为我希望能够重用Web服务订阅以避免来自不同客户端的重复请求,并且单个请求可能映射到多个一个订阅请求到外部Web服务。然而,似乎方法2会将所有数据请求推送到同一个&#34; / subscribe&#34;端点和所有连接的客户端将接收相同的数据,这不是我想要完成的。消息代理api似乎也是有限的,因为它不允许我访问订阅的会话,我可以控制接收数据将被发送到哪些会话。我意识到我必须切换到spring websocket,因为我需要SockJS提供的内置浏览器兼容性回退和Stomp.js提供的自动心跳功能。

1 个答案:

答案 0 :(得分:1)

我想我找到了答案,方法1和方法2可以并排使用但不能一起使用。当我想实现可以创建多个通道目的地的消息代理时,使用方法2,许多用户可以订阅同一目的地。现在的问题是我如何检查我是否可以定期检查每个现有目的地的订阅数量