Wie kann man mit dem ask-Muster und der Überwachung umgehen?

8

Wie soll ich eine Ausnahme behandeln, die der DbActor hier auslöst? Ich bin mir nicht sicher, wie ich damit umgehen soll, sollte der Fehler Fall pipe?

%Vor%

Würde sich freuen, Ihre Gedanken zu bekommen, danke im Voraus!

    
graph1ZzLle 22.07.2013, 08:22
quelle

3 Antworten

6

Es gibt ein paar Fragen, die ich hier anhand der Fragen in Ihrem Codebeispiel sehen kann:

  
  1. Was kann ich tun, wenn ich das Standard-Supervisor-Verhalten in der Definition für die Behandlung von Ausnahmen überschreibe?

  2.   
  3. Wenn ich ask verwende, welche Arten von Dingen kann ich tun, wenn ich ein Failure Ergebnis für die Future erhalte, auf die ich warte?

  4.   

Beginnen wir zuerst mit der ersten Frage (normalerweise eine gute Idee). Wenn Sie die Standard-Supervisor-Strategie überschreiben, können Sie die Art und Weise ändern, in der bestimmte Arten von nicht behandelten Ausnahmen im Kind-Akteur in Bezug darauf behandelt werden, was mit diesem gescheiterten Kind-Akteur geschehen soll. Das Schlüsselwort in diesem vorherigen Satz ist unhandled . Für Akteure, die eine Anfrage / Antwort ausführen, möchten Sie möglicherweise bestimmte Ausnahmen behandeln und bestimmte Antworttypen zurückgeben (oder die Upstream-Zukunft versäumen, mehr dazu später), anstatt sie unbehandelt zu lassen. Wenn eine unbehandelte Ausnahme auftritt, verlieren Sie grundsätzlich die Fähigkeit, dem Absender mit einer Beschreibung des Problems zu antworten, und der Absender erhält dann wahrscheinlich stattdessen eine TimeoutException , da ihre Future niemals abgeschlossen wird. Sobald Sie herausgefunden haben, was Sie explizit behandeln, können Sie alle anderen Ausnahmen berücksichtigen, wenn Sie Ihre benutzerdefinierte Supervisor-Strategie definieren. In diesem Block hier:

%Vor%

Sie haben die Möglichkeit, einen Ausnahmetyp einem Fehler Directive zuzuordnen, der definiert, wie der Fehler vom Standpunkt der Überwachung aus gehandhabt wird. Die Optionen sind:

  1. Stop - Beenden Sie den untergeordneten Akteur vollständig und senden Sie ihm keine weiteren Nachrichten mehr

  2. Fortsetzen - Fortsetzen des fehlgeschlagenen untergeordneten Elements, ohne es neu zu starten und somit seinen aktuellen internen Status beizubehalten

  3. Neustart - Ähnlich wie resume, aber in diesem Fall wird die alte Instanz verworfen und eine neue Instanz erstellt und der interne Status zurückgesetzt (preStart)

  4. Eskalieren - Erhöhen Sie die Kette zum übergeordneten Element des Supervisors

Nehmen wir also an, dass Sie mit einem SQLException fortfahren möchten und allen anderen, die Sie neu starten möchten, der Code folgendermaßen aussehen würde:

%Vor%

Nun zur zweiten Frage, was zu tun ist, wenn Future selbst eine Failure Antwort zurückgibt. In diesem Fall, ich denke, es hängt davon ab, was als Folge dieser Future geschehen sollte. Wenn der restliche Akteur selbst für das Ausfüllen der http-Anfrage verantwortlich ist (sagen wir mal, dass httpCtx eine complete(statusCode:Int, message:String) -Funktion darauf hat), dann könntest du so etwas tun:

%Vor%

Wenn nun ein anderer Upstream-Akteur für das Ausfüllen der http-Anfrage zuständig war und Sie auf diesen Akteur antworten mussten, könnten Sie etwas wie folgt machen:

%Vor%

Bei diesem Ansatz wird davon ausgegangen, dass Sie im Ergebnisblock zunächst das Ergebnisobjekt vor dem Antworten massieren möchten. Wenn Sie dies nicht tun möchten und die Ergebnisbehandlung auf den Absender verschieben möchten, können Sie einfach Folgendes tun:

%Vor%     
cmbaxter 22.07.2013, 13:04
quelle
3

Es gibt eine Vorlage für den Aktivator ( Ссылка ), die ein schönes Beispiel für die Verknüpfung von Ask und Supervision darstellt: Ссылка .

    
Endre Varga 22.07.2013 11:06
quelle
0

Für einfachere Systeme möchte man vielleicht alle Fehler auffangen und weiterleiten. Dafür habe ich diese kleine Funktion gemacht, um die Empfangsmethode zu umhüllen, ohne sich um die Überwachung zu kümmern:

%Vor%

Sie können es dann in eine Paketdatei einfügen und la akka.pattern.pipe und so importieren. Offensichtlich wird dies nicht mit Ausnahmen umgehen, die durch asynchronen Code ausgelöst werden.

    
Bijou Trouvaille 16.01.2015 13:06
quelle

Tags und Links