Problem mit release() bei Realisierung von Observer-Funktionalität

Added by apocalyarts 11 months ago

Hallo!

Ich habe ein Problem und hoffe hier kann mir geholfen werden! Es geht um folgendes: Ich programmiere gerade einen eShop. Dieser besteht aus einem Client mit GUI sowie einem Server. Beide Programme kommunizieren via Simon über das Netzwerk. In der ersten Version habe ich lediglich ein Interface für den Server erstellt, es beim Client importiert und alles klappt Wunderbar, d.h. Methoden auf dem Server aufrufen und die Ergebnisse daraus wieder in der GUI verarbeiten.

Nun will ich das ganze mit einer Observer-Methodik erweitern: die verschiedenen JPanels meiner GUI sollen eine aktualisieren-Methode implementieren und immer wenn auf dem Server etwas Relevantes passiert (z.b. neuer Artikel wird erstellt), soll er alle Clients ansprechen, damit sie sich aktualisieren.

Damit das überhaupt machbar ist, habe ich auf dem Server 2 Methoden zum an und abmelden geschrieben:

 1    public void registerClientForUpdates(UpdateInterface client){
 2        clients.add(client);
 3        System.out.println("Anmeldung okay!");
 4        return;
 5    }
 6
 7    public void unregisterClientForUpdates(UpdateInterface client){
 8
 9        if(clients.remove(client)){
10            System.out.println("Abmelden Erfolg!");
11            return;
12        } else {
13            System.out.println("Abmelden KACKE!");
14            return;
15        }
16    }

Die Funktionen werden vom client aufgerufen, indem er sich selbst (this) übergibt. Die Funktion speichert bzw. löscht den client dann aus einer ArrayList<UpdateInterface>. Beim Anmelden funktioniert das wunderbar. Nun kommt folgendes Problem:

Wenn ich beim Beenden des Clients die abmelden-Methode aufrufe, schlägt danach das Schließen der Serververbindung via name.release(); fehl. Hier der Code dazu, wenn man das Fenster schließt:

1class ShopWindowEventHandler extends WindowAdapter {
2        public void windowClosing(WindowEvent evt) {
3            sm.getAktiverUser().setMeinWarenkorb(sm.getWarenkorb()); // Hier wird der lokale Warenkorb auf dem Server gesichert
4            sm.unregisterClientForUpdatesAndExit(MainframeGUI.this);
5            name.release(sm);
6            System.exit(0);
7        }
8    }

Ich bekomme nun folgenden Exception(s):

Der Server sagt:

 101.07.2011 13:05:26 de.root1.simon.Dispatcher exceptionCaught
 2SCHWERWIEGEND: exception Caught. session=0x00000002. Exception
 3 java.io.IOException: Eine vorhandene Verbindung wurde vom Remotehost geschlossen
 4    at sun.nio.ch.SocketDispatcher.read0(Native Method)
 5    at sun.nio.ch.SocketDispatcher.read(Unknown Source)
 6    at sun.nio.ch.IOUtil.readIntoNativeBuffer(Unknown Source)
 7    at sun.nio.ch.IOUtil.read(Unknown Source)
 8    at sun.nio.ch.SocketChannelImpl.read(Unknown Source)
 9    at org.apache.mina.transport.socket.nio.NioProcessor.read(NioProcessor.java:214)
10    at org.apache.mina.transport.socket.nio.NioProcessor.read(NioProcessor.java:42)
11    at org.apache.mina.core.polling.AbstractPollingIoProcessor.read(AbstractPollingIoProcessor.java:673)
12    at org.apache.mina.core.polling.AbstractPollingIoProcessor.process(AbstractPollingIoProcessor.java:646)
13    at org.apache.mina.core.polling.AbstractPollingIoProcessor.process(AbstractPollingIoProcessor.java:635)
14    at org.apache.mina.core.polling.AbstractPollingIoProcessor.access$400(AbstractPollingIoProcessor.java:67)
15    at org.apache.mina.core.polling.AbstractPollingIoProcessor$Processor.run(AbstractPollingIoProcessor.java:1079)
16    at org.apache.mina.util.NamePreservingRunnable.run(NamePreservingRunnable.java:64)
17    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
18    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
19    at java.lang.Thread.run(Unknown Source)

und der Client sagt:

 1Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
 2    at de.root1.simon.LookupTable.unreference(LookupTable.java:338)
 3    at de.root1.simon.LookupTable.cleanup(LookupTable.java:300)
 4    at de.root1.simon.Dispatcher.shutdown(Dispatcher.java:616)
 5    at de.root1.simon.AbstractLookup.releaseServerDispatcherRelation(AbstractLookup.java:360)
 6    at de.root1.simon.AbstractLookup.releaseDispatcher(AbstractLookup.java:399)
 7    at de.root1.simon.AbstractLookup.release(AbstractLookup.java:119)
 8    at de.root1.simon.NameLookup.release(NameLookup.java:23)
 9    at gui.MainframeGUI$ShopWindowEventHandler.windowClosing(MainframeGUI.java:78)
