Hallo zusammen,
ich haette da mal wieder eine Frage zu meiner Klassenarchitektur:
Ausgangssituation:
Ein Objekt meiner Klasse AppModel besitzt einen bestimmten Datenstand (mehrere Datensätze, jeweils mit Versionsnummer)
Ein entfernter Server besitzt ebenfalls einen bestimmten Datenstand (analog oben)
Zwischen beiden erfolgt eine Kommunikation über ein eigenes, asynchrones Protokoll (via Socket), z.B.:
- App kann Versionsstand anfragen (sendet 1 Botschaft), "irgendwann" kommt die Antwort.
- App kann Datenstand aktualisieren (sendet je nach Umfang des Datenstandes 1-x einzelne Botschaften), "irgendwann" kommt Antwort "ok" o.ä.
Ziel:
Abgleich der Datenstände realisieren.
Was besteht bisher:
- Ich habe eine Klasse Jobs definiert, die in einer ArrayList alle zu versendenden Botschaften enthält. Außerdem weiß ein Job, auf welche Antwortbotschaft er zu warten hat.
- Mehrere Jobs verwaltet der JobHandler. Er übernimmt das eigentliche Senden (holt sich die erste Botschaft aus dem Job, versendet sie, und löscht sie dann aus dem Job) und Empfangen (empfängt grundsätzlich alle Nachrichten und prüft dann, ob es einen Job gibt, dessen Nachrichten komplett versendet wurden, für den aber noch keine gültige Antwort empfangen wurde).
- Alle Objekte, die sich als Listener registriert haben, werden zB darüber informiert, dass ein Job (den sie evtl selber beim HobHandler platziert haben), abgeschlossen wurde (und was die Antwortbotschaft war).
Soweit der Plan. In der Umsetzung hapert es momentan an einer Stelle: Auch wenn ich zB aus meinem Model heraus die Jobs beim JobHandler platziere, weiß ich nicht, mit welchem Mechanismus ich über dessen Abarbeiten informiert werden kann, ohne umständlich prüfen zu müssen, auf WELCHER Job abgearbeitet wurde.
Was mir alternativ in den Sinn kam, aber nicht besonders sinnvoll erscheint, wäre etwas wie folgendes (Natürlich in einem seperaten Thread ausgeführt):
meineMethode(){
Job Versionsabfrage anlegen
Job starten
while(!JobIstBeendet);
Version = Job.getErgebnis;
if VersionIstKorrekt
nichts tun
else
Job Versionsaktualisierung anlegen
Job starten
...
}
Alles anzeigen
Was mich daran stört ist nicht nur, dass ich mich da u.U. irgendwie blockieren könnte, sondern auch, dass es Fälle geben kann, in denen ein "Callback-Mechanismus" wie oben reichen würde, also alle Listener über das abarbeiten eines Jobs informiert würden, aber eben nicht immer... und so ein Gemische erscheint mir arg fehleranfällig...
Ich hoffe, ihr könnt mein Problem nachvollziehen und habt ein paar Ideen für mich,
Viele Grüße,
FargoTof