【发布时间】:2016-05-27 05:09:43
【问题描述】:
我正在创建一个 websocket 服务器,它在一侧与一个 web 服务端点接口,另一个从多个客户端接收 web socket 连接请求。以下是我发现的两种方法:
- 像这样实现 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) {
}
-
配置要订阅的消息代理端点称为 /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