Java Polling

Hanskopf

Mitglied
Hey,
ich habe eine Funktion die nichts weiter tut als einen String zurückzuliefern.
Code:
    public String getStatus(){
        return Status;
    }


Dies soll sie jedoch erst dann tun, sobald eine bestimmte boolean-Variable "check" den Wert true annimmt.

Bisher habe nur die Idee das mit einer Endlosschleife zu lösen:
Code:
    public String getStatus(){
   while(!check){
        } 
        return Status;
        }
    }


Was sieht eine vernünftige Lösung für das Problem aus ?
 
So ein "active wait" ist alles andere als gut. Ich würde an der Stelle mit Obejct.wait() und Object.notify() arbeiten, wenn du keine anderen Thread/Concurrency-Mechanismen in Verwendung hast.
 
Wer ruft diese Methode denn auf?
Wärs nicht besser wenn derjenige zuerst prüft ob er nen Status abholen kann?

Oder vielleicht sogar so:
Java:
public String getStatus(){
  if (!check) {
    throw new IllegalStateException("Kann den Status noch nicht abrufen");
  }

  return Status;
}

So eine Schleife wie du sie gemacht hast macht aber definitiv keinen Sinn. Erklär nochmal etwas mehr zum Hintergrund. Wer ruft den Status ab? Wie? Wann?
 
nun, das kommt ganz auf deine Anforderungen an. So wie du es umgesetzt hast, blockiert die Methode [c]getStatus()[/c] so lange, wie check == false. Wenn check nie true wird, so blockiert sie ewig.

Wie brauchst du es denn? Was ruft denn getStatus() auf und wann wird check mal true?
 
Die boolean-Variable "check" wird auf true gesetzt sobald eine gewisse Funktion ihre Arbeit abgeschlossen hat...

Und aufgerufen wird "getStatus()" von einer JSP....ein Client (browser) stellt eine Anfrage an eine JSP...die JSP ruft die JavaMethode (aus einer JavaBean) auf ....der client soll dann so lange auf eine Antwort warten bis diese verfügbar ist. (long polling)
 
Wäre es dann nicht besser das so zu lösen:
JSP ruft die "gewisse Methode auf" und wartet bis diese Fertig ist. Danach wird dann die Methode geStatus() aufgerufen. Mir erschließt sich das polling an der Stelle noch nicht.
 
Kannst du dann nicht einen anderen Status á la "noch nicht fertig" zurückgeben? Wenn du ansonsten etwas vorhast wie auf das Ergebnis des Aufrufs zu warten, dann bietet sich etwas wie das Future-Interface an (Methode
Code:
get()
). Du kannst z.B. einen FutureTask (s. API-Link) machen in dem der Aufruf ausgeführt wird.
 
Also dann nochmal etwas genauer:


Ich habe eine Datenbank.

Und eine Methode die ausgeführt wird sobald sich in der Datenbank etwas ändert. Nennen wir diese Methode "checkDB()". "checkDB()" liest ne ganze Menge Daten aus der Datenbank aus und verarbeitet die dann erstmal. Sobald das ganze abgeschlossen wird "check" auf true gesetzt.


Ein Client soll die Daten erhalten sobald sich in der Datenbank was geändert hat UND "checkDB()" mit seiner Arbeit fertig ist.

Hierzu stellt der Client eine Anfrage an die JSP. Wenn die Daten aber noch nicht verarbeitet wurden beziehungsweise sich in der Datenbank noch nichts geändert hat soll der client keine leere antwort bekommen und wiedholt die Anfrage stellen müssen....stattdessen soll serverseitig gewartet werden bis sich in der Datenbank was geändert hat UND "checkDB()" mit seiner Arbeit fertig ist und das Ergebnis dann als Ausgabe über die JSP geliefert werden.
 
Ich bin mir nicht sicher, ob dann nicht auch irgendwann ein Timeout beim Warten auf den Server zuschlägt (Server, aber auch Browserseitig). Ausserdem "friert" dein Browsertab ein. Wieso willst du so vorgehen?

ich fände es sinnvoller, wenn du (vielleicht per Ajax) regelmäßig prüfst (polling), ob sich was ändert und dann ggfs. die ganze Seite oder nur Teilbereiche aktualisierst.

Alternativ würde ich eine "WAIT" Seite erstellen, die regelmäßig prüft ob was neues da ist. Wenn nicht, wird sie wieder dargestellt, wenn ja, dann die Daten gezeigt werden.
 
Zuletzt bearbeitet:

Neue Themen


Zurück
Oben