Exception beim "Disconnect"

Added by sich about 1 year ago

Hallo Alex und alle Anderen!

Ich bin dabei ein chat-Programm auf der Basis von SIMON zu schreiben. Dabei habe ich mich an deinem Beispiel: http://dev.root1.de/projects/simon/wiki/Sample_session_pattern gehalten, bzw das als Grundlage genommen um einen (vernünftigen) "Anmeldevorgang" zu bekommen. Bisher hat untre Version 1.1.0 auch alles ohne Exceptions oder anderen Problemen geklappt. Nun bin ich auf das neuere simon-1.1.1-jar-with-dependencies.jar umgestiegen und erhalte bei jedem "Logout" eines Clients folgende Ausnahme:

20.04.2011 12:31:41 de.root1.simon.Dispatcher exceptionCaught
SCHWERWIEGEND: exception Caught. session=0x00000003. Exception
 java.io.IOException: Eine vorhandene Verbindung wurde vom Remotehost geschlossen
    at sun.nio.ch.SocketDispatcher.read0(Native Method)
    at sun.nio.ch.SocketDispatcher.read(Unknown Source)
    at sun.nio.ch.IOUtil.readIntoNativeBuffer(Unknown Source)
    at sun.nio.ch.IOUtil.read(Unknown Source)
    at sun.nio.ch.SocketChannelImpl.read(Unknown Source)
    at org.apache.mina.transport.socket.nio.NioProcessor.read(NioProcessor.java:214)
    at org.apache.mina.transport.socket.nio.NioProcessor.read(NioProcessor.java:42)
    at org.apache.mina.core.polling.AbstractPollingIoProcessor.read(AbstractPollingIoProcessor.java:673)
    at org.apache.mina.core.polling.AbstractPollingIoProcessor.process(AbstractPollingIoProcessor.java:646)
    at org.apache.mina.core.polling.AbstractPollingIoProcessor.process(AbstractPollingIoProcessor.java:635)
    at org.apache.mina.core.polling.AbstractPollingIoProcessor.access$400(AbstractPollingIoProcessor.java:67)
    at org.apache.mina.core.polling.AbstractPollingIoProcessor$Processor.run(AbstractPollingIoProcessor.java:1079)
    at org.apache.mina.util.NamePreservingRunnable.run(NamePreservingRunnable.java:64)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

Ich habe wie gesagt sonst nichts geändert und mich an das Beispiel gehalten. Also

unreferenced()
in der session.java etc.
Im moment habe ich nicht die Möglichkeit Teile meines Codes hochzuladen, wenn nötig bitte bescheid sagen, dann mache ich das so bald es möglich ist.

Vielen Dank für die Hilfe!
sich


Replies (10)

RE: Exception beim "Disconnect" - Added by achristian about 1 year ago

Von 1.1.0 zu 1.1.1 gabs eigentlich nur zwei BugFixes. Und keiner der fixes steht in direkter Relation zu diesem Problem hier. Der Logout-Code wäre nun also in der Tat interessant zu sehen. Du kannst auch versuchen einen simplen Reproducer zu basteln.

Ohne Code hilft dann nur noch ein SIMON Debug-Log.

- Alex

RE: Exception beim "Disconnect" - Added by sich about 1 year ago

Erstmal Danke für deine Antwort.

Ich Poste jetzt erstmal die Debug-Logs, hoffe das sind die Richtigen?! Um Code bemühe ich mich dann gleich.

Gruß
sich

simon_debug.log.0 - Server-Log (7.5 kB)

simon_debug.log.1 - Client-Log (48.9 kB)

RE: Exception beim "Disconnect" - Added by sich about 1 year ago

So jetzt steh ich for einem Rätsel!

Ich habe alles "unnötige" aus dem Code entfernt (hauptsächlich die ganze gui) jetzt bekomme ich die Ausnahme beim Trennen nicht mehr.

Gruß
sich

RE: Exception beim "Disconnect" - Added by achristian about 1 year ago

Das gab es schon öfters. Ich denke meist hängts daran, dass der Classpath nicht ganz 100% up2date war. In Eclipse hilft da meist ein "Clean". In Netbeans ist mir das eigentlich noch nicht passiert.
Im zweifelsfall, und vor allem nach dem einfügen/ersetzten von Datein "ausserhalb" der IDE: Am besten mal einen Clean ausführen und/oder die IDE neu starten.

