nullpointerexception - 通过 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();
}
}
解决方案
推荐阅读
- utf-8 - JMeter - JSR223 采样器缺少字符编码
- android - Android App Bundle 引入崩溃,不尊重 screenDensity?
- reactjs - Jest 遇到了意外的令牌,因为尝试导入 Jest 无法解析的文件
- swift - 如何创建具有不同“产品模块名称”和“产品名称”的项目并将其模块导入另一个项目?
- angular - 如何在 Angular 中检索夹层/内部 URL 参数?
- mysql - mysql从5升级到8的问题
- python - gcloud crontab 每次调用两次调用 appengine
- css - 在悬停时将“display:none”更改为“display:block”不起作用
- regex - 如何使用 mksquashfs -regex?
- jupyter-lab - Jupyterlab 将单元格拆分为 2 列