SIMON - Simple Invocation of Methods Over Network

Ich benutz gerade immer ausm svn.

Ja hab auch schon sowas vermutet aber ich bin im Debuger soweit gekommen bis du nach einigen Überprüfungen invoke aufrufst (dann hab ich immer den falschen Button gedrückt und bin nicht rein gegangen) ab da hängts dann. Aber die Methode ist nur eine weitere Methode von einigen aus meinem Interface, die anderen laufen alle.

Hast du mal kontrolliert ob auch alle deine Remote Interfaces von SimonRemote erben?

  • Alex

Jo wie gesagt die Methode die ich aufrufe ist eine von mehreren des Interfaces und alle funktionieren außer die eine. Ich werds morgen nochmal einfacher probieren, derzeit rufe ich die über ne GUI auf.

Wichtig ist auch, dass alle Methodenparameter “serializeable” sind. Gleiches gilt für Rückgabewerte. Was nicht “serializeable” implementiert, muss dann folglich SimonRemote implementieren, also ein Callbackobjekt sein. Trifft beides nicht zu, könnte es hängen bleiben. Aber wie gesagt, das sollte eigentlich im Debuglog sichtbar sein in Form einer SimonRemoteException welche auf etwas nicht serialisierbares hindeutet.

  • Alex

ja das sollten alle sein, ich werd das aber morgen noch einmal genauer untersuchen

Ich versteh das nicht in meinem Programm läuft das nicht, er geht auf Clientseite im Dispatcher bis


			// wait for result
			synchronized (monitor) {
				try {
					monitor.wait();
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}```
Dann hängt er auf Clientseite tut sich nix.

Bau ich das in dein/mein Testprogramm ein läufts.

[QUOTE=EagleEye]Ich versteh das nicht in meinem Programm läuft das nicht, er geht auf Clientseite im Dispatcher bis


			// wait for result
			synchronized (monitor) {
				try {
					monitor.wait();
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}```
Dann hängt er auf Clientseite tut sich nix.
[/quote]
Ja, an genau der stelle wartet er auf eine Antwort vom Server. Schau mal ins Log des Servers. Ich tippe mal darauf dass dort die Verbindung beendet wird weil eine Exception auftritt. Typischerweise wird da etwas von "cancelKeys" oder so zu sehen sein.

"Normal" ist das "noch" nicht. Wenn es eine Exception gibt, sollte die zum Client übertragen werden. Aber irgendwo hab ich da wohl etwas verdreht. Muss ich nur nochmal reinschauen.



> Bau ich das in dein/mein Testprogramm ein läufts.

Hä? Was baust du ein? 

Gruß
Alex

[QUOTE=tuxedo]
Hä? Was baust du ein?

Gruß
Alex[/QUOTE]

Die Methode die ich aufrufe

Du sprichst in Rätseln. Welche Methode denn? Leg doch mal die Karten auf den Tisch. Muss dir ja alles aus der Nase ziehen. Hellsehen kann ich leider (noch) nicht :wink:

Die Methode wo er sich gerade aufhängt, gerade gabs auch ne Exception obwohl ich nichts geändert hab (bin ich zumindest der Meinung :D), die kam auf Watchdog Seite nachdem der Client eine Remotemethode aufgerufen hat.


java.io.StreamCorruptedException: invalid stream header: 00000000
	at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:783)
	at java.io.ObjectInputStream.<init>(ObjectInputStream.java:280)
	at de.root1.simon.utils.Utils.getObject(Utils.java:339)
	at de.root1.simon.utils.Utils.unwrapValue(Utils.java:293)
	at de.root1.simon.ReadEventHandler.processInvokeMethod(ReadEventHandler.java:415)
	at de.root1.simon.ReadEventHandler.run(ReadEventHandler.java:105)
	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:885)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907)
	at java.lang.Thread.run(Thread.java:619)

Ich geh dem aber erstmal noch weiter auf den Grund :wink:

Okay, lass mich zusammenfassen:

Du baust eine Methode, die du aufrufst ein, und dann gehts. Baust du sie nicht ein, geht’s nicht?

Wie sieht die Methode denn aus?

noch immer im dunklen steh

  • Alex

Sehr komisch ich bekomm jetzt immer eine Exception, sobald ich die Methode aufrufe

  public void saveServerConfiguration(ClientData client, Hashtable<String, String> config) throws SimonRemoteException;```

Nehme ich die so wie sie hier ist fliegt die Exception, nehm ich die Hashtable raus funktioniert es.

Ich hab dir mal den Log vom Watchdog angehängt (bei ihm fliegt die Exception und bei ihm soll die Methode ausgeführt werden)

So ich hab das Problem glaube gefunden, sobald man 2 komplexe Datentypen rüberjagt gibts Probleme. http://root1.de/mantis/view.php?id=29
Ersetz ich einen durch nen String gehts aber wenns nen 2d Array wird (String[][]) gehts nicht mehr

Wie gesagt: Parameter und Rückgabewerte müssen “Serializeable” implementieren. Aber eigentlich ist das bei Hashtables des Fall. Muss ich mal genauer untersuchen.

  • Alex

Ich kann auch statt der Hashtable nen String Array nehmen und schon funktioniert es nicht mehr. An ClientData liegt es auch nicht, weil das in jeder Methode durch die Gegend geschickt wird, die Hashtable hab ich in einer anderen Methode auch schon einmal verschickt.

?? Strange. Das heisst du konntest die Hastable einmal verschicken und ein anderes mal nicht?

Hab eben nen JUnit Test gebastelt (commited gerade) der das verpacken und entpacken einer solchen Hashtable testet. Lief problemlos.

Ich hab die Methode
public Hashtable<String, String> loadServerConfiguration(ClientData clientData) throws SimonRemoteException;
Die funktionierte auf anhieb.

Aber ich hab das gerade noch einmal überprüft, hab ich die Methode mit ClientData und Hashtable als Argumente gehs nicht ändere ich es aber so ab
public void saveServerConfiguration(String address, String name, int port, Hashtable<String, String> config) throws SimonRemoteException;
funktioniert es, alternativ könnte ich auch ClientData drin lassen und die Hashtable mitm String ersetzen das ginge auch.

Ah, so langsam begreife ich.

  1. ClientData allein als Parameter im Methodenaufruf geht.
  2. HashTable<String, String> allein als Parameter im Methodenaufruf geht ebenfalls
  3. ClientData + HashTable<String, String> zusammen als Parameter im Methodenaufruf geht nicht

Hab ich das jetzt richtig verstanden?

Wenn ja, dann bastel ich mir dazu auch noch einen JUnitTest. Müsste da allerdings ne Ahnung haben wie dein ClientData aussieht.

Jep da liegst du richtig.
ClientData liegt mit in dem in dem TestProgramm was im Bugtracker liegt.

Gerade hab ich es noch einmal überprüft nimmst du diese Methode geht es auch nicht
public void saveServerConfiguration2(String[][] client, String[][] config) throws SimonRemoteException;

issue #29 fixed!