Error, wenn mehrere Clients gleichzeitig die Verbindung beenden

RezaScript

Bekanntes Mitglied
Hallo,

beim Testen von meinem Chat habe ich festgestellt, dass irgendetwas mit @OnClose schief läuft.

Wenn ich die Verbindung von einem einzigen User beende, klappt alles wunderbar und ich bekomme keine Fehlermeldung aber wenn ich im Browser mehrere Tabs mit verschiedenen Clients offen habe und ich schliesse dann den Browser, bekomme ich diese Fehlermeldung:

15-Jun-2019 19:04:43.823 SCHWERWIEGEND [http-nio-8080-exec-4] org.apache.tomcat.websocket.pojo.PojoEndpointBase.onClose Failed to call onClose method of POJO end point for POJO of type [ch.yourclick.zt.chat.ChatEndpoint]
java.lang.reflect.InvocationTargetException
at sun.reflect.GeneratedMethodAccessor32.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.tomcat.websocket.pojo.PojoEndpointBase.onClose(PojoEndpointBase.java:103)
at org.apache.tomcat.websocket.WsSession.fireEndpointOnClose(WsSession.java:555)
at org.apache.tomcat.websocket.WsSession.onClose(WsSession.java:533)
at org.apache.tomcat.websocket.WsFrameBase.processDataControl(WsFrameBase.java:347)
at org.apache.tomcat.websocket.WsFrameBase.processData(WsFrameBase.java:289)
at org.apache.tomcat.websocket.WsFrameBase.processInputBuffer(WsFrameBase.java:133)
at org.apache.tomcat.websocket.server.WsFrameServer.onDataAvailable(WsFrameServer.java:82)
at org.apache.tomcat.websocket.server.WsFrameServer.doOnDataAvailable(WsFrameServer.java:171)
at org.apache.tomcat.websocket.server.WsFrameServer.notifyDataAvailable(WsFrameServer.java:151)
at org.apache.tomcat.websocket.server.WsHttpUpgradeHandler.upgradeDispatch(WsHttpUpgradeHandler.java:148)
at org.apache.coyote.http11.upgrade.UpgradeProcessorInternal.dispatch(UpgradeProcessorInternal.java:54)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:53)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:836)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1747)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.util.ConcurrentModificationException
at java.util.HashMap$HashIterator.nextNode(HashMap.java:1442)
at java.util.HashMap$KeyIterator.next(HashMap.java:1466)
at ch.yourclick.zt.chat.ChatEndpoint.handleClose(ChatEndpoint.java:90)
... 22 more

java.lang.reflect.InvocationTargetException
at sun.reflect.GeneratedMethodAccessor32.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.tomcat.websocket.pojo.PojoEndpointBase.onClose(PojoEndpointBase.java:103)
at org.apache.tomcat.websocket.WsSession.fireEndpointOnClose(WsSession.java:555)
at org.apache.tomcat.websocket.WsSession.onClose(WsSession.java:533)
at org.apache.tomcat.websocket.WsFrameBase.processDataControl(WsFrameBase.java:347)
at org.apache.tomcat.websocket.WsFrameBase.processData(WsFrameBase.java:289)
at org.apache.tomcat.websocket.WsFrameBase.processInputBuffer(WsFrameBase.java:133)
at org.apache.tomcat.websocket.server.WsFrameServer.onDataAvailable(WsFrameServer.java:82)
at org.apache.tomcat.websocket.server.WsFrameServer.doOnDataAvailable(WsFrameServer.java:171)
at org.apache.tomcat.websocket.server.WsFrameServer.notifyDataAvailable(WsFrameServer.java:151)
at org.apache.tomcat.websocket.server.WsHttpUpgradeHandler.upgradeDispatch(WsHttpUpgradeHandler.java:148)
at org.apache.coyote.http11.upgrade.UpgradeProcessorInternal.dispatch(UpgradeProcessorInternal.java:54)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:53)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:836)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1747)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.util.ConcurrentModificationException
at java.util.HashMap$HashIterator.nextNode(HashMap.java:1442)
at java.util.HashMap$KeyIterator.next(HashMap.java:1466)
at ch.yourclick.zt.chat.ChatEndpoint.handleClose(ChatEndpoint.java:90)
... 22 more
java.io.EOFException
at org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.fillReadBuffer(NioEndpoint.java:1248)
at org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.read(NioEndpoint.java:1183)
at org.apache.tomcat.websocket.server.WsFrameServer.onDataAvailable(WsFrameServer.java:72)
at org.apache.tomcat.websocket.server.WsFrameServer.doOnDataAvailable(WsFrameServer.java:171)
at org.apache.tomcat.websocket.server.WsFrameServer.notifyDataAvailable(WsFrameServer.java:151)
at org.apache.tomcat.websocket.server.WsHttpUpgradeHandler.upgradeDispatch(WsHttpUpgradeHandler.java:148)
at org.apache.coyote.http11.upgrade.UpgradeProcessorInternal.dispatch(UpgradeProcessorInternal.java:54)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:53)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:836)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1747)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:748)
java.io.EOFException
at org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.fillReadBuffer(NioEndpoint.java:1248)
at org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.read(NioEndpoint.java:1183)
at org.apache.tomcat.websocket.server.WsFrameServer.onDataAvailable(WsFrameServer.java:72)
at org.apache.tomcat.websocket.server.WsFrameServer.doOnDataAvailable(WsFrameServer.java:171)
at org.apache.tomcat.websocket.server.WsFrameServer.notifyDataAvailable(WsFrameServer.java:151)
at org.apache.tomcat.websocket.server.WsHttpUpgradeHandler.upgradeDispatch(WsHttpUpgradeHandler.java:148)
at org.apache.coyote.http11.upgrade.UpgradeProcessorInternal.dispatch(UpgradeProcessorInternal.java:54)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:53)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:836)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1747)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:748)
java.io.EOFException
at org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.fillReadBuffer(NioEndpoint.java:1248)
at org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.read(NioEndpoint.java:1183)
at org.apache.tomcat.websocket.server.WsFrameServer.onDataAvailable(WsFrameServer.java:72)
at org.apache.tomcat.websocket.server.WsFrameServer.doOnDataAvailable(WsFrameServer.java:171)
at org.apache.tomcat.websocket.server.WsFrameServer.notifyDataAvailable(WsFrameServer.java:151)
at org.apache.tomcat.websocket.server.WsHttpUpgradeHandler.upgradeDispatch(WsHttpUpgradeHandler.java:148)
at org.apache.coyote.http11.upgrade.UpgradeProcessorInternal.dispatch(UpgradeProcessorInternal.java:54)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:53)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:836)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1747)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:748)
java.io.EOFException
at org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.fillReadBuffer(NioEndpoint.java:1248)
15-Jun-2019 19:04:43.996 SCHWERWIEGEND [http-nio-8080-exec-2] org.apache.tomcat.websocket.pojo.PojoEndpointBase.onClose Failed to call onClose method of POJO end point for POJO of type [ch.yourclick.zt.chat.ChatEndpoint]
java.lang.reflect.InvocationTargetException
at sun.reflect.GeneratedMethodAccessor32.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.tomcat.websocket.pojo.PojoEndpointBase.onClose(PojoEndpointBase.java:103)
at org.apache.tomcat.websocket.WsSession.fireEndpointOnClose(WsSession.java:555)
at org.apache.tomcat.websocket.WsSession.onClose(WsSession.java:533)
at org.apache.tomcat.websocket.server.WsHttpUpgradeHandler.close(WsHttpUpgradeHandler.java:232)
at org.apache.tomcat.websocket.server.WsHttpUpgradeHandler.upgradeDispatch(WsHttpUpgradeHandler.java:155)
at org.apache.coyote.http11.upgrade.UpgradeProcessorInternal.dispatch(UpgradeProcessorInternal.java:54)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:53)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:836)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1747)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.util.ConcurrentModificationException
at java.util.HashMap$HashIterator.nextNode(HashMap.java:1442)
at java.util.HashMap$KeyIterator.next(HashMap.java:1466)
at ch.yourclick.zt.chat.ChatEndpoint.handleClose(ChatEndpoint.java:90)
... 17 more

