Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Ich muss in unterschiedlichen Intervallen HTTP Get requests absetzen.
Wenn ich jedoch einen Fehler zurückbekomme (Ziel nicht erreichbar, Webseite down, ...) erhalte ich einen Fehler und muss:
Die URL für den HTTP get später nochmal senden.
Es kann aber sein, dass inzwischen eine neue Abfrage gesendet werden soll.
Wie mache ich das am besten? Mit einem Producer/Consumer:
Meine Classe (der Producer) legt alle HTTp get url´s in eine LinkedBlockingQueue.
Der Consumer wartet bis etwas in der Queue liegt, und arbeitet dann alles ab, was darin liegt.
Falls ein HTTP get fehl schlägt, legt er diese URL wieder zurück in die Queue. So wäre der Consumer aber auch Producer(?)
Ich sehe in diesem Modell eigentlich kein Problem. Du kannst aber auch folgendes machen:
Der Producer ist gleichzeitig auch Observer von den Requests, die er in die Queue gelegt hat. Bei Erfolg/Fehler eines Requests bekommt der Producer auf jeden Fall bescheid. Wenn der Request fehlgeschlagen ist legt der Producer den Request wieder in die Queue.
Danke, ist mir noch nicht ganz klar:
Wie bekommt der Producer mit, ob ein http request fehl schlägt? Ist es nicht so, das er nur bescheid bekommt, das ein Eintrag aus der Queue genommen wird?
Eventuell hast ein kurzes Beispiel?
Du kapselst deine Http-Requests in eine eigene Klasse. Auf Instanzen dieser Klasse kann man dann listener registrieren, álá
Java:
request.addCompletionListener(new HttpRequestCompletionListener() {
public void requestSucceeded(HttpRequest request, HttpResponse response)
{ /* request hat funktioniert */ }
public void requestFailed(HttpRequest request, IOException error)
{
queue.add(request);
}
});
Der Producer registriert also auf jeden HttpRequest, den er in die Queue steckt, einen Listener (vllt macht es auch Sinn, den Listener bei der Queue und nicht beim Request zu registrieren). Wenn dann der Consumer den Request behandelt kann er das entsprechende Event auslösen und samit dem Producer Feedback geben.
OK, verstanden. Aber was spricht dagegen, statt dem Producer zu informieren, gleich das Request wieder in die Queue zu legen?
Außerdem kann ich dem Producer gleich fix einem Listener zuteilen, oder? Es wäre ja egal bei welchem Request der Fehler kommt.
Es wird auch nur einen Producer geben.
An sih spricht nichts dagegen. Aber wenn du später mehere Producer hast oder bestimmte Requests eben nicht wiederholt werden sollen (oder vllt nur 3 mal, danach abbrechen?) musst du viel an deinem Code ändern. Wenn du es direkt so modular aufbaust sparst du dir bei solchen Änderungen viel Arbeit.