Sto usando tomcat 8.0.15, primavera 4.1.5.WebSocket L'endpoint remoto era nello stato [TEXT_PARTIAL_WRITING]
Ho implementato 3 funzioni obbligatorie per l'utilizzo di websocket come di seguito. È molto semplice.
Alcuni client inviano un messaggio e altri client ottengono il messaggio tramite handleTextMessage.
Nel mio caso, senza la funzione handleTextMessage, il programma server vuole inviare un messaggio di testo ai client. (per questo ho salvato di un WebSocketSession Id e nome utente in MAP_ID)
String websocketsesssion_id = map_id.get(username);
WebSocketSession wss = map_users.get(websocketsesssion_id);
wss.sendMessage(new TextMessage(new java.util.Date()));
Sopra codice funziona molto bene. Ma quando WebSocketSession di alcuni client è in uso e tenta di usare simultaneamente, commette un errore. Significa 1. un client invia un messaggio -> handleTextMessage viene chiamato -> il client WebSocketSession utilizza 2. il programma del server vuole inviare un messaggio a quel client -> ottenere la WebSocketSession del client dalla mappa -> provare a inviare il messaggio con lo stesso WebSocketSession
Stacktrace:] with root cause
java.lang.IllegalStateException: The remote endpoint was in state [TEXT_PARTIAL_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.textPartialStart(WsRemoteEndpointImplBase.java:1050)
at org.apache.tomcat.websocket.WsRemoteEndpointImplBase.sendPartialString(WsRemoteEndpointImplBase.java:218)
at org.apache.tomcat.websocket.WsRemoteEndpointBasic.sendText(WsRemoteEndpointBasic.java:49)
at org.springframework.web.socket.adapter.standard.StandardWebSocketSession.sendTextMessage(StandardWebSocketSession.java:197)
at org.springframework.web.socket.adapter.AbstractWebSocketSession.sendMessage(AbstractWebSocketSession.java:105)
at org.springframework.web.socket.sockjs.transport.session.WebSocketServerSockJsSession.writeFrameInternal(WebSocketServerSockJsSession.java:222)
at org.springframework.web.socket.sockjs.transport.session.AbstractSockJsSession.writeFrame(AbstractSockJsSession.java:325)
at org.springframework.web.socket.sockjs.transport.session.WebSocketServerSockJsSession.sendMessageInternal(WebSocketServerSockJsSession.java:212)
at org.springframework.web.socket.sockjs.transport.session.AbstractSockJsSession.sendMessage(AbstractSockJsSession.java:161)
Come risultato, WebSocketSession viene chiusa e il client deve aprire di nuovo nuova WebSocketSession.
Quindi, la mia domanda è:
posso verificare se il WebSocketSession è in uso o no? (fuori funzione handleTextMessage)