at org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.read(NioEndpoint.java:1183)
at org.apache.tomcat.websocket.server.WsFrameServer.onDataAvailable(WsFrameServer.java:72)
at org.apache.tomcat.websocket.server.WsFrameServer.doOnDataAvailable(WsFrameServer.java:171)
at org.apache.tomcat.websocket.server.WsFrameServer.notifyDataAvailable(WsFrameServer.java:151)
at org.apache.tomcat.websocket.server.WsHttpUpgradeHandler.upgradeDispatch(WsHttpUpgradeHandler.java:148)
at org.apache.coyote.http11.upgrade.UpgradeProcessorInternal.dispatch(UpgradeProcessorInternal.java:54)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:53)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:836)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1747)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:748)
java.lang.reflect.InvocationTargetException
at sun.reflect.GeneratedMethodAccessor32.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.tomcat.websocket.pojo.PojoEndpointBase.onClose(PojoEndpointBase.java:103)
at org.apache.tomcat.websocket.WsSession.fireEndpointOnClose(WsSession.java:555)
at org.apache.tomcat.websocket.WsSession.onClose(WsSession.java:533)
at org.apache.tomcat.websocket.server.WsHttpUpgradeHandler.close(WsHttpUpgradeHandler.java:232)
at org.apache.tomcat.websocket.server.WsHttpUpgradeHandler.upgradeDispatch(WsHttpUpgradeHandler.java:155)
at org.apache.coyote.http11.upgrade.UpgradeProcessorInternal.dispatch(UpgradeProcessorInternal.java:54)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:53)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:836)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1747)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.util.ConcurrentModificationException
at java.util.HashMap$HashIterator.nextNode(HashMap.java:1442)
at java.util.HashMap$KeyIterator.next(HashMap.java:1466)
at ch.yourclick.zt.chat.ChatEndpoint.handleClose(ChatEndpoint.java:90)
... 17 more
15-Jun-2019 19:04:44.018 SCHWERWIEGEND [http-nio-8080-exec-7] org.apache.tomcat.websocket.pojo.PojoEndpointBase.onClose Failed to call onClose method of POJO end point for POJO of type [ch.yourclick.zt.chat.ChatEndpoint]
java.lang.reflect.InvocationTargetException
at sun.reflect.GeneratedMethodAccessor32.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.tomcat.websocket.pojo.PojoEndpointBase.onClose(PojoEndpointBase.java:103)
at org.apache.tomcat.websocket.WsSession.fireEndpointOnClose(WsSession.java:555)
at org.apache.tomcat.websocket.WsSession.onClose(WsSession.java:533)
at org.apache.tomcat.websocket.server.WsHttpUpgradeHandler.close(WsHttpUpgradeHandler.java:232)
at org.apache.tomcat.websocket.server.WsHttpUpgradeHandler.upgradeDispatch(WsHttpUpgradeHandler.java:155)
at org.apache.coyote.http11.upgrade.UpgradeProcessorInternal.dispatch(UpgradeProcessorInternal.java:54)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:53)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:836)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1747)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.util.ConcurrentModificationException
at java.util.HashMap$HashIterator.nextNode(HashMap.java:1442)
at java.util.HashMap$KeyIterator.next(HashMap.java:1466)
at ch.yourclick.zt.chat.ChatEndpoint.handleClose(ChatEndpoint.java:90)
... 17 more

