【问题标题】:Spring websocket implementationSpring websocket 实现
【发布时间】:2016-05-27 05:09:43
【问题描述】:

我正在创建一个 websocket 服务器,它在一侧与一个 web 服务端点接口,另一个从多个客户端接收 web socket 连接请求。以下是我发现的两种方法:

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

配置器

@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. 配置要订阅的消息代理端点称为 /subscribe

    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();
    }
    

创建 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 服务订阅以避免来自不同客户端的重复请求,并且单个请求可能映射到多个一个订阅请求到外部网络服务。然而,似乎方法 2 会将所有数据请求推送到同一个“/subscribe”端点,并且所有连接的客户端都将接收相同的数据,这不是我想要完成的。消息代理 api 似乎也受到限制,因为它不允许我访问订阅的会话,我可以控制接收数据将发送到哪些会话。我意识到我必须切换到 spring websocket,因为我需要 SockJS 提供的内置浏览器兼容性回退和 Stomp.js 提供的自动心跳功能。

【问题讨论】:

  • 我猜你的问题不完整
  • 抱歉我的帖子被截断了:)

标签: spring-websocket


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-12
    • 1970-01-01
    • 2013-11-28
    相关资源
    最近更新 更多