java-forum.org - Java programmieren aus Leidenschaft

Zurück   java-forum.org - Java programmieren aus Leidenschaft > Java - Programmierung > Netzwerkprogrammierung

Netzwerkprogrammierung Fragen zu Client-/Server-Programmierung sowie zu verteilten Anwendungen (RMI, CORBA etc.)

Antwort    
Themen-Optionen Thema durchsuchen Ansicht
Alt 03.05.2012, 10:17   #1 (permalink)
Benutzer
int
 
Registriert seit: 02.11.2010
Fachbeiträge: 50
Abgegebene Danke: 8
Erhielt 0 Danke für 0 Beiträge
Standard Asynchrone Methoden nacheinander aufrufen

Hallo,

ich habe hier eine GWT-Anwendung, welche auf eine Datenbank via Hibernate zugreift.
Für dem Datentransfer benutze ich RPCs.
Ich möchte einen Datensatz aus einer Datenbank auslesen, und in eine Liste speichern und zurückgeben.

Ich zeig euch mal den Code:
Java Code: Quelltext in neuem Fenster öffnen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
    public List<DataObjectDTO> loadObjectList()  {
        final List<DataObjectDTO> objects = new ArrayList<DataObjectDTO>(0);
 
 // rufe die Methode zum Laden auf Serverseite auf
        DBConn.getService().loadAllObjects(new AsyncCallback<List<DataObjectDTO>>() {
            
            @Override
            public void onSuccess(List<DataObjectDTO> result) {
                
                for(DataObjectDTO gr : result) {
                    objects.add(gr);
                }
                
 
// lass hier die Größe der Liste ausgeben (1)
            }
            
            @Override
            public void onFailure(Throwable caught) {
            
                
            }
        });
        
// Lass hier erneut die Listengröße zurückgeben (2)
        return objects;
    }

Wenn ich bei (1) die Größe zurückgeben lasse, ist dieses Ergebnis richtig wie erwartet.
Bei (2) ist die Luste aber leer, weil die Methode ja parallel aufgerufen wird...

Wie kann ich es so machen, dass gewartet wird, bis die Liste komplett gefuellt ist?
Fabulus ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Alt 03.05.2012, 10:23   #2 (permalink)
Java-Forum Team
Moderator
 
Benutzerbild von SlaterB
 
Registriert seit: 13.11.2005
Fachbeiträge: 32.021
Abgegebene Danke: 0
Erhielt 2.623 Danke für 2.583 Beiträge
final Object monitor = new Object();

warten:
monitor.wait();

aufwecken:
monitor.notify(); am Ende der AsyncCallback-Aktioen,
jeweils in synchronized-Blocks, die dir hoffentlich was sagen

paar Gefahren gibt es, notify vor dem wait wäre schlecht, aber so schnell wird das wohl nicht ausgeführt,
nicht ausgeführtes notify() wegen Exception wäre auch schlecht

nicht ewig zu warten sondern nur bestimmte Zeiten und dann gegebenenfalls selber anders erscheinen
wäre die etwas sichere Variante
__________________
Hansa wird Meister.
SlaterB ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Alt 03.05.2012, 10:25   #3 (permalink)
Stammbenutzer
Viertel Gigabyte
 
Benutzerbild von Marcinek
 
Registriert seit: 12.07.2010
Fachbeiträge: 3.756
Abgegebene Danke: 159
Erhielt 441 Danke für 430 Beiträge
Indem on sucess wiederum ein event feuert, worauf deine Komponenten warten.

==> Du musst das also in die on success methode implementieren.
__________________
Wie man Fragen richtig stellt.

Bei jedem Thread kommt nach einer völlig absurden Fehlerbeschreibung ein "habs gelöst" mit einer teils noch absurderen Lösung.
(timbeau)
Marcinek ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Alt 03.05.2012, 10:45   #4 (permalink)
Benutzer
int
Themenstarter
 