- Alex

RE: Exception beim "Disconnect" - Added by sich about 1 year ago

Hallo Alex,

sorry dass ich jetzt erst antowrte aber ich war über Ostern unterwegs.
Also da habe ich mich wohl etwas ungenau ausgedrückt.. auch nach nem clen etc besteht weiter dies Exception, nur es muss doch irgendwo an meinem Code liegen, da bei dem "bereinigten" Code die Ausnahme nicht geworfen wird.
Da der Code aber nicht unbedingt nach außen soll kann ich jetzt hier nicht die entsprechenden Stellen posten.

Naja dann kannst du mir wohl leider nicht weiterhelfen, aber dennoch Danke

Gruß
Sich

RE: Exception beim "Disconnect" - Added by achristian about 1 year ago

sorry dass ich jetzt erst antowrte aber ich war über Ostern unterwegs.

Wer war das nicht ;-)

Also da habe ich mich wohl etwas ungenau ausgedrückt.. auch nach nem clen etc besteht weiter dies Exception, nur es muss doch irgendwo an meinem Code liegen, da bei dem "bereinigten" Code die Ausnahme nicht geworfen wird.

Wird wohl knifflig.

Da der Code aber nicht unbedingt nach außen soll kann ich jetzt hier nicht die entsprechenden Stellen posten.

Den folgenden Abschnitt im Wiki kennst du? --> http://dev.root1.de/projects/simon/wiki#License

Naja dann kannst du mir wohl leider nicht weiterhelfen, aber dennoch Danke

Alles klar. Wenn dir noch was auffällt/einfällt: Meld dich einfach.

Gruß
Alex

RE: Exception beim "Disconnect" - Added by sich about 1 year ago

Würde dir gerne den Code per Mail schicken, vllt hast du ja zeit drüber zu schaun und findet den, oder auch andere Fehler?! Wäre das ok für dich?

Gruß
sich

RE: Exception beim "Disconnect" - Added by achristian about 1 year ago

Klar, nur her damit. Kann nur u.U. etwas dauern bis ich reinschauen kann

--> alex (at) root1.de

Gruß
Alex

RE: Exception beim "Disconnect" - Added by achristian about 1 year ago

Hallo nochmal,

Nachdem ich den Source jetzt mal unter die Lupe genommen habe, habe ich das Problem wohl gefunden.

Hier die Erklärung:

Stell dir vor due telefonierst mit einem Freund. Und während des Telefonats veranlasst du die Telekom das Kabel einfach so durchzuschneiden. Deinem Freund sagst du davon nix. Was wird passieren? Du hast was du wolltest: Eine beendete Verbindung. Aber dein Freund wird sich lautstark beschweren dass man so eine Telefonat nicht beendet und dass es doch anständiger wäre vorher 'Tschüß' zu sagen.

Und genau das passiert bei deiner Implementierung: Dein Client hat eine Verbindung mit dem Server. Und wenn du jetzt über's Menü "Exit" aufrufst, dann killst du die Anwendung mit einem "System.exit(0);". Dieser Befehl veranlasst die JVM sich sofort und ohne vorher aufzuräumen zu beenden. Die Verbindung zum Server wird hart getrennt. Und genau das sagt dir das Serverlog: Der Client hat einfach so und ohne voranmeldung die Verbindung getrennt.

Wenn du, wie in den Tutorials zu finden, die Verbindung sauber abbaust (ein release auf das Remote-Objekt machen), dann wird die Verbindung sauber beendet (nur wenn du alle Remote-Objekte releast) und du kannst danach System.exit() aufrufen, ohne dass ein Fehler kommt.

Gruß
Alex

RE: Exception beim "Disconnect" - Added by sich about 1 year ago

Hallo Alex,

vielen Dank für deine Hilfe und deine Investierte Zeit.
Ich muss zu meiner "Schande" gestehen dass ich so ziemlich am Anfang vom Auftreten des Problems sowas vermutet hatte. So sind auch Zeile 492 bis 510 in der "ClientGUI" entstanden, aber das war dann anscheinend noch der falsche Ansatz oder Umsetzung, da so trotzdem die Ausnahme geworfen wurde.
Aber auf Grund deiner Hilfe un deiner Mühe, für einem so "dummen" Fehler, werde ich das jetzt hinbekommen.

Also nochmal vielen Dank
und schöne Grüße
sich

(1-10/10)