java.lang.reflect.InvocationTargetException
at sun.reflect.GeneratedMethodAccessor32.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.tomcat.websocket.pojo.PojoEndpointBase.onClose(PojoEndpointBase.java:103)
at org.apache.tomcat.websocket.WsSession.fireEndpointOnClose(WsSession.java:555)
at org.apache.tomcat.websocket.WsSession.onClose(WsSession.java:533)
at org.apache.tomcat.websocket.server.WsHttpUpgradeHandler.close(WsHttpUpgradeHandler.java:232)
at org.apache.tomcat.websocket.server.WsHttpUpgradeHandler.upgradeDispatch(WsHttpUpgradeHandler.java:155)
at org.apache.coyote.http11.upgrade.UpgradeProcessorInternal.dispatch(UpgradeProcessorInternal.java:54)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:53)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:836)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1747)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.util.ConcurrentModificationException
at java.util.HashMap$HashIterator.nextNode(HashMap.java:1442)
at java.util.HashMap$KeyIterator.next(HashMap.java:1466)
at ch.yourclick.zt.chat.ChatEndpoint.handleClose(ChatEndpoint.java:90)
... 17 more

Java:
@OnClose
public void handleClose(Session userSession) throws IOException {
    users.remove(userSession);
    // Post the message
    for (Session user : users) {
        postMessage();

        Data data = new Data("quit", currentTime, (String) userSession.getUserProperties().get("username"), "null", "null", new ArrayList<>(), new ArrayList<>(), "null");
        if (!Objects.requireNonNull(Database.getData("SELECT * FROM users WHERE username = '" + userSession.getUserProperties().get("username") + "'", this.user)).isEmpty()) {
            data = new Data("quit", this.currentTime, (String) userSession.getUserProperties().get("username"), "null", "true", new ArrayList<>(), new ArrayList<>(), "null");
        }
        user.getBasicRemote().sendText(gson.toJson(data));
    }
}

ChatEndpoint.java:90 bezieht sich auf die Zeile 5.

Was mache ich da falsch?
 

mihe7

Top Contributor
Willkommen in der Welt des Multi-Threadings. Dein Endpoint wird von mehreren Threads verwendet. Du hast eine statische Variable users und über diese iterierst Du, während ein anderer Thread einen User entfernt. Das mag der Iterator gar nicht.

Mach mal ein synchronized(users) um den Programmblock. Wenn die Zahl der Sessions nicht allzu groß ist, sollte das performance-technisch hinhauen.

Java:
public void handleClose(Session userSession) throws IOException {
    synchronized(users) {
        users.remove(userSession);
        // Post the message
        for (Session user : users) {
            postMessage();

            Data data = new Data("quit", currentTime, (String) userSession.getUserProperties().get("username"), "null", "null", new ArrayList<>(), new ArrayList<>(), "null");
            if (!Objects.requireNonNull(Database.getData("SELECT * FROM users WHERE username = '" + userSession.getUserProperties().get("username") + "'", this.user)).isEmpty()) {
                data = new Data("quit", this.currentTime, (String) userSession.getUserProperties().get("username"), "null", "true", new ArrayList<>(), new ArrayList<>(), "null");
            }
            user.getBasicRemote().sendText(gson.toJson(data));
        }
    }
}
 
X

Xyz1

Gast
Kann er nicht just auf Methodenebene synchronisieren? Über users ist es nicht kürzer und ich vermute - "handleOpen" befindet sich auch in dieser Klasse. :)
 

RezaScript

Bekanntes Mitglied
Danke für die Antwort, @mihe7! synchronized() gefällt mir und ich habe wieder mal etwas neues gelernt. :)

synchronized (users) hat bei mir nicht funktioniert, da users nicht final war aber das habe ich jetzt geändert.

Ich bekomme jetzt aber eine neue Fehlermeldung und zwar:
Caused by: java.lang.IllegalStateException: Message will not be sent because the WebSocket session has been closed
Warum? Da ich users.remove(userSession); verwende, sende ich die Nachricht ja nicht an dem User, der die Verbindung beendet hat?!
 

mihe7

Top Contributor
Willkommen in der Welt der asynchronen Kommunikation :)

Mit dem synchronized wird verhindert, dass mehrere Threads gleichzeitig den Block betreten. D. h. so lange sich ein Thread im Block befindet, müssen die anderen warten. Das ist notwendig, damit das Set nicht von mehreren Threads gleichzeitig verändert wird und man in Ruhe darüber iterieren kann (es gäbe hier noch eine andere Möglichkeit: session.getOpenSessions() liefert eine Kopie aller zum Zeitpunkt des Aufrufs offenen Sessions. Darüber ließe sich iterieren, egal was mit users passiert. Trotzdem muss users.remove() irgendwie synchronisiert werden)

Bis dahin ging es um eine "interne Angelegenheit" (Threads). Jetzt kommen wir zu einer externen.

Der Client schließt die Verbindung und Deine Methode wird als Benachrichtigung darüber aufgerufen. Deine Methode klappert nun eine Session nach der anderen ab. In der Zwischenzeit können aber weitere Verbindungen geschlossen worden sein. Selbst, wenn Deine Methode von einem zweiten Thread in der Kürze der Zeit noch aufgerufen werden würde, müsste dieser Thread warten (synchronized).

Es kann also passieren, dass während Du über die Sessions iterierst, Du auf eine Session triffst, deren Verbindung bereits geschlossen wurde. Deshalb solltest Du unmittelbar vor dem Versenden von Nachrichten über eine Session prüfen, ob die Verbindung noch steht (session.isOpen()). Damit lassen sich derlei Exceptions minimieren.

Ganz verhindern lassen sich derlei Exceptions aber nie, denn den Stecker ziehen kann der Client immer, auch während Du überträgst.
 
X

Xyz1

