【发布时间】: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