2016-08-20 16 views
1

Ich habe einen Schauspieler (Person), die ich in der Lage sein möchte, die Nachrichten während eines Staates zu stash. Das Problem ist, dass ich mir nicht sicher bin, wie ich das am besten erreichen soll.akka.net Verstecke Nachrichten während eines bestimmten Status eines Schauspielers

Sagen wir, ich habe ein paar Befehle.

ChangeAddress 
ChangePhoneNumber 
BeginMove 
FinishMove 

Während ich bin in der Mitte einer Bewegung (nach BeginMove gestartet wurde und bevor FinishMove) Ich möchte Updates verhindern Adresse und Telefonnummer anzeigen und Wiedergabe nur alle Ereignisse nach dem Umzug beendet ist. Ich benutze einen ReceivePersistentActor und jeder Befehl ist eine andere Klasse.

Im Moment dachte ich über eine Statusflagge des Schauspielers nach, aber obwohl die Funktion "Bekommen/Nicht-Bekommen" natürlicher wäre, kann ich nicht sehen, wie man sie auf die verschiedenen Befehle anwendet.

Auch als eine Nebenfrage gibt es ein gutes Muster für die Aufschlüsselung der Anzahl der Befehle und Wiederherstellungen, die geschrieben werden müssen, wie ein Akteur mehr Befehle/Ereignisse verarbeiten muss?

+0

I aktualisiert haben meine Antwort mit dem Fluss Ich denke, Sie brauchen – tomliversidge

Antwort

2

Akka hat bereits das Jahr:

http://getakka.net/docs/working-with-actors/Stashing%20Messages

Sie Nachrichten in einem Zustand bunkern würden, wie sie empfangen werden, dann unstash, wenn Sie bereit sind, in dem entsprechenden Zustand zu überführen. Die gespeicherten Nachrichten werden dann zur Verarbeitung an das Postfach weitergeleitet.

In Ihrem Beispiel würden Sie einen BeginMove Befehl erhalten und in einen beweglichen Zustand übergehen, indem Sie Become(Moving) aufrufen. Das nächste Mal, wenn eine Nachricht verarbeitet wird, befinden Sie sich in diesem neuen Status. Innerhalb Ihrer Moving-Methode würden Sie die Nachrichtenhandler Receive<ChangeAddress> so konfigurieren, dass sie die Nachricht und alle anderen Handler speichern, um während des Verschiebens das gewünschte Verhalten zu haben. Zu einem bestimmten Zeitpunkt in der Zukunft benötigen Sie einen Befehl FinishMove, der Ihr Verhalten wieder auf das ändert, was es vor dem Start der Verschiebung war und löscht alle Nachrichten. Zu diesem Zeitpunkt werden alle gespeicherten Nachrichten in Ihrem ursprünglichen Verhaltenszustand verarbeitet. Dies ist alles nicht blockierende.

void OriginalState() 
    { 
     Receive<ChangeAddress>(s => 
     { 
      // change address logic 
     }); 

     Receive<BeginMove>(msg => 
     { 
      Become(Moving); 
     } 
    } 

void Moving() 
    { 
     Receive<ChangeAddress>(s => 
     { 
      Stash.Stash(); 
     }); 

     Receive<FinishMove>(msg => 
     { 
      Become(OriginalState); 
      Stash.UnstashAll(); 
     } 
    } 

Siehe switchable behaviours für weiteren Beispielcode, wie Sie Ihre Zustände konfigurieren Ihre Nachrichtentypen zu handhaben.

Eine Möglichkeit, Dinge aufzulösen, besteht darin, das Verhalten gegebenenfalls an untergeordnete Akteure zu delegieren. In diesem Stadium werden jedoch eher Designprobleme.

0

Erste Dinge zuerst: Solange es keine PipeTo() - Aufrufe gibt - es gibt nichts zu ändern.

Jeder Akteur verarbeitet jeweils eine Nachricht. Wenn er eine Liste von Anfragen erhält, werden sie nacheinander in der Reihenfolge ihrer Reihenfolge verarbeitet.

Um Unterbrechungen bei der Verarbeitung eines langen Anrufs zu vermeiden (wie bei Verwendung von db) - staple ich meinen Akteur - siehe ein Beispiel mit empfangendem Akteur.So können:

  1. Stop-Verarbeitung Posteingang
  2. verhindert Verfahren durch den Dispatcher zu stoppen (Timeout)
  3. vermeidet einen Vorrat mit, da es nicht

    benötigt wird
    public class ProcessActor : ReceiveActor{ 
    
    public ProcessActor() { 
    
        Receive <ChangeAddress> (
         message = > { 
          BecomeStacked(ProcessingOrDoNothing); 
          //{do the job here} 
          UnbecomeStacked(); 
         }); 
    } 
    
        public void ProcessingOrDoNothing(){} 
    
    } 
    
+0

Können Sie erweitern, was BecomeStacked und UnbecomeStacked tun? Können Sie den Code posten? – tomliversidge

+0

das sind akka Interna und werden verwendet, um den Akteursstatus zu ändern. Wenn der Status geändert wird und es kein "Receive" gibt, wird die Postfachverarbeitung angehalten. UnbecomeStacked setzt den vorherigen Stapelbefehl zurück. – profesor79

+0

Ok danke, ich hatte die vergessen, wie ich schon immer Become benutzt habe. – tomliversidge

Verwandte Themen