【问题标题】:TimeoutException while sending data via WebSocket通过 WebSocket 发送数据时出现 TimeoutException
【发布时间】:2018-05-14 02:45:51
【问题描述】:

我在通过 WebSocket (Tomcat8 JSR-356) 发送数据时遇到java.util.concurrent.TimeoutException。请参阅下面给出的跟踪

java.io.IOException: java.util.concurrent.TimeoutException
    at org.apache.tomcat.websocket.WsRemoteEndpointImplBase.sendPartialString(WsRemoteEndpointImplBase.java:258)
    at org.apache.tomcat.websocket.WsRemoteEndpointImplBase.sendString(WsRemoteEndpointImplBase.java:193)
    at org.apache.tomcat.websocket.WsRemoteEndpointBasic.sendText(WsRemoteEndpointBasic.java:37)

我想知道除了与网络延迟相关的问题之外,是否有任何情况下会出现此异常

注意:我随机遇到这个异常。 Tomcat 版本是 8.0.20

【问题讨论】:

  • 这是在一段时间后发生的吗?我没有使用过Tomcat websocket,但是当服务器/客户端之间存在空闲连接一段时间时,websockets会自动关闭
  • 是的@Han!这将在会话建立后的几分钟内发生。但我不认为这是因为空闲会话。我不断在客户端和服务器之间交换数据,这反过来又不会让 WebSocket 会话空闲。
  • 这是java.util.concurrent.TimeoutException,而不是SocketTimeoutException。这是由java.util.concurrent 包中的某种并发超时问题引起的。它与网络没有任何关系。
  • @EJP 在sendPartialString()方法内,将要传输的数据写入输出缓冲区,然后调用CountDownLatch.await()方法使当前线程等待20秒(这是默认值)超时值)。一旦数据被写入输出缓冲区,CountDownLatch.countDown() 被调用并且当前线程恢复它的操作。否则,一旦锁存器超过超时值,throw new TimeoutException() 显式抛出 TimeoutException
  • 所以我认为这实际上不是并发超时问题。主要问题是将数据写入输出缓冲区需要很长时间。但我不知道原因。任何猜测或@EJP?如果您仍然怀疑这是并发问题,请告诉我如何

标签: java websocket tomcat8 java-websocket jsr356


【解决方案1】:

我遇到了同样的问题,它是由分块发送数据引起的(分块传输编码分块流式传输

在我的例子中是 HTTP Post,修复是在 headers 中发送 content-length。

但可能是接收方没有准备好以块的形式读取数据,因此在等待数据 EOF 时超时。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-15
    • 1970-01-01
    • 2021-06-12
    • 1970-01-01
    • 1970-01-01
    • 2019-10-13
    • 1970-01-01
    • 2020-09-28
    相关资源
    最近更新 更多