使用SpringFramework发布STOMP消息时,偶尔会出现NullPointerException。

问题描述 投票:0回答:1

我在使用Spring(5.2.0)发布STOMP消息时,偶尔会遇到一些NPE.不幸的是,我不能准确地提供重现的步骤,但我希望得到一些关于如何发生这种情况的见解。

我查看了源码,我唯一能想到的是通道为空。我希望得到一个确认和可能的原因,或者一个替代的解释。

客户端没有断开连接,但似乎这个错误会导致客户端断开连接,因为它收到了1002代码。

附上的是堆栈跟踪。任何帮助或见解将非常感激。谢谢!我正在遇到一些偶尔出现的NPC错误。

org.springframework.messaging.MessageDeliveryException: Failed to send message to ExecutorSubscribableChannel[clientInboundChannel]; nested exception is java.lang.NullPointerException
    at org.springframework.messaging.support.AbstractMessageChannel.send(AbstractMessageChannel.java:146)
    at org.springframework.messaging.support.AbstractMessageChannel.send(AbstractMessageChannel.java:122)
    at org.springframework.web.socket.messaging.StompSubProtocolHandler.handleMessageFromClient(StompSubProtocolHandler.java:302)
    at org.springframework.web.socket.messaging.SubProtocolWebSocketHandler.handleMessage(SubProtocolWebSocketHandler.java:335)
    at org.springframework.web.socket.handler.WebSocketHandlerDecorator.handleMessage(WebSocketHandlerDecorator.java:75)
    at org.springframework.web.socket.handler.LoggingWebSocketHandlerDecorator.handleMessage(LoggingWebSocketHandlerDecorator.java:56)
    at org.springframework.web.socket.handler.ExceptionWebSocketHandlerDecorator.handleMessage(ExceptionWebSocketHandlerDecorator.java:58)
    at org.springframework.web.socket.adapter.standard.StandardWebSocketHandlerAdapter.handleTextMessage(StandardWebSocketHandlerAdapter.java:114)
    at org.springframework.web.socket.adapter.standard.StandardWebSocketHandlerAdapter.access$000(StandardWebSocketHandlerAdapter.java:43)
    at org.springframework.web.socket.adapter.standard.StandardWebSocketHandlerAdapter$3.onMessage(StandardWebSocketHandlerAdapter.java:85)
    at org.springframework.web.socket.adapter.standard.StandardWebSocketHandlerAdapter$3.onMessage(StandardWebSocketHandlerAdapter.java:82)
    at org.apache.tomcat.websocket.WsFrameBase.sendMessageText(WsFrameBase.java:395)
    at org.apache.tomcat.websocket.server.WsFrameServer.sendMessageText(WsFrameServer.java:119)
    at org.apache.tomcat.websocket.WsFrameBase.processDataText(WsFrameBase.java:495)
    at org.apache.tomcat.websocket.WsFrameBase.processData(WsFrameBase.java:294)
    at org.apache.tomcat.websocket.WsFrameBase.processInputBuffer(WsFrameBase.java:133)
    at org.apache.tomcat.websocket.server.WsFrameServer.onDataAvailable(WsFrameServer.java:82)
    at org.apache.tomcat.websocket.server.WsFrameServer.doOnDataAvailable(WsFrameServer.java:171)
    at org.apache.tomcat.websocket.server.WsFrameServer.notifyDataAvailable(WsFrameServer.java:151)
    at org.apache.tomcat.websocket.server.WsHttpUpgradeHandler.upgradeDispatch(WsHttpUpgradeHandler.java:148)
    at org.apache.coyote.http11.upgrade.UpgradeProcessorInternal.dispatch(UpgradeProcessorInternal.java:54)
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:53)
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:861)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1579)
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.NullPointerException: null
    at org.springframework.messaging.support.AbstractMessageChannel$ChannelInterceptorChain.applyPreSend(AbstractMessageChannel.java:178)
    at org.springframework.messaging.support.AbstractMessageChannel.send(AbstractMessageChannel.java:132)
    ... 28 common frames omitted```
spring-boot stomp spring-websocket java-websocket spring-messaging
1个回答
1
投票

与这个问题无关;但你应该试着跟上维护版本;当前的5.2.x版本是5.2.6。

NPE意味着你以某种方式结束了与 null 中的拦截器列表。

抽象通道中的第178行正在调用列表中的每个拦截器。

https:/github.comspring-projectsspring-frameworkblob927b8c15ef20eaaa4002d4b2170cc536a6d6aa35spring-messagingsrcmainjavaorgspringframeworkmessagingsupportAbstractMessageChannel.java#L178。

我想你能在那里获得NPE的唯一方法是你已经(或某些东西)添加了 null 到名单上。

for (ChannelInterceptor interceptor : interceptors) {
    Message<?> resolvedMessage = interceptor.preSend(messageToUse, channel); // line 178
    if (resolvedMessage == null) {
        ...
© www.soinside.com 2019 - 2024. All rights reserved.