2017-02-28 5 views
1

Wie kann ich einen Azure Service Fabric Actor bei der Erstellung initialisieren?Azure Service Fabric Actor-Initialisierung

Ich habe versucht, Schauspieler Konstruktor mit Initialisierungsmethode überladen und es hat nicht funktioniert.

Muss ich die Initialisierungsmethode vom Client aufrufen, nachdem der Akteur erstellt wurde, oder gibt es eine Möglichkeit, den Akteur automatisch beim Erstellen initialisieren zu lassen?

Antwort

1

Ein Actor wird zuerst erstellt, wenn Sie eine Methode aufrufen. Wenn Sie also einen Actor initialisieren müssen, der noch nicht existiert, müssen Sie sicherstellen, dass er zuerst aktiv wird. Es kann das nicht alleine tun.

Sie könnten eine Methode erstellen, um den Actor zu initialisieren und ihn zur Schnittstelle des Actors zu machen.

Sie können auch die OnActivateAsync Methode verwenden, die für jede Aktivierung ausgelöst wird.

Lesen Sie mehr über den Actor-Lebenszyklus here.

+0

Was ich tun möchte, ist mein „initialisieren“ custom-Methode aufrufen, nachdem der Schauspieler mit ActorProxy zu schaffen. ich versuchte, es unter Verwendung Konstruktor Überlastung: 'public MyActor (ActorService service, ActorID id) : base (Service, id) { InitializeActor(); } ' aber es funktioniert nicht. So die einzige Möglichkeit, die "Initialize" -Methode nach der Actor-Erstellung ist von außerhalb des Schauspielers 'IMyActor myActor = ActorProxy.Create (" myActor "); myActor.InitializeActor(); ' oder mit der' OnActivateAsync'-Methode, richtig? – Shkire

+0

Der Aufruf vom Konstruktor sollte funktionieren. Aber der Konstruktor wird nur aufgerufen, wenn der Actor aktiviert ist. Und das geschieht, indem Sie eine Operation aufrufen. – LoekD

0

Das Actor-Framework unterscheidet nicht viel zwischen der Erstellung eines Actors beim ersten Mal und der Aktivierung eines Actors, der deaktiviert wurde und ruht. Beide Aktionen erstellen eine neue Instanz der Actor-Implementierung (Aufrufe .ctor) und rufen dann OnActivateAsync auf. Es tut dies, bevor es eine Methode ausführt, die an den Actor gesendet wird. Es gibt keine Möglichkeit für Sie, eine Instanz eines Actors zu erstellen, ohne eine Methode auf der Schnittstelle des Actors aufzurufen. Es ist alles Teil der zugrunde liegenden ActorBase und ActorManager Behandlung von Nachrichten.

Auch slighlty je nach Art der Persistenz Sie für Ihre Schauspieler gewählt haben (None, Volatile oder Persisted), der ActorService die Schauspieler Hosting speichert eine Persistenz Schlüssel mit dem IActorStateProvider mit dem Schauspieler/ActorService verbunden. So "kennt" der ActorService auch seine Schauspieler. Wenn Sie eine ActorService über bekannte Schauspieler fragen, fragt er es StateProvider ist für

Wenn Sie einige Initialisierungscode das erste Mal ausgeführt werden soll, und nur das erste Mal, wenn ein Schauspieler aktiviert wird, dann könnte man einen Zustand Schlüssel für das hinzufügen Schauspieler in OnActivateAsync:

protected override async Task OnActivateAsync() 
    { 
     ActorEventSource.Current.ActorMessage(this, "Actor activated."); 

     var initialized = await this.StateManager.ContainsStateAsync("initalized"); 
     if (!initialized) await Initialize(); 
    } 

    private async Task Initialize() 
    { 
     ActorEventSource.Current.ActorMessage(this, "Actor initialized."); 

     await this.StateManager.AddStateAsync("initialized", true); 
    } 
Verwandte Themen