Registriert seit: 02.11.2010
Fachbeiträge: 50
Abgegebene Danke: 8
Erhielt 0 Danke für 0 Beiträge
Also soll ich die wait() und notify() auf die Liste anwenden?
Ich weiss, was synchronized-Blöcke sind, habe sie jedoch noch nie benutzt...

Habe es jetzt so testweise implementiert:
Java Code: Quelltext in neuem Fenster öffnen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
 public List<DataObjectDTO> loadObjectList()  {
        final List<DataObjectDTO> objects = new ArrayList<DataObjectDTO>(0);
    synchronized (this){
        try {
            objects.wait();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
 
 // rufe die Methode zum Laden auf Serverseite auf
        DBConn.getService().loadAllObjects(new AsyncCallback<List<DataObjectDTO>>() {
            
            @Override
            public void onSuccess(List<DataObjectDTO> result) {
                
                for(DataObjectDTO gr : result) {
                    objects.add(gr);
                }
                synchronized(this) {
                       objects.notify();
                }
            }
            
            @Override
            public void onFailure(Throwable caught) {
            
                
            }
        });
        return objects;
    }

Was kommt in die Klammern von synchronized?
Ich bekomme beim Starten der Anwendung folgende Fehler:
Code:
 [ERROR] Line 516: The method wait() is undefined for the type List<DataObjectDTO>
[ERROR] Line 517: No source code is available for type java.lang.InterruptedException; did you forget to inherit a required module?
[ERROR] Line 532: The method notify() is undefined for the type List<DataObjectDTO>
Ich denke, ich muss in der xml-Datei ein bestimmtes Modul einbinden, oder? Jedenfalls war dies immer der Fall, wenn kein Sorcecode für etwas gefunden wurde...

Edith sagt:
Zitat:
Multithreading and Synchronization: JavaScript interpreters are single-threaded, so while GWT silently accepts the synchronized keyword, it has no real effect. Synchronization-related library methods are not available, including Object.wait(), Object.notify(), and Object.notifyAll(). The compiler will ignore the synchronized keyword but will refuse to compile your code if the Object's related synchronization methods are invoked.
Hm, damit gehts dann wohl leider nicht...

Geändert von Fabulus (03.05.2012 um 10:58 Uhr)
Fabulus ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Alt 03.05.2012, 10:58   #5 (permalink)
Java-Forum Team
Moderator
 
Benutzerbild von SlaterB
 
Registriert seit: 13.11.2005
Fachbeiträge: 32.021
Abgegebene Danke: 0
Erhielt 2.623 Danke für 2.583 Beiträge
das sind ja äußerst merkwürdige Fehlermeldungen für Methoden der Klasse Object, die nun wirklich jedes einzelne Java-Objekt haben sollte,

wenn diese nicht vorhanden sind, warum auch immer, sehe ich als Alternative nur noch Thread.sleep(),
ist das erlaubt? sonst wäre Warten nicht gut hinzubekommen
(von allen möglichen anderen Problemen, die so etwas merkwürdiges impliziert, abgesehen)

ist es denkbar, dass die Methode nichts zurückgibt und onSuccess() stattdessen irgendwas aufruft?

-------

unter Ignorierung der Fehlermeldungen noch weiter zu dem Thema, auch wenn vielleicht nicht zu verwenden:

> Also soll ich die wait() und notify() auf die Liste anwenden?
in zwei Hinsichten bemerkenswert, erstens habe ich doch geschrieben worauf du wait/ notify aufrufen sollst,
ein neues Object monitor,

eine vorhandene Liste zu nehmen ist allerdings durchaus eine bessere Alternative von dir,
erstaunlich ist dann aber für mich, dass du nicht die lokale Variable objects nimmst sondern groups, welches im geposteten Code gar nicht weiter erklärt wird

----

in jedem Fall falsch wäre, das wait() VOR dem loadAllObjects() zu stellen, wenn DAVOR gewartet wird, dann kommt der AsyncCallback doch nie zur Arbeit, nie werden Listen geladen und vielleicht notify() aufgerufen usw.,
das wait() muss selbstverständlich dahinter, am Ende der Methode vor der Rückgabe

erst das Taxi anrufen, dann an der Straße warten, nicht umgekehrt

--------

edit:
also mit Thread.sleep(Zeit x) in einer Schleife könntest du auf normaleren Wege warten,
z.B. bis ein boolean von der Methode gesetzt wird (finale lokale boolean[]-Variable der Lönge 1)

bei 'single-threaded' ist allerdings nicht zu erwarten, dass dann AsyncCallback überhaupt je drankommt, geht also wohl auch nicht..
__________________
Hansa wird Meister.

Geändert von SlaterB (03.05.2012 um 11:01 Uhr)
SlaterB ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Alt 03.05.2012, 11:14   #6 (permalink)
Benutzer
int
Themenstarter
 
Registriert seit: 02.11.2010
Fachbeiträge: 50
Abgegebene Danke: 8
Erhielt 0 Danke für 0 Beiträge
groups war das gleiche Objekt, hab es nur umbenannt gehabt.

Das mit dem Taxi und dem wait klingt logisch, danke!

Ich wollte es jetzt so versuchen:
Java Code: Quelltext in neuem Fenster öffnen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
  public List<DataObjectDTO> loadObjectList()  {
        final List<DataObjectDTO> objects = new ArrayList<DataObjectDTO>(0);
    final boolean[] wait = new boolean[1];
    wait[0] = false;
 // rufe die Methode zum Laden auf Serverseite auf
        DBConn.getService().loadAllObjects(new AsyncCallback<List<DataObjectDTO>>() {
            
            @Override
            public void onSuccess(List<DataObjectDTO> result) {
                
                for(DataObjectDTO gr : result) {
                    objects.add(gr);
                }
               wait[0] = true;
            }
            
            @Override
            public void onFailure(Throwable caught) {
             wait[0] = true;
            }
        });
 
      while(!wait[0]) {  }
 
        return objects;
    }

Dies endet aber in einer Endlosschleife und das Skript bricht ab..
Was ich merkwürdig finde, ist, dass JavaScript das ganze Singlethreaded ausführt, aber die DB-Abfragen parallel laufen.

Geändert von Fabulus (03.05.2012 um 11:17 Uhr)
Fabulus ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Alt 03.05.2012, 11:44   #7 (permalink)
Java-Forum Team
Moderator
 
Benutzerbild von SlaterB
 
Registriert seit: 13.11.2005
Fachbeiträge: 32.021
Abgegebene Danke: 0
Erhielt 2.623 Danke für 2.583 Beiträge
im Normalfall wiederum sollte in Zeile 23 ein sleep in die Schleife,
aber wie gesagt wegen Singlethreaded wohl nicht drin

so merkwürdig ist das nicht, DB ist was anderes als das Java-Programm,
lasse also die Methode hier enden, du kannst nicht schon mit den Daten rechnen, wer immer der Aufrufer ist, muss sich auch mit Mittagspause zufrieden geben

am Ende von onSuccess() kannst du eine andere Methode aufrufen, dann gehts weiter
__________________
Hansa wird Meister.
SlaterB ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Antwort    

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Methoden mit wechselndem Namen in Schleife aufrufen cybermog Java Basics - Anfänger-Themen 11 25.02.2011 15:26
Probleme beim Aufrufen von Methoden. oshgowol Allgemeine Java-Themen 1 26.11.2008 17:44
Private Methoden von auserhalb aufrufen rogas Java Basics - Anfänger-Themen 2 08.01.2008 14:10
Methoden von externen Klassen aufrufen alshir Java Basics - Anfänger-Themen 3 05.12.2007 09:14
Applet Methoden aus Javascript aufrufen vegeta Deployment 3 10.03.2006 12:09


Lesezeichen

Forumregeln
Es ist Ihnen erlaubt, neue Themen zu verfassen.
Es ist Ihnen erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are aus
Pingbacks are aus
Refbacks are aus


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:04 Uhr.


Powered by vBulletin® Version 3.8.6 (Deutsch)
Copyright ©2000 - 2013, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 3.3.2
Thanks for Smilies by smilies.4-user.de