Gast
Nein, für jeden Nutzer wird eine eigene Instanz der Klasse erstellt, da würde ein synchronisieren auf this nichts bringen.
Ja stimmt. Wusste nicht, dass es mehrere Viecher davon gibt...

Hier ist ein Beispiel dazu:
Java:
public class Syn {
    static final Object o = new Object();

    static volatile int i = 0;

    synchronized void add() {
        i++;
        i++;
        i++;
    }

    void add2() {
        synchronized (o) {
            i++;
            i++;
            i++;
        }
    }

    public static void main(String[] args) throws InterruptedException {
        Syn a = new Syn();
        Syn b = new Syn();
        Syn c = new Syn();
        new Thread(() -> {
            for (int j = 0; j < 10000; j++) {
                a.add();
            }
        }).start();
        new Thread(() -> {
            for (int j = 0; j < 10000; j++) {
                b.add();
            }
        }).start();
        new Thread(() -> {
            for (int j = 0; j < 10000; j++) {
                c.add();
            }
        }).start();
        Thread.sleep(5000);
        System.out.println("i " + i); //90_000, but 54321
    }
}

(add2 funktioniert/ mit Object wäre das kein Problem...)
 

RezaScript

Bekanntes Mitglied
Danke für die Information, @mihe7, damit kann ich schon mal etwas anfangen.

Mein Code sieht momentan so aus:

Java:
@OnClose
public void handleClose(Session userSession) throws IOException {
    synchronized (users) {
        users.remove(userSession);
        // Post the message
        for (Session user : users) {
            if (user.isOpen()) {
                postMessage();

                Data data = new Data("quit", currentTime, (String) userSession.getUserProperties().get("username"), "null", "null", new ArrayList<>(), new ArrayList<>(), "null");
                if (!Objects.requireNonNull(Database.getData("SELECT * FROM users WHERE username = '" + userSession.getUserProperties().get("username") + "'", this.user)).isEmpty()) {
                    data = new Data("quit", this.currentTime, (String) userSession.getUserProperties().get("username"), "null", "true", new ArrayList<>(), new ArrayList<>(), "null");
                }
                user.getBasicRemote().sendText(gson.toJson(data));
            }
        }
    }
}

Aber ich bekomme nun folgende Fehlermeldung:

java.io.IOException: java.io.IOException: Eine bestehende Verbindung wurde softwaregesteuert
durch den Hostcomputer abgebrochen

Hier weitere Details:

