Ja, es würde funktionieren, und es gibt sogar ein Akka dafür Muster eingebaut - pipe
:
import akka.pattern.pipe
override def receive = {
case msg =>
.... // do something
Future {
... // calculate response
response
} pipeTo sender()
}
Es gibt jedoch einige Einschränkungen in Ihrem Code sollten Sie Folgendes beachten:
sender
ist Wenn der Code in Ihrem Future{...}
-Block ausgeführt wird, verarbeitet der Akteur daher möglicherweise eine Nachricht von einem anderen Absender, sodass Sie dem falschen Absender antworten können. Um dies zu vermeiden, bewerten Sie Ihren Absender außerhalb der Schließung:
val mySender = sender()
Future {
... // calculate response
mySender ! response
}
Sie jedoch nicht kümmern müssen, wenn Sie pipe
verwenden.
Du eine Zukunft in einen Schauspieler Einwickeln und ruft, dass Schauspieler mit ask
, was wiederum gibt Ihnen eine Zukunft. Sie sollten wirklich in Betracht ziehen, die Zukunft direkt und ohne Schauspieler zu nennen. Wenn Sie den Schauspieler wirklich brauchen, z.B. Da Sie einen veränderlichen Zustand oder die Reihenfolge der Nachrichten sind wichtig, sollten Sie sich bewusst sein, dass die Future
nicht auf den Thread des Schauspielers passieren, so dass Sie verlieren Ihre Konsistenz Zustand und die Reihenfolge der Nachrichten - ein weiterer Grund, den Schauspieler zu verlieren, und die Zukunft direkt anrufen.
Normalerweise werde ich nicht für eine Zukunft in einem Schauspieler gehen (wo Schauspieler fast nichts). Aber in meinem Fall bin ich auf eine andere Bibliothek angewiesen, die Nachrichten nur an einen Schauspieler senden kann (und das auch als Frage). Daher die Frage :-) – anindyaju99