java.io.IOException: java.util.concurrent.TimeoutException: Operation timed out after waiting [20,000] [milliseconds] to complete
at org.apache.tomcat.websocket.WsRemoteEndpointImplBase.handleSendFailureWithEncode(WsRemoteEndpointImplBase.java:558)
at org.apache.tomcat.websocket.WsRemoteEndpointImplBase.handleSendFailure(WsRemoteEndpointImplBase.java:533)
at org.apache.tomcat.websocket.WsRemoteEndpointImplBase.startMessageBlock(WsRemoteEndpointImplBase.java:285)
at org.apache.tomcat.websocket.WsSession.sendCloseMessage(WsSession.java:600)
at org.apache.tomcat.websocket.WsSession.doClose(WsSession.java:490)
at org.apache.tomcat.websocket.server.WsHttpUpgradeHandler.onError(WsHttpUpgradeHandler.java:149)
at org.apache.tomcat.websocket.server.WsHttpUpgradeHandler.access$300(WsHttpUpgradeHandler.java:47)
at org.apache.tomcat.websocket.server.WsHttpUpgradeHandler$WsReadListener.onError(WsHttpUpgradeHandler.java:206)
at org.apache.tomcat.websocket.server.WsHttpUpgradeHandler$WsReadListener.onDataAvailable(WsHttpUpgradeHandler.java:189)
at org.apache.coyote.http11.upgrade.AbstractServletInputStream.onDataAvailable(AbstractServletInputStream.java:198)
at org.apache.coyote.http11.upgrade.AbstractProcessor.upgradeDispatch(AbstractProcessor.java:96)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:661)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1520)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1476)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.util.concurrent.TimeoutException: Operation timed out after waiting [20,000] [milliseconds] to complete
at org.apache.tomcat.websocket.FutureToSendHandler.get(FutureToSendHandler.java:116)
at org.apache.tomcat.websocket.WsRemoteEndpointImplBase.startMessageBlock(WsRemoteEndpointImplBase.java:278)
... 15 more
tomcat的阻塞等待了20秒导致系统无法继续推送
于是我跟踪TOMCAT源代码后发现是tomcat websocket的配置问题。
tomcat官网给出如下解释
The JSR-356 Java WebSocket 1.1 implementation is only available when Tomcat is running on java7 or later.
Tomcat provides a number of Tomcat specific configuration options for WebSocket. It is anticipated that these will be absorbed into the WebSocket specification over time.
The write timeout used when sending WebSocket messages in blocking mode defaults to 20000 milliseconds (20 seconds). This may be changed by setting the property org.apache.tomcat.websocket.BLOCKING_SEND_TIMEOUT in the user properties collection attached to the WebSocket session. The value assigned to this property should be a Longand represents the timeout to use in milliseconds. For an infinite timeout, use -1.