java.io.EOFException
at org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.fillReadBuffer(NioEndpoint.java:1248)
at org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.read(NioEndpoint.java:1183)
at org.apache.tomcat.websocket.server.WsFrameServer.onDataAvailable(WsFrameServer.java:72)
at org.apache.tomcat.websocket.server.WsFrameServer.doOnDataAvailable(WsFrameServer.java:171)
at org.apache.tomcat.websocket.server.WsFrameServer.notifyDataAvailable(WsFrameServer.java:151)
at org.apache.tomcat.websocket.server.WsHttpUpgradeHandler.upgradeDispatch(WsHttpUpgradeHandler.java:148)
at org.apache.coyote.http11.upgrade.UpgradeProcessorInternal.dispatch(UpgradeProcessorInternal.java:54)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:53)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:836)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1747)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:748)
java.io.EOFException
at org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.fillReadBuffer(NioEndpoint.java:1248)
at org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.read(NioEndpoint.java:1183)
at org.apache.tomcat.websocket.server.WsFrameServer.onDataAvailable(WsFrameServer.java:72)
at org.apache.tomcat.websocket.server.WsFrameServer.doOnDataAvailable(WsFrameServer.java:171)
at org.apache.tomcat.websocket.server.WsFrameServer.notifyDataAvailable(WsFrameServer.java:151)
at org.apache.tomcat.websocket.server.WsHttpUpgradeHandler.upgradeDispatch(WsHttpUpgradeHandler.java:148)
at org.apache.coyote.http11.upgrade.UpgradeProcessorInternal.dispatch(UpgradeProcessorInternal.java:54)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:53)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:836)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1747)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:748)
java.io.EOFException
at org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.fillReadBuffer(NioEndpoint.java:1248)
at org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.read(NioEndpoint.java:1183)
at org.apache.tomcat.websocket.server.WsFrameServer.onDataAvailable(WsFrameServer.java:72)
at org.apache.tomcat.websocket.server.WsFrameServer.doOnDataAvailable(WsFrameServer.java:171)
at org.apache.tomcat.websocket.server.WsFrameServer.notifyDataAvailable(WsFrameServer.java:151)
at org.apache.tomcat.websocket.server.WsHttpUpgradeHandler.upgradeDispatch(WsHttpUpgradeHandler.java:148)
at org.apache.coyote.http11.upgrade.UpgradeProcessorInternal.dispatch(UpgradeProcessorInternal.java:54)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:53)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:836)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1747)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:748)
java.io.EOFException
at org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.fillReadBuffer(NioEndpoint.java:1248)
at org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.read(NioEndpoint.java:1183)
at org.apache.tomcat.websocket.server.WsFrameServer.onDataAvailable(WsFrameServer.java:72)
at org.apache.tomcat.websocket.server.WsFrameServer.doOnDataAvailable(WsFrameServer.java:171)
at org.apache.tomcat.websocket.server.WsFrameServer.notifyDataAvailable(WsFrameServer.java:151)
at org.apache.tomcat.websocket.server.WsHttpUpgradeHandler.upgradeDispatch(WsHttpUpgradeHandler.java:148)
at org.apache.coyote.http11.upgrade.UpgradeProcessorInternal.dispatch(UpgradeProcessorInternal.java:54)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:53)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:836)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1747)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:748)
java.io.IOException: java.io.IOException: Eine bestehende Verbindung wurde softwaregesteuert
durch den Hostcomputer abgebrochen
at org.apache.tomcat.websocket.WsRemoteEndpointImplBase.sendMessageBlock(WsRemoteEndpointImplBase.java:315)
at org.apache.tomcat.websocket.WsRemoteEndpointImplBase.sendMessageBlock(WsRemoteEndpointImplBase.java:258)
at org.apache.tomcat.websocket.WsSession.sendCloseMessage(WsSession.java:612)
at org.apache.tomcat.websocket.WsSession.doClose(WsSession.java:497)
at org.apache.tomcat.websocket.WsSession.doClose(WsSession.java:459)
at org.apache.tomcat.websocket.WsRemoteEndpointImplBase.sendMessageBlock(WsRemoteEndpointImplBase.java:313)
at org.apache.tomcat.websocket.WsRemoteEndpointImplBase.sendMessageBlock(WsRemoteEndpointImplBase.java:250)
at org.apache.tomcat.websocket.WsRemoteEndpointImplBase.sendString(WsRemoteEndpointImplBase.java:191)
at org.apache.tomcat.websocket.WsRemoteEndpointBasic.sendText(WsRemoteEndpointBasic.java:37)
at ch.yourclick.zt.chat.ChatEndpoint.handleClose(ChatEndpoint.java:99)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.tomcat.websocket.pojo.PojoEndpointBase.onClose(PojoEndpointBase.java:103)
at org.apache.tomcat.websocket.WsSession.fireEndpointOnClose(WsSession.java:555)
at org.apache.tomcat.websocket.WsSession.onClose(WsSession.java:533)
at org.apache.tomcat.websocket.server.WsHttpUpgradeHandler.close(WsHttpUpgradeHandler.java:232)
at org.apache.tomcat.websocket.server.WsHttpUpgradeHandler.upgradeDispatch(WsHttpUpgradeHandler.java:155)
at org.apache.coyote.http11.upgrade.UpgradeProcessorInternal.dispatch(UpgradeProcessorInternal.java:54)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:53)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:836)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1747)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.io.IOException: Eine bestehende Verbindung wurde softwaregesteuert
durch den Hostcomputer abgebrochen
at sun.nio.ch.SocketDispatcher.write0(Native Method)
at sun.nio.ch.SocketDispatcher.write(SocketDispatcher.java:51)
at sun.nio.ch.IOUtil.writeFromNativeBuffer(IOUtil.java:93)
at sun.nio.ch.IOUtil.write(IOUtil.java:65)
at sun.nio.ch.SocketChannelImpl.write(SocketChannelImpl.java:471)
at org.apache.tomcat.util.net.NioChannel.write(NioChannel.java:136)
at org.apache.tomcat.util.net.NioBlockingSelector.write(NioBlockingSelector.java:105)
at org.apache.tomcat.util.net.NioSelectorPool.write(NioSelectorPool.java:144)
at org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.doWrite(NioEndpoint.java:1265)
at org.apache.tomcat.util.net.SocketWrapperBase.doWrite(SocketWrapperBase.java:748)
at org.apache.tomcat.util.net.SocketWrapperBase.flushBlocking(SocketWrapperBase.java:701)
at org.apache.tomcat.util.net.SocketWrapperBase.flush(SocketWrapperBase.java:691)
at org.apache.tomcat.websocket.server.WsRemoteEndpointImplServer.doWrite(WsRemoteEndpointImplServer.java:149)
at org.apache.tomcat.websocket.WsRemoteEndpointImplBase.writeMessagePart(WsRemoteEndpointImplBase.java:494)
at org.apache.tomcat.websocket.WsRemoteEndpointImplBase.sendMessageBlock(WsRemoteEndpointImplBase.java:309)
... 27 more
16-Jun-2019 15:14:37.516 SCHWERWIEGEND [http-nio-8080-exec-10] org.apache.tomcat.websocket.pojo.PojoEndpointBase.onClose Failed to call onClose method of POJO end point for POJO of type [ch.yourclick.zt.chat.ChatEndpoint]
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.tomcat.websocket.pojo.PojoEndpointBase.onClose(PojoEndpointBase.java:103)
at org.apache.tomcat.websocket.WsSession.fireEndpointOnClose(WsSession.java:555)
at org.apache.tomcat.websocket.WsSession.onClose(WsSession.java:533)
at org.apache.tomcat.websocket.server.WsHttpUpgradeHandler.close(WsHttpUpgradeHandler.java:232)
at org.apache.tomcat.websocket.server.WsHttpUpgradeHandler.upgradeDispatch(WsHttpUpgradeHandler.java:155)
at org.apache.coyote.http11.upgrade.UpgradeProcessorInternal.dispatch(UpgradeProcessorInternal.java:54)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:53)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:836)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1747)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.io.IOException: java.io.IOException: Eine bestehende Verbindung wurde softwaregesteuert
durch den Hostcomputer abgebrochen
at org.apache.tomcat.websocket.WsRemoteEndpointImplBase.sendMessageBlock(WsRemoteEndpointImplBase.java:315)
at org.apache.tomcat.websocket.WsRemoteEndpointImplBase.sendMessageBlock(WsRemoteEndpointImplBase.java:250)
at org.apache.tomcat.websocket.WsRemoteEndpointImplBase.sendString(WsRemoteEndpointImplBase.java:191)
at org.apache.tomcat.websocket.WsRemoteEndpointBasic.sendText(WsRemoteEndpointBasic.java:37)
at ch.yourclick.zt.chat.ChatEndpoint.handleClose(ChatEndpoint.java:99)
... 18 more
Caused by: java.io.IOException: Eine bestehende Verbindung wurde softwaregesteuert
durch den Hostcomputer abgebrochen
at sun.nio.ch.SocketDispatcher.write0(Native Method)
at sun.nio.ch.SocketDispatcher.write(SocketDispatcher.java:51)
at sun.nio.ch.IOUtil.writeFromNativeBuffer(IOUtil.java:93)
at sun.nio.ch.IOUtil.write(IOUtil.java:65)
at sun.nio.ch.SocketChannelImpl.write(SocketChannelImpl.java:471)
at org.apache.tomcat.util.net.NioChannel.write(NioChannel.java:136)
at org.apache.tomcat.util.net.NioBlockingSelector.write(NioBlockingSelector.java:105)
at org.apache.tomcat.util.net.NioSelectorPool.write(NioSelectorPool.java:144)
at org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.doWrite(NioEndpoint.java:1265)
at org.apache.tomcat.util.net.SocketWrapperBase.doWrite(SocketWrapperBase.java:748)
at org.apache.tomcat.util.net.SocketWrapperBase.flushBlocking(SocketWrapperBase.java:701)
at org.apache.tomcat.util.net.SocketWrapperBase.flush(SocketWrapperBase.java:691)
at org.apache.tomcat.websocket.server.WsRemoteEndpointImplServer.doWrite(WsRemoteEndpointImplServer.java:149)
at org.apache.tomcat.websocket.WsRemoteEndpointImplBase.writeMessagePart(WsRemoteEndpointImplBase.java:494)
at org.apache.tomcat.websocket.WsRemoteEndpointImplBase.sendMessageBlock(WsRemoteEndpointImplBase.java:309)
... 22 more

