Zdalny punkt końcowy WebSocket był w stanie [TEXT_PARTIAL_WRITING]
Używam tomcat 8.0.15, wiosna 4.1.5.
Zaimplementowałem 3 wymagane funkcje do korzystania z WebSocket, jak pokazano poniżej.
Wszystko jest bardzo proste.
private Map<String, WebSocketSession> map_users = new ConcurrentHashMap<>();
private Map<String, String> map_id = new ConcurrentHashMap<>();public void afterConnectionEstablished(WebSocketSession wss) throws Exception {
map_users.put(wss.getId(), wss);
}public void afterConnectionClosed(WebSocketSession wss, CloseStatus cs) throws Exception {
map_users.remove(wss.getId());// remove user
String username = map_id.get(wss.getId());
if (username != null) {
map_id.remove(wss.getId());
map_id.remove(username);
}
}public void handleTextMessage(WebSocketSession wss, TextMessage tm) throws Exception {
String str = tm.getPayload();
String username = ...;// regist user
if (!map_id.get(wss.getId())) {
map_id.put(wss.getId(), username);
map_id.put(username, wss.getId());
} for (WebSocketSession w: map_users.values()) {
w.sendMessage(new TextMessage(wss.getId() + " send to " + w.getId() + ", msg:" + tm.getPayload()));
}
}
Jeden klient wysyła wiadomość, a inni klienci otrzymują wiadomość za pośrednictwem handleTextMessage.
W moim przypadku bez funkcji handleTextMessage program serwera chce wysłać wiadomość tekstową do klientów.
(W tym celu zapisałem identyfikator WebSocketSession i nazwę użytkownika w map_id)
String websocketsesssion_id = map_id.get(username);
WebSocketSession wss = map_users.get(websocketsesssion_id);
wss.sendMessage(new TextMessage(new java.util.Date()));
Powyższy kod działa bardzo dobrze.
Ale kiedy jakiś klient WebSocketSession jest używany i próbuje użyć w tym samym czasie, popełnia błąd.
To znaczy
1. jakiś klient wysyła wiadomość - & > nazwa handleTextMessage - & > klient WebSocketSession używa
2. program serwera chce wysłać wiadomość do tego klienta - & > pobierz WebSocketSession klienta z karty - & > spróbuj wysłać wiadomość przy użyciu tej samej sesji 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)
W rezultacie sesja WebSocketSession zostaje zamknięta, a klient musi ponownie otworzyć nową sesję WebSocketSession.
Więc moje pytanie brzmi:
Czy mogę sprawdzić, czy usługa WebSocketSession jest używana, czy nie?
(poza funkcją handleTextMessage)
Nie znaleziono powiązanych wyników
Zaproszony:
Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się
3 odpowiedzi
Anonimowy użytkownik
Potwierdzenie od:
próbka:
Anonimowy użytkownik
Potwierdzenie od:
To samo z Tomcat 8.5.9. Zobacz stos śledzenia poniżej.
Anonimowy użytkownik
Potwierdzenie od:
TEXT_PARTIAL_READY
sesja WebSocket może już być włączona
State.TEXT_PARTIAL_WRITING
przez inny wątek, jak pokazano w kodzie tutaj
https://www.codota.com/web/ass ... L1182
https://www.codota.com/web/ass ... L1182