在 apache tomcat 中向 Web 套接字写入字节时写入超时

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

我有 Java Web 套接字 Web 应用程序。 Websocket 端点与移动客户端交互。在其中一种用例中,Web 应用程序需要将 10MB 或更多大小的字节写入 Web 套接字输出流。以下是写入输出流的代码:

     if (webSocSession.isOpen()) {
          webSocSession.getBasicRemote().sendBinary(byteBuffer);
          byteBuffer.clear();
        } 

写入网络套接字时,有时会遇到以下异常:

IOException writing to web-socket
java.io.IOException: java.net.SocketTimeoutException: Write timeout
at org.apache.tomcat.websocket.WsRemoteEndpointImplBase.sendMessageBlock(WsRemoteEndpointImplBase.java:324)
at org.apache.tomcat.websocket.WsRemoteEndpointImplBase.sendMessageBlock(WsRemoteEndpointImplBase.java:259)
at org.apache.tomcat.websocket.WsRemoteEndpointImplBase.sendBytes(WsRemoteEndpointImplBase.java:131)
at org.apache.tomcat.websocket.WsRemoteEndpointBasic.sendBinary(WsRemoteEndpointBasic.java:43)
at test.web.websocket.LIMSEndpoint$SocketWorker.writeToWebSocket(LIMSEndpoint.java:1188)
at test.web.websocket.LIMSEndpoint$SocketWorker.run(LIMSEndpoint.java:1127)
Caused by: java.net.SocketTimeoutException: Write timeout
at org.apache.tomcat.util.net.SocketWrapperBase.vectoredOperation(SocketWrapperBase.java:1458)
at org.apache.tomcat.util.net.SocketWrapperBase.write(SocketWrapperBase.java:1376)
at org.apache.tomcat.util.net.SocketWrapperBase.write(SocketWrapperBase.java:1347)
at org.apache.tomcat.websocket.server.WsRemoteEndpointImplServer.doWrite(WsRemoteEndpointImplServer.java:93)
at org.apache.tomcat.websocket.WsRemoteEndpointImplBase.writeMessagePart(WsRemoteEndpointImplBase.java:509)
at org.apache.tomcat.websocket.WsRemoteEndpointImplBase.sendMessageBlock(WsRemoteEndpointImplBase.java:311)

我尝试将以下 SEND 超时属性设置为 0(无限写入超时),但没有帮助。以下 Apache Tomcat 文档提供了帮助 - https://tomcat.apache.org/tomcat-8.5-doc/web-socket-howto.html

org.apache.tomcat.websocket.BLOCKING_SEND_TIMEOUT

Web 套接字会话最大空闲超时已设置为 0(不超时)

Session.setMaxIdleTimeout(0) 

这方面的任何帮助都会有很大帮助。

java tomcat websocket java-websocket
2个回答
0
投票

我怀疑客户端接收缓冲区已满并且它切断了连接。我知道当客户端将大量数据发送到 apache 服务器并且该服务器未配置为具有扩展二进制缓冲区时,这种情况会以相反的方式发生。请参阅:org.apache.tomcat.websocket.binaryBufferSize

也许您可以通过以较小的块发送数据来解决这个问题,sendBytes 有一个部分版本。

https://tomcat.apache.org/tomcat-10.0-doc/websocketapi/index.html?jakarta/websocket/Session.html


0
投票

看到这个类似的SO问题:How can you set org.apache.tomcat.websocket.BLOCKING_SEND_TIMEOUT? - 设置/覆盖

org.apache.tomcat.websocket.BLOCKING_SEND_TIMEOUT
必须以非常具体的方式完成才能被接受。

此外,当您发送大消息时,您可能还需要覆盖

WebSocketTransportRegistration
上的以下属性:

        registration.setSendBufferSizeLimit(10 * 1024 * 1024);
        registration.setSendTimeLimit(120_000);
© www.soinside.com 2019 - 2024. All rights reserved.