java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.tomcat.websocket.pojo.PojoEndpointBase.onClose(PojoEndpointBase.java:103)
at org.apache.tomcat.websocket.WsSession.fireEndpointOnClose(WsSession.java:555)
at org.apache.tomcat.websocket.WsSession.onClose(WsSession.java:533)
at org.apache.tomcat.websocket.server.WsHttpUpgradeHandler.close(WsHttpUpgradeHandler.java:232)
at org.apache.tomcat.websocket.server.WsHttpUpgradeHandler.upgradeDispatch(WsHttpUpgradeHandler.java:155)
at org.apache.coyote.http11.upgrade.UpgradeProcessorInternal.dispatch(UpgradeProcessorInternal.java:54)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:53)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:836)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1747)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.io.IOException: java.io.IOException: Eine bestehende Verbindung wurde softwaregesteuert
durch den Hostcomputer abgebrochen
at org.apache.tomcat.websocket.WsRemoteEndpointImplBase.sendMessageBlock(WsRemoteEndpointImplBase.java:315)
at org.apache.tomcat.websocket.WsRemoteEndpointImplBase.sendMessageBlock(WsRemoteEndpointImplBase.java:250)
at org.apache.tomcat.websocket.WsRemoteEndpointImplBase.sendString(WsRemoteEndpointImplBase.java:191)
at org.apache.tomcat.websocket.WsRemoteEndpointBasic.sendText(WsRemoteEndpointBasic.java:37)
at ch.yourclick.zt.chat.ChatEndpoint.handleClose(ChatEndpoint.java:99)
... 18 more
Caused by: java.io.IOException: Eine bestehende Verbindung wurde softwaregesteuert
durch den Hostcomputer abgebrochen
at sun.nio.ch.SocketDispatcher.write0(Native Method)
at sun.nio.ch.SocketDispatcher.write(SocketDispatcher.java:51)
at sun.nio.ch.IOUtil.writeFromNativeBuffer(IOUtil.java:93)
at sun.nio.ch.IOUtil.write(IOUtil.java:65)
at sun.nio.ch.SocketChannelImpl.write(SocketChannelImpl.java:471)
at org.apache.tomcat.util.net.NioChannel.write(NioChannel.java:136)
at org.apache.tomcat.util.net.NioBlockingSelector.write(NioBlockingSelector.java:105)
at org.apache.tomcat.util.net.NioSelectorPool.write(NioSelectorPool.java:144)
at org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.doWrite(NioEndpoint.java:1265)
at org.apache.tomcat.util.net.SocketWrapperBase.doWrite(SocketWrapperBase.java:748)
at org.apache.tomcat.util.net.SocketWrapperBase.flushBlocking(SocketWrapperBase.java:701)
at org.apache.tomcat.util.net.SocketWrapperBase.flush(SocketWrapperBase.java:691)
at org.apache.tomcat.websocket.server.WsRemoteEndpointImplServer.doWrite(WsRemoteEndpointImplServer.java:149)
at org.apache.tomcat.websocket.WsRemoteEndpointImplBase.writeMessagePart(WsRemoteEndpointImplBase.java:494)
at org.apache.tomcat.websocket.WsRemoteEndpointImplBase.sendMessageBlock(WsRemoteEndpointImplBase.java:309)
... 22 more
 

mihe7

Top Contributor
java.io.IOException: java.io.IOException: Eine bestehende Verbindung wurde softwaregesteuert
durch den Hostcomputer abgebrochen
Ganz verhindern lassen sich derlei Exceptions aber nie, denn den Stecker ziehen kann der Client immer, auch während Du überträgst.
:)

Das ist ein ganz normales Verhalten im Netzwerk: der Empfänger unterbricht die Verbindung, während gesendet wird. Du musst lediglich die Exception abfangen.
 

RezaScript

Bekanntes Mitglied
Hmm, ich habe es jetzt mal so probiert:

Java:
try {
    user.getBasicRemote().sendText(gson.toJson(data));
}
catch (IOException e) {
    e.printStackTrace();
}

Bekomme aber nach wie vor dieselbe Fehlermeldung.
 

mihe7

Top Contributor
Klar, Du gibst sie ja auch aus :)

Ersetz mal e.printStackTrace() durch System.out.println(e.getLocalizedMessage());, dann solltest Du nur noch eine Kurform erhalten.
 

RezaScript

