java 1.7
tomcat 8
websockt
위와 같이 사용중 에러 발생
java.io.IOException: java.util.concurrent.TimeoutException: Operation timed out after waiting [20,000] [milliseconds] to complete
at org.apache.tomcat.websocket.WsRemoteEndpointImplBase.sendPartialString(WsRemoteEndpointImplBase.java:263)
at org.apache.tomcat.websocket.WsRemoteEndpointImplBase.sendString(WsRemoteEndpointImplBase.java:195)
at org.apache.tomcat.websocket.WsRemoteEndpointBasic.sendText(WsRemoteEndpointBasic.java:37)
at com.community.Common.independentAllMessageOnlyShow(Common.java:482)
at com.community.GtrcBroadcastServerPush.sendMessage(GtrcBroadcastServerPush.java:294)
at com.community.GtrcBroadcastServerPush.run(GtrcBroadcastServerPush.java:158)
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.sendPartialString(WsRemoteEndpointImplBase.java:256)
... 6 more
tomcat의 차단은 20 초 동안 기다렸고 시스템은 계속해서 밀어 넣을 수 없습니다.
그래서 나는 TOMCAT 소스 코드를 추적했고 그것이 tomcat websocket의 구성 문제라는 것을 발견했습니다.
Tomcat 공식 웹 사이트에서 다음과 같은 설명을 제공합니다.
JSR-356 Java WebSocket 1.1 구현은 Tomcat이 Java 7 이상에서 실행되는 경우에만 사용할 수 있습니다.
Tomcat은 WebSocket에 대한 여러 Tomcat 특정 구성 옵션을 제공합니다.
이들은 시간이 지남에 따라 WebSocket 사양에 흡수 될 것으로 예상됩니다.
차단 모드에서 WebSocket 메시지를 보낼 때 사용되는 쓰기 제한 시간은 기본적으로 20000 밀리 초 (20 초)입니다.
org.apache.tomcat.websocket.BLOCKING_SEND_TIMEOUT WebSocket 세션에 연결된 사용자 속성 컬렉션 의 속성을 설정하여 변경할 수 있습니다.
이 속성에 할당 된 값은 a 여야하며 Long밀리 초 단위로 사용할 제한 시간을 나타냅니다. 제한 시간이 무제한 인 경우 -1.
웹 소켓 클래스의 @OnOpen 메소드에 다음 코드를 추가합니다. 다음 시간은 Long 유형이어야합니다. 그렇지 않으면 위 코드가 판단되지 않습니다.
session.getUserProperties().put( "org.apache.tomcat.websocket.BLOCKING_SEND_TIMEOUT",1000L);
@OnOpen
public void start(Session session) {
session.getUserProperties().put( "org.apache.tomcat.websocket.BLOCKING_SEND_TIMEOUT",1000L);
this.session = session;
connections.add(this);
String message = String.format("* %s %s", nickname, "has joined.");
broadcast(message);
}