Java-WebSockets: Die remote-Endpunkt war im Zustand [TEXT_FULL_WRITING]
Ich versuche zu implementieren ist eine Anwendung basierend auf websockets die Kommunikation mit JS Kunden sehr intensiv.
Den code um die Nachricht zu senden ist ziemlich primitiv:
synchronized (session) {
if (session.isOpen()) {
session.getBasicRemote().sendText(message);
}
}
Für seltene senden funktioniert es ganz gut, aber wenn paar threads zu senden versuchen, einige Nachrichten von der gleichen session (Buchse), weiter Ausnahme geworfen wird (bitte beachten Sie, dass es ist nicht multithreading-Problem, weil code-block synchronisiert Sitzung):
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:1015)
at org.apache.tomcat.websocket.WsRemoteEndpointImplBase$StateMachine.textStart(WsRemoteEndpointImplBase.java:978)
at org.apache.tomcat.websocket.WsRemoteEndpointImplBase.sendString(WsRemoteEndpointImplBase.java:161)
at org.apache.tomcat.websocket.WsRemoteEndpointBasic.sendText(WsRemoteEndpointBasic.java:37)
Google ist nicht Reich an solchen Typ der Ausnahmen, die in dem moment, und nach dem schlagen einige Stunden auf dieses Problem noch keine Lösung.
Java 7.0.21, getestet auf Tomcat 7.0.52 und Tomcat 8.0.3.
Jede Antwort wird sehr geschätzt!
Vielen Dank im Voraus.
UPDATE 3/11/2014: getestet habe ich meine Anwendung mit Jetty 9.1 und diese Ausnahme nicht auftreten.
Ich gehe davon aus, dass dies Tomcat Umsetzung bug.
- Wie das aussieht, das ist tomcat Verhalten, wie erwähnt, in diesem bug report: bz.apache.org/bugzilla/show_bug.cgi?id=56026
Du musst angemeldet sein, um einen Kommentar abzugeben.
OK, das ist nicht ein Tomcat Problem ist aber meine Schuld.
Meine onMessage-Funktion zurückgegeben wird ein string, was bedeutet, dass ich hallte die Nachricht zurück. Als Ergebnis, diejenigen, die Teil des Codes wurde nicht synchronisiert.
Schlecht:
Gut:
Fand ich dies: https://bz.apache.org/bugzilla/show_bug.cgi?id=56026
scheint tomcat getan hat, etwas unerwartetes, als workaround, müssen Sie synchronisieren alle-Sitzung.sendxxx Anrufe, egal ob es async.