我遇到了一个并发问题,我的WebSocket使用了spring-message, 当我的聊天室有很多人时,它会非常慢。
所以我尝试找到方法,并且在使用sendMessage的WebSocketSession所在的类websocketServerSockJsSession中发现了一个同步问题
@Override
public void sendMessageInternal(String message) throws SockJsTransportFailureException {
// Open frame not sent yet?
// If in the session initialization thread, then cache, otherwise wait.
if (!this.openFrameSent) {
synchronized (this.initSessionLock) {
if (!this.openFrameSent) {
this.initSessionCache.add(message);
return;
}
}
}
因此,如果他们在一秒钟内进行200次聊天,那将会非常慢,
我找到了WebSocketSession调用ConcurrentWebSocketSessionDecorator的实现。
但是我无法将WebSocketServerSockJsSession转换为ConcurrentWebSocketSessionDecorator,无法找到设置WebSocketSession的方法。
我无法更改sockJS。
那么如果我使用sockJS并想使用ConcurrentWebSocketSessionDecorator方法怎么办?
是实现ConcurrentWebSocketSessionDecorator sendMessage的另一种方法,还是可以进行一些属性设置并使WebSocketSession转向ConcurrentWebSocketSessionDecorator?
这是我的配置设置
@Configuration
@EnableWebMvc
@EnableWebSocket
public class SpringWebSocketConfig extends WebMvcConfigurerAdapter implements WebSocketConfigurer {
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(webSocketHandler(), "/websocket/send").addInterceptors(new HandshakeInterceptor()).setAllowedOrigins("*");
registry.addHandler(webSocketHandler(), "/websocket/sockjs").addInterceptors(new HandshakeInterceptor()).setAllowedOrigins("*").withSockJS();
}
答案 0 :(得分:0)
顾名思义,ConcurrentWebSocketSessionDecorator
是装饰器。
此装饰器将覆盖sendMessage
中的WebSocketSession
之类的某些功能,并且WebSocketServerSockJSession
通过其webSocketSession
执行其动作,因此将webSocketSession
更改为{{1 }}可以解决问题。
ConcurrentWebSocketSessionDecorator