如何使用ConcurrentWebSocketSessionDecorator通过websocket发送消息

时间:2019-06-12 10:24:43

标签: spring-mvc spring-messaging

我遇到了一个并发问题,我的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?

enter image description here

这是我的配置设置

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

1 个答案:

答案 0 :(得分:0)

顾名思义,ConcurrentWebSocketSessionDecorator装饰器

此装饰器将覆盖sendMessage中的WebSocketSession之类的某些功能,并且WebSocketServerSockJSession通过其webSocketSession执行其动作,因此将webSocketSession更改为{{1 }}可以解决问题。

ConcurrentWebSocketSessionDecorator