# Java Polling



## Hanskopf (11. Jun 2012)

Hey,
ich habe eine Funktion die nichts weiter tut als einen String zurückzuliefern.

```
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:

```
public String getStatus(){
   while(!check){
        } 
        return Status;
        }
    }
```


Was sieht eine vernünftige Lösung für das Problem aus ?


----------



## KrokoDiehl (11. Jun 2012)

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.


----------



## Gast2 (11. Jun 2012)

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:

```
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?


----------



## freez (11. Jun 2012)

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?


----------



## Hanskopf (11. Jun 2012)

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)


----------



## Gast2 (11. Jun 2012)

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.


----------



## KrokoDiehl (11. Jun 2012)

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 
	
	
	
	





```
get()
```
). Du kannst z.B. einen FutureTask (s. API-Link) machen in dem der Aufruf ausgeführt wird.


----------



## Hanskopf (11. Jun 2012)

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.


----------



## freez (11. Jun 2012)

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.


----------