Bekanntes Mitglied
Gut, und schon kommt die nächste Fehlermeldung :)

Java:
@OnClose
public void handleClose(Session userSession) throws IOException {
    synchronized (users) {
        users.remove(userSession);
        // Post the message
        for (Session user : users) {
            if (user.isOpen()) {
                postMessage();

                Data data = new Data("quit", currentTime, (String) userSession.getUserProperties().get("username"), "null", "null", new ArrayList<>(), new ArrayList<>(), "null");
                if (!Objects.requireNonNull(Database.getData("SELECT * FROM users WHERE username = '" + userSession.getUserProperties().get("username") + "'", this.user)).isEmpty()) {
                    data = new Data("quit", this.currentTime, (String) userSession.getUserProperties().get("username"), "null", "true", new ArrayList<>(), new ArrayList<>(), "null");
                }
                try {
                    user.getBasicRemote().sendText(gson.toJson(data)); // Caused by: java.lang.IllegalStateException: Message will not be sent because the WebSocket session has been closed
                }
                catch (IOException e) {
                    System.out.println(e.getLocalizedMessage());
                }
            }
        }
    }
}
 

mrBrown

Super-Moderator
Mitarbeiter

RezaScript

Bekanntes Mitglied
@mrBrown, danke für den Tipp! Wenn ich if (user.isOpen()) vor das Senden nehme, scheint es zu funktionieren und ich bekomme keine Fehlermeldung mehr aber ich habe keine Ahnung warum das so funktioniert. Kannst du mir kurz bitte sagen was da der Unterschied ist?
 

mrBrown

Super-Moderator
Mitarbeiter
@mrBrown, danke für den Tipp! Wenn ich if (user.isOpen()) vor das Senden nehme, scheint es zu funktionieren und ich bekomme keine Fehlermeldung mehr aber ich habe keine Ahnung warum das so funktioniert. Kannst du mir kurz bitte sagen was da der Unterschied ist?
Weniger Zeit, die dazwischen vergeht.

