首页 > 解决方案 > 通过 spring webscoket 发送数据时获得 NUllpointerException

问题描述

从最近两天开始,我面临着这个问题。调试后,我可以看到spring websocket将数据发送到队列但客户端没有收到

我没有收到任何错误,但有时我收到此错误。

线程“clientInboundChannel-23”中的异常 org.springframework.messaging.MessageDeliveryException:无法向 ExecutorSubscribableChannel[clientOutboundChannel] 发送消息;嵌套异常是 java.lang.NullPointerException, failedMessage=GenericMessage [payload=byte[0], headers={simpMessageType=DISCONNECT_ACK, simpDisconnectMessage=GenericMessage [payload=byte[0], headers={simpMessageType=DISCONNECT, stompCommand=DISCONNECT, simpSessionAttributes ={org.springframework.messaging.simp.SimpAttributes.COMPLETED=true},simpUser=com.gn.beans.User@44880668,simpSessionId=egw2xot3}],simpUser=com.gn.beans.User@44880668,simpSessionId=egw2xot3 }] 在 org.springframework.messaging.support.AbstractMessageChannel.send(AbstractMessageChannel.java:127) 在 org.springframework.messaging.support.AbstractMessageChannel。

我的 websocket 设置如下所示。

WebSocketConfig.java

package com.gn.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.simp.config.ChannelRegistration;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.web.socket.config.annotation.AbstractWebSocketMessageBrokerConfigurer;
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
import org.springframework.web.socket.config.annotation.WebSocketTransportRegistration;

import com.gn.interceptors.WebSocketInterceptor;


@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {

    @Override
    public void configureMessageBroker(MessageBrokerRegistry config) {
        config.enableSimpleBroker("/advantageClient","/advantageAll");
        config.setApplicationDestinationPrefixes("/app");
    }

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
         registry.addEndpoint("/websocket").setAllowedOrigins("*");
         registry.addEndpoint("/websocket").setAllowedOrigins("*").withSockJS();
    }


    @Bean
    public WebSocketInterceptor webSocketInterceptor() {
        return new WebSocketInterceptor();
    }

    @Override
    public void configureClientInboundChannel(ChannelRegistration registration) {
        registration.setInterceptors(webSocketInterceptor());
    }

    @Override
    public void configureClientOutboundChannel(ChannelRegistration registration) {
        registration.taskExecutor().corePoolSize(8);
        registration.setInterceptors(webSocketInterceptor());
    }

    @Override
    public void configureWebSocketTransport(WebSocketTransportRegistration registration)
    {
      registration.setSendTimeLimit(15 * 1000)
      .setSendBufferSizeLimit(200 * 1024 * 1024)
      .setMessageSizeLimit(200 * 1024 * 1024);
    }
}

WebSocketUtils.java 向客户端发送数据

import java.util.HashMap;
import java.util.Map;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.messaging.simp.SimpMessagingTemplate;

public class WebSocketUtil {

    private static final Logger logger = LoggerFactory.getLogger("com.gn.utils");

    private static SimpMessagingTemplate template;

      public static void setTemplate(SimpMessagingTemplate tmplt) {
        template = tmplt;
      }


      public static void sendToUser(String message,int userId) {
          logger.info("Send to user with userID id "+userId+" msg is "+message);
          String uId = String.valueOf(userId);
          template.convertAndSendToUser(uId,"/advantageClient/connect/", message);
         // template.convertAndSendToUser(userId+"","/advantageClient/connect/", message);
      }

      public static void sendToAll(String message) {
          logger.info("Send to all with msg is "+message);
          template.convertAndSend("/advantageAll/connect/", message);
      }

}

连接 Websocket 的客户端代码

 connect() {
    const uId = this.homeService.getUserId();
    let ws = new SockJS(environment.apiProtocol + '://' + environment.apiHost + ':' + environment.apiPort + UrlConstantsService.urlConstants.advantageService + UrlConstantsService.urlConstants.websocket);

    this.ws = Stomp.over(ws);
    let that = this;
    this.ws.connect({userId: uId}, function(frame) {
      that.ws.subscribe('/user/advantageClient/connect/', function(msg) {
        that.change.emit(JSON.parse(msg.body));
      });
      that.ws.subscribe('/advantageAll/connect/', function(msg) {
        that.change.emit(JSON.parse(msg.body));
      });
    }, function(error) {
      console.log('error connecting to server', error);
    });
  }

  disconnect() {
    if (this.ws !== null) {
      this.ws.ws.close();
    }
  }

标签: nullpointerexceptionspring-websocket

解决方案


推荐阅读