0

I am running into some occasional NPE when publishing STOMP messages using Spring (5.2.0). Unfortunately I cannot precisely provide the steps to reproduce but I was hoping to get some insight into how this could happen.

I looked into the source and the only thing I can think of is that the channel is null. I'm hoping to get a confirmation and possible reason for this, or an alternate explanation.

The client did not disconnect but it seems like this error causes the client to disconnect as it receives a 1002 code.

Attached is the stacktrace. Any help or insight would be greatly appreciated. Thanks!

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```
Gary Russell
  • 166,535
  • 14
  • 146
  • 179
Obi-Wan-Clemobi
  • 145
  • 1
  • 13

1 Answers1

1

Not related to this problem; but you should try to keep up with maintenance releases; the current 5.2.x version is 5.2.6.

That NPE implies you have somehow ended up with a null in the interceptor list.

Line 178 in the abstract channel is invoking each interceptor in the list.

https://github.com/spring-projects/spring-framework/blob/927b8c15ef20eaaa4002d4b2170cc536a6d6aa35/spring-messaging/src/main/java/org/springframework/messaging/support/AbstractMessageChannel.java#L178

I think the only way you can get an NPE there is if you have (or something has) added null to the list.

for (ChannelInterceptor interceptor : interceptors) {
    Message<?> resolvedMessage = interceptor.preSend(messageToUse, channel); // line 178
    if (resolvedMessage == null) {
        ...
Gary Russell
  • 166,535
  • 14
  • 146
  • 179
  • Thanks Gary. I've upgrade to the latest. Thanks for clarifying that the interceptor is probably the cause of the NPE. I'm checking to see if I've somehow provided a null value to the interceptor list. Edit: also just wanted to thank you for all the other Spring Messages and Integration answers you provide. – Obi-Wan-Clemobi May 15 '20 at 23:08
  • 1
    I opened [an issue against the framework](https://github.com/spring-projects/spring-framework/issues/25088) to catch `null` interceptors earlier. – Gary Russell May 15 '20 at 23:12
  • Thanks Gary, I was able to identify my problem. Thanks for opening an issue for this. – Obi-Wan-Clemobi May 18 '20 at 17:39