10    at java.awt.Window.processWindowEvent(Unknown Source)
11    at javax.swing.JFrame.processWindowEvent(Unknown Source)
12    at java.awt.Window.processEvent(Unknown Source)
13    at java.awt.Component.dispatchEventImpl(Unknown Source)
14    at java.awt.Container.dispatchEventImpl(Unknown Source)
15    at java.awt.Window.dispatchEventImpl(Unknown Source)
16    at java.awt.Component.dispatchEvent(Unknown Source)
17    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
18    at java.awt.EventQueue.access$000(Unknown Source)
19    at java.awt.EventQueue$1.run(Unknown Source)
20    at java.awt.EventQueue$1.run(Unknown Source)
21    at java.security.AccessController.doPrivileged(Native Method)
22    at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
23    at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
24    at java.awt.EventQueue$2.run(Unknown Source)
25    at java.awt.EventQueue$2.run(Unknown Source)
26    at java.security.AccessController.doPrivileged(Native Method)
27    at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
28    at java.awt.EventQueue.dispatchEvent(Unknown Source)
29    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
30    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
31    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
32    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
33    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
34    at java.awt.EventDispatchThread.run(Unknown Source)

Wenn ich den Methodenaufruf unregisterClientForUpdates() vor dem release() auskommentiere, funktioniert wieder alles perfekt. Woran kann's liegen?


Replies (10)

RE: Problem mit release() bei Realisierung von Observer-Funktionalität - Added by achristian 11 months ago

Hmm, dem Stacktrace der Exception zufolge liegts an einer NPE seltsam Ich schau mal in den Code rein und meld mich wieder...

Gruß
Alex

RE: Problem mit release() bei Realisierung von Observer-Funktionalität - Added by achristian 11 months ago

Ähm, ganz vergessen zu fragen: Du benutzt Simon 1.1.1?

[update]

Also spontan würde ich mal behaupten das ist noch Version 1.1.0. Der Fehler war da in der Tat bekannt und wurde mit 1.1.1. behoben, wenn ich mich recht erinnere. nach bug ticket suchen geh

RE: Problem mit release() bei Realisierung von Observer-Funktionalität - Added by apocalyarts 11 months ago

Unter meinen Referenced Libaries im Eclipse steht simon-1.1.1.jar :) ist also neueste Version ^^

RE: Problem mit release() bei Realisierung von Observer-Funktionalität - Added by achristian 11 months ago

Sorry, hab mich mit den Revisionsnummern etwas vertan. Der Bug wurde im 1.1.x Branch bis dato nicht gefixt.
Ich hab mal ein Bug-Ticket erzeugt: http://dev.root1.de/issues/97

Werde das in 1.1.2 fixen.

RE: Problem mit release() bei Realisierung von Observer-Funktionalität - Added by apocalyarts 11 months ago

Das ja jetzt blöd. Habe bald Abgabe für das Projekt. Hast du einen Vorschlag wie ich das Problem umschiffen kann oder bis wann du das Update erstellt hast?

RE: Problem mit release() bei Realisierung von Observer-Funktionalität - Added by achristian 11 months ago

Bin mir eigentlich sicher dass ich in 1.2.0-SNAPSHOT den Fehler gefixt habe. Die Snapshot-Version bekommst du hier: http://nexus.root1.de/content/repositories/snapshots/de/root1/simon/1.2.0-SNAPSHOT/

Oder du wartest 1-2 Tage. Dann sollte das Problem im 1.1.2 Branch gefixt sein. Arbeite schon daran. Evtl. hast du morgen früh schon 1.1.2

Gruß
Alex

RE: Problem mit release() bei Realisierung von Observer-Funktionalität - Added by achristian 11 months ago

Habs eben 1.2.0-SNAPSHOT ausprobiert. Damit kann ich den Fehler nicht mehr reproduzieren.

RE: Problem mit release() bei Realisierung von Observer-Funktionalität - Added by apocalyarts 11 months ago

wäre cool wenn du den morgen bereit hast. So spontan bekomme ich die Jar vom Snapshot nicht in mein Projekt und mach erstmal pause

RE: Problem mit release() bei Realisierung von Observer-Funktionalität - Added by achristian 11 months ago

So, Fehler behoben. War echt saublöd. Kommt davon wenn man mehrere Wochen nicht mehr in den Source schaut :-( Aber ich gelobe Besserung :-)

1.1.2 liegt bei den Files zum Download.

Wäre nett wenn du mir kurz feedback geben könntest ob dein Problem damit behoben ist.

RE: Problem mit release() bei Realisierung von Observer-Funktionalität - Added by apocalyarts 11 months ago

Ja, der Fehler ist behoben! Vielen vielen Dank :)

(1-10/10)