Beim Lesen des Scala-Dokuments habe ich Schwierigkeiten, den Unterschied zwischen fragen und erzählen zu verstehen.
Ссылка gibt an:
! bedeutet "Feuer und Vergessen", z.B. Senden Sie eine Nachricht asynchron und sofort zurückkehren. Auch bekannt als Tell.
? sendet asynchron eine Nachricht und gibt ein Future zurück, das a darstellt mögliche Antwort. Auch bekannt als fragen.
Wenn der Schauspieler, den ich benutze, eine Webanfrage erzeugt, was ist dann der Unterschied zwischen fragen und erzählen? In beiden Fällen wird die Anforderung asynchron generiert und muss auf eine Antwort warten. Mit anderen Worten: Wie kann "report" sofort zurückgegeben werden, wenn der Akteur einen Web-Service aufruft und auf eine Antwort wartet?
Es klingt, als ob Sie bereits den grundlegenden Unterschied zwischen ask
und tell
kennen, aber nicht verstehen, wie tell
verwendet werden könnte, um andere Akteure in die Verarbeitung von HTTP-Anfragen einzubeziehen.
Damit es sinnvoll ist, tell
in Ihren HTTP-Request-Handlern zu verwenden, müssen Sie einen HTTP-Server verwenden, der nicht verlangt, dass die Request-Handler return ihre Antworten zurückgeben. Spray ist ein solcher HTTP-Server.
In Spray gibt ein Anforderungshandler seine Antwort nicht zurück; Es erhält ein RequestContext-Objekt, und das Beantworten der Anfrage beinhaltet den Aufruf einer Methode. Sie können diesen RequestContext einfach an einen anderen Akteur senden, der dann auf die Anfrage antworten kann:
%Vor%Dann könnte der von barActor angesprochene Akteur
sagen %Vor% Die Tatsache, dass Spray den Anforderungskontext in ein Objekt packt, das von jedem Akteur weitergegeben und vervollständigt werden kann, ist für das Akteurmodell sehr passend. Wenn Ihr Web-Framework andererseits erfordert, dass der aufgerufene Handler die Antwort zurückgibt, dann können Sie, wenn Sie einen anderen Akteur einbeziehen möchten, die Option ask
verwenden.
Typesafe hat angekündigt, dass Play
bald Spray darunter verwenden wird. Ich hoffe, dass Play
dann erlauben wird, dass Anforderungen an andere Akteure zur Verarbeitung gesendet werden.
Der Unterschied zwischen ask
und tell
liegt in der Sicht des Nachrichtensenders (der nicht notwendigerweise ein Akteur ist). ask
sendet die Nachricht und gibt eine Zukunft zurück, auf die gewartet werden kann, bis ein Timeout oder eine Antwort empfangen wird. tell
sendet die Nachricht und kehrt sofort zurück.
Im Fall von ask
sollte der Akteur, der die Nachricht empfängt, dem Absender antworten, wenn die Operation abgeschlossen ist.
Tags und Links scala asynchronous akka