In deinem altem Code war zwischen dem Check, ob die Verbindung offen ist, zb noch eine Datenbankabfrage - und in der Zeit, die die braucht, kann die Verbindung schon wieder geschlossen sein.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
I Exception wird gefangen, aber trotzdem in Error Log? Java Basics - Anfänger-Themen 10
terashy VS Code Project run error Java Basics - Anfänger-Themen 10
monsterherz Circle.java:5: error: <identifier> expected Java Basics - Anfänger-Themen 2
monsterherz error: <identifier> expected Java Basics - Anfänger-Themen 2
R Compiler-Fehler identifier error? Java Basics - Anfänger-Themen 3
N Compiler-Fehler Not a statement Error Java Basics - Anfänger-Themen 7
Jul1n4tor Scanner error bei Eingabe die kein Integer ist Java Basics - Anfänger-Themen 4
richrich99 error: illegal start of expression Java Basics - Anfänger-Themen 10
M error: '.class' expected switch(char) Java Basics - Anfänger-Themen 32
N Compiler-Fehler State Machine - Compiler Error Java Basics - Anfänger-Themen 48
U Interface als PAramter (Vergleich) und ein Error Java Basics - Anfänger-Themen 9
FHEFHJHFJH error: class names, 'summe_bsp', are only accepted if annotation processing is explicitly requested Java Basics - Anfänger-Themen 3
S JavaKara Null Exception Error Java Basics - Anfänger-Themen 4
P Eclipse Karate Framework API Test . Unexpected Error: the trustAnchors parameter must be non-empty Java Basics - Anfänger-Themen 1
H Versteht jemand diesen Codewars Error? Java Basics - Anfänger-Themen 8
J Fehlermeldung: A JNI error Java Basics - Anfänger-Themen 3
Gaudimagspam Compiler Error Java Basics - Anfänger-Themen 3
Eule25 Arbeit mit long und int, Error: integer number too large Java Basics - Anfänger-Themen 2
P Welche Zeile in Tadople gibt einen compiler error? Java Basics - Anfänger-Themen 5
B Methoden if-statement error, FX, Fehlermeldung Java Basics - Anfänger-Themen 6
K Error bei meinem Programm - Hilfe Java Basics - Anfänger-Themen 8
A Scanner-Error Java Basics - Anfänger-Themen 8
Elyt Error: incompatible types Java Basics - Anfänger-Themen 3
I Client ObjectInputStream error... Java Basics - Anfänger-Themen 5
Kirby.exe Alle möglichen Error Möglichkeiten abfangen Java Basics - Anfänger-Themen 33
C error: <identifier> expected Java Basics - Anfänger-Themen 13
S Compiler-Fehler Exception in thread "main" java.lang.Error: Unresolved compilation problem: Java Basics - Anfänger-Themen 6
N Methoden Unerklärliche Error Meldung Java Basics - Anfänger-Themen 3
ZH1896ZH Datentypen Error bei For-Schleife Java Basics - Anfänger-Themen 2
Z Klassen Error: ';' expected - was mache ich falsch? Java Basics - Anfänger-Themen 4
9 Error bei .split() Java Basics - Anfänger-Themen 2
L Operatoren error: bad operand types for binary operator && Java Basics - Anfänger-Themen 8
B cal4j - Error at line 1:Unexpected end of file Java Basics - Anfänger-Themen 0
F Erste Schritte error: cannot find symbol Java Basics - Anfänger-Themen 5
L SQLITE - Syntax error Java Basics - Anfänger-Themen 3
R else without if error Java Basics - Anfänger-Themen 5
A Objekt in Methode zurückgeben, JUnit zeigt Error Java Basics - Anfänger-Themen 2
F Ausdruck wirft unerwarteten Error Java Basics - Anfänger-Themen 2
T Unverständlicher Launch-Error Java Basics - Anfänger-Themen 11
L Bluej Error: Cannot find Symbol Java Basics - Anfänger-Themen 13
R java.lang.ArrayIndexOutOfBoundsException: 0 Rechner Error Java Basics - Anfänger-Themen 4
F Taschenrechner "Error loading class..." Java Basics - Anfänger-Themen 5
T Error: int cannot be dereferenced Java Basics - Anfänger-Themen 10
D Datentypen Datentyperstellung | Kompiler sagt Syntax Error doch ich find keine Lösung Java Basics - Anfänger-Themen 2
J Syntax error on token ";",, expected Java Basics - Anfänger-Themen 2
W double*double error Java Basics - Anfänger-Themen 4
C Compiler-Fehler No such Field error Java Basics - Anfänger-Themen 20
B Linux - Error: Could not find or load main class application.Main Java Basics - Anfänger-Themen 28
T Datum wird auf der Konsole richtig ausgegeben, aber im Textarea kommt ERROR Java Basics - Anfänger-Themen 8
C Erste Schritte Syntax Error Java Basics - Anfänger-Themen 23
H Variablen error: non-static variable cannot be referenced from a static context Java Basics - Anfänger-Themen 4
H Compiler-Fehler error not a statement Java Basics - Anfänger-Themen 2
N Error bei eingabe eines Punktes Java Basics - Anfänger-Themen 1
T error: class, interface, or enum expected Java Basics - Anfänger-Themen 5
TheMenox Error bei Scanner - woher? Java Basics - Anfänger-Themen 14
D Compiler-Fehler error: .class expected Java Basics - Anfänger-Themen 2
Chr1s Interpreter-Fehler Error Fehlercode Java Basics - Anfänger-Themen 7
D Bitte um Hilfe bei "error: package com.apple.eawt does not exist import com.apple.eawt.*;" Java Basics - Anfänger-Themen 1
J Error: cannot find symbol - variable Java Basics - Anfänger-Themen 3
S Compiler-Fehler error: ';' expected (finde Fehler nicht) Java Basics - Anfänger-Themen 10
D Erste Schritte Fehlermeldung "Syntax error on token ";", { expected after this token" Java Basics - Anfänger-Themen 13
L Compiler-Fehler error: class, interface or enum expected Java Basics - Anfänger-Themen 2
1 Bei if-Anweisung: Syntax error on token Java Basics - Anfänger-Themen 5
D Übung Felder java Error kompilieren Java Basics - Anfänger-Themen 4
Joew0815 Error org.apache.xmlrpc.client.XmlRpcClientConfigImpl.setUserAgent Java Basics - Anfänger-Themen 2
A Code läuft nicht, Fehlermeldung Exception in thread "main" java.lang.Error: Unresolved compilation " Java Basics - Anfänger-Themen 11
C Exception Error Java Basics - Anfänger-Themen 15
A Heap Space Error bei rekursiver Suche in Dateien trotz nur einer Zeile im Speicher Java Basics - Anfänger-Themen 26
B Not a statement error Java Basics - Anfänger-Themen 2
D error: cannot find symbol Java Basics - Anfänger-Themen 3
B Frage zu Beispielprogramm: "error: cannot find symbol" Java Basics - Anfänger-Themen 2
F java Ip ping + Dateiausgabe error ! Java Basics - Anfänger-Themen 3
O Exception Error Java Basics - Anfänger-Themen 3
BlueMountain Erste Schritte error: cannot find symbol Java Basics - Anfänger-Themen 2
B Printf führt zu Error. Java Basics - Anfänger-Themen 8
P Fatal Error [...] librxtxSerial.so Java Basics - Anfänger-Themen 2
D error: Class names, >>>HILFE, anfänger<<< Java Basics - Anfänger-Themen 4
L Error: Cannot find symbol Java Basics - Anfänger-Themen 1
A Taschenrechner zeigt Error Java Basics - Anfänger-Themen 7
B Compiler-Fehler 86:11: error: ';' expected obwohl kein ";" hingehört! Java Basics - Anfänger-Themen 10
K Java-Editor: "Starten" bringt Error Java Basics - Anfänger-Themen 15
N Error "unreachable Code" Java Basics - Anfänger-Themen 7
A error: incompatible types Java Basics - Anfänger-Themen 9
T If ; else error on system token delete Java Basics - Anfänger-Themen 5
B Error vs Runtime exception Java Basics - Anfänger-Themen 4
W Variablen While-Error Java Basics - Anfänger-Themen 6
N Operatoren JSpinner und + Error Java Basics - Anfänger-Themen 21
M Java Arbeitsspeicherverbrauch, Heap Space error korrigieren? Java Basics - Anfänger-Themen 18
D Error bei addView Java Basics - Anfänger-Themen 4
M Syntax error on token ";", { expected after this token Java Basics - Anfänger-Themen 3
J Variablen Invalid Character - Error -> Spiel mit Variablenergebnissen Java Basics - Anfänger-Themen 8
K Erste Schritte eclipse syntax error token Java Basics - Anfänger-Themen 5
vandread String.split("\\") führt zu Error?! Java Basics - Anfänger-Themen 8
G Fehlermeldung: A fatal error has been detected by the Java Runtime Environment Java Basics - Anfänger-Themen 7
B Compiler-Fehler import java.io.*; führt zu error Java Basics - Anfänger-Themen 2
S Syntax Error - source level Java Basics - Anfänger-Themen 12
L bean error bei glassfish deploy Java Basics - Anfänger-Themen 2
B Syntax error Java Basics - Anfänger-Themen 6
K Error: java.lang.NoSuchMethodException Java Basics - Anfänger-Themen 2
K Objekt erstellen - error: non-static variable this cannot be referenced from a static context Java Basics - Anfänger-Themen 17

Ähnliche Java Themen

Neue Themen


Oben