2014-12-18 2 views
1

안녕하세요 여러분, 다음과 같은 오류가 발생하는 것은 Websocket과 Tomcat8을 사용하고 있습니다.Tomcat websocket and java

java.lang.IllegalStateException: The remote endpoint was in state [TEXT_FULL_WRITING] which is an invalid state for called method 
    at org.apache.tomcat.websocket.WsRemoteEndpointImplBase$StateMachine.checkState(WsRemoteEndpointImplBase.java:1092) 
    at org.apache.tomcat.websocket.WsRemoteEndpointImplBase$StateMachine.textStart(WsRemoteEndpointImplBase.java:1055) 
    at org.apache.tomcat.websocket.WsRemoteEndpointImplBase.sendString(WsRemoteEndpointImplBase.java:186) 
    at org.apache.tomcat.websocket.WsRemoteEndpointBasic.sendText(WsRemoteEndpointBasic.java:37) 
    at com.iri.monitor.webSocket.IRIMonitorSocketServlet.broadcastData(IRIMonitorSocketServlet.java:369) 
    at com.iri.monitor.webSocket.IRIMonitorSocketServlet.access$0(IRIMonitorSocketServlet.java:356) 
    at com.iri.monitor.webSocket.IRIMonitorSocketServlet$5.run(IRIMonitorSocketServlet.java:279) 
+0

그렇다면 엔지니어라고하는 연구를 수행합니다.이 경우에는 Google에 해당 오류를 복사/붙여 넣기로 시작합니다. 당연히 검색 결과 목록은 비어 있지 않으며 다음과 같은 기존 스택 오버 플로우 관련 질문을 포함합니다. http://stackoverflow.com/questions/22257079/java-websockets-the-remote-endpoint-was-in-state-text -full-writing – Gimby

+1

이전 메시지의 전송이 완료되지 않은 상태에서 websocket에 쓰려고합니다. 따라서 예외가 발생합니다. – jgr208

+0

이 버그 리포트에 언급 된 바람둥이 행동처럼 보입니다 : https://bz.apache.org/bugzilla/show_bug.cgi?id=56026 – kaptan

답변

3

준비 상태가 아닌 웹 소켓에 쓰려고합니다. websocket은 현재 쓰기 모드에 있으며 오류를 발생시키는 websocket에 다른 메시지를 쓰려고합니다. async 글을 쓰거나 좋은 연습을하지 않으면 sleep이 발생하는 것을 막을 수 있습니다. 이 오류는 일반적으로 websocket 프로그램이 스레드로부터 안전하지 않을 때 발생합니다.

+2

'async'가 수정하지 않을 것이라고 생각합니다. 다음은이 버그 보고서에서 언급 한 바람둥이 행동입니다. https://bz.apache.org/bugzilla/show_bug.cgi?id=56026 – kaptan

0

비동기 또는 절전 모드가 도움이되지 않습니다.

중요한 문제는 send-method를 동시에 호출 할 수 없다는 것입니다.

그래서 이것은 단지 동시성에 관한 것이므로 자물쇠 또는 다른 것을 사용할 수 있습니다. 내가 어떻게 처리하는지 여기에있다.

사실 저는 socketSession을 래핑 할 액터를 작성합니다. send-method가 호출되면 이벤트를 생성합니다. 각 액터는 작업 스레드와 이벤트 대기열을 포함하는 루퍼에 등록됩니다. 한편 작업 스레드는 메시지를 계속 보냅니다.

그래서 sync-send 메서드를 내부에서 사용할 것이고, 액터 모델은 동시성을 확인합니다.

이제 주요 문제는 루퍼 수에 관한 것입니다. 알다시피, 당신은 너무 많거나 적게 쓰레드를 만들 수는 없습니다. 그러나 비즈니스 사례별로 여전히 수치를 추측 할 수 있으며 계속 조정할 수 있습니다.