WebSocketClient无法接收大小超过16k字节的消息。抛出ConnectionLostException

时间:2017-12-12 14:03:18

标签: java spring spring-boot websocket stomp

我在java中有一个websocket-stomp客户端应用程序。它按预期工作,但是当我发送大约16k字节或更大的消息时。它正在抛出ConnectionLostException。我查了一下javascript客户端。在javascript中,客户端以大约16k字节的块发送和接收数据,即使大小增加到100k字节也能正常工作。我在stomp文档中检查了大小限制,默认情况下为~65kb。这种情况的原因是什么,因为手动分块数据是一项复杂的任务,需要时间。任何意见,将不胜感激。

堆栈跟踪

org.springframework.messaging.simp.stomp.ConnectionLostException: Connection closed
11:48:31.001 [WebSocketClient-AsyncIO-1] ERROR com.demo.webSocket.lib.usage.ExampleClientLib - Connection Closed
    at org.springframework.messaging.simp.stomp.DefaultStompSession.afterConnectionClosed(DefaultStompSession.java:487)
    at org.springframework.web.socket.messaging.WebSocketStompClient$WebSocketTcpConnectionHandlerAdapter.afterConnectionClosed(WebSocketStompClient.java:354)
    at org.springframework.web.socket.adapter.standard.StandardWebSocketHandlerAdapter.onClose(StandardWebSocketHandlerAdapter.java:141)
    at org.apache.tomcat.websocket.WsSession.fireEndpointOnClose(WsSession.java:535)
    at org.apache.tomcat.websocket.WsSession.onClose(WsSession.java:513)
    at org.apache.tomcat.websocket.WsFrameBase.processDataControl(WsFrameBase.java:341)
    at org.apache.tomcat.websocket.WsFrameBase.processData(WsFrameBase.java:283)
    at org.apache.tomcat.websocket.WsFrameBase.processInputBuffer(WsFrameBase.java:127)
    at org.apache.tomcat.websocket.WsFrameClient.processSocketRead(WsFrameClient.java:78)
    at org.apache.tomcat.websocket.WsFrameClient.access$300(WsFrameClient.java:31)
    at org.apache.tomcat.websocket.WsFrameClient$WsFrameClientCompletionHandler.completed(WsFrameClient.java:133)
    at org.apache.tomcat.websocket.WsFrameClient$WsFrameClientCompletionHandler.completed(WsFrameClient.java:117)
    at sun.nio.ch.Invoker.invokeUnchecked(Invoker.java:126)
    at sun.nio.ch.Invoker$2.run(Invoker.java:218)
    at sun.nio.ch.AsynchronousChannelGroupImpl$1.run(AsynchronousChannelGroupImpl.java:112)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)

1 个答案:

答案 0 :(得分:-1)

首先,您能否在客户端提供ConnectionLostException例外的堆栈跟踪?

其次,我认为下载Spring Framework source并将其链接到您拥有的Spring Framework二进制文件可能会有所帮助,以便您可以通过将IDE设置为调试并查看代码正在死亡的具体位置和原因。停在org.springframework.messaging.simp.stomp.ConnectionLostException上或在StompSession.send()方法上设置断点并逐步完成。

错误可能在Tomcat或Stomp中,可能是其中一个或另一个无法处理异步或部分消息传递。

还要看看这些其他问题,因为它们似乎与你的有关:

特别是第一个链接的答案:

  

...内部spring java websocket stomp客户端不具备部分消息传递功能,也不能使用消息缓冲区的大小进行配置。

尝试的另一件事可能是使用Glassfish而不是Tomcat来运行它。