2016-04-07 10 views
1

Nur zur Verdeutlichung: Wo wird die Ausführung eines Befehls ausgeführt, wenn die Ausführung nicht einfach eine Zustandsaktualisierung ist (wie in den meisten Beispielen gefunden) online)Akka Persistence: Wo wird die Ausführung des Befehls ausgeführt, wenn es nicht einfach eine Zustandsaktualisierung ist

zum Beispiel in meinem Fall

  • Der Befehl ist FetchLastHistoryChangeSet, die in Abrufen der letzten Geschichte changeset von einem externen Service bestehen auf, wo wir das letzte Mal aufgehört haben. Mit anderen Worten, die Zeit der letzten Änderung der Vorgeschichte ChangeSet abgeholt.

  • Die Ereignis würde HistoryChangeSetFetched (ChangeSet, Zeit) sein. In Korrelation zu dem, was oben gesagt wurde, sollte die Zeit, in der neuesten Veränderung der neu Geschichte ChangeSet Fetched (gemäß dem Befehlsereignis zur Zeit behandelt wird)

nun in alle Beispiel, dass ich sehe, es ist immer: (i) Validierung des Befehls, dann, (ii) persistierende das Ereignis und schließlich (iii) Umgang mit dem Ereignis.

Es ist in Handhabung des Ereignisses, die ich benutzerdefinierten Code hinzugefügt haben, zusätzlich zur UpdateState Logik. Der benutzerdefinierte Code wird normalerweise nach der Aktualisierungsstatusfunktion hinzugefügt. Aber diese Gewohnheit besteht meistens darin, die Nachricht an den Absender zurückzusenden oder an den Ereignisbus zu senden.

Gemäß meinem Beispiel ist es klar, dass ich ganz wenige Betriebe tun müssen, um tatsächlich zu nennen Persist (HistoryChangeSetFetched (ChangeSet, Zeit)). In der Tat brauche ich die neue Änderungsmenge und die Zeit der neuesten Änderung.

Der einzige Weg, ich kann sehen, ist der Abruf im Validierung der Befehl

Das ist zu tun:

case FetchLastHistoryChangeSet => val changetuple = if ValidateCommand(FetchLastHistoryChangeSet) persit(HistoryChangeSetFetched(changetuple._1, changetuple._2)) { historyChangeSetFetched => 
    updateState(historyChangeSetFetched) 
} 

Wo die ValidateCommand (FetchLastHistoryChangeSet)

haben würde als Logik, um die letzte changeSet-Zeit zu lesen (neueste Änderung des changeSet), hole einen neuen Changeset, wenn dieser existiert, erhalte den Zeitpunkt seiner neuesten Änderung und gebe das Tupel zurück.

Meine Frage ist, ist, wie es funktionieren soll. Validierungsbefehl kann so komplex sein? d.h. tatsächlich den Befehl ausführen?

Antwort

1

Wie heißt es in der Dokumentation: „Validierung kann alles bedeuten, von den einfachen Inspektion einer Feld der Befehlsnachricht mit mehreren externen Diensten zu einem Gespräch auf“

Ich denke also, was Sie versuchen zu tun ist genau richtig. Jede Interaktion mit einem externen Dienst muss in der Befehlsvalidierungsphase erfolgen.

Verwandte Themen