Ich kann nicht herausfinden, warum habe ich den Fehler "deadLetters
"Sender wird Schauspieler [akka: // Main/deadLetters]
class MyActor extends Actor {
private def getIdList = Future { blocking(getIdListSync) }
private def getIdListSync = {
val inputStreamRaw = new URL(url).openConnection.getInputStream
val inputStream = scala.io.Source fromInputStream inputStreamRaw
val json = parse(inputStream getLines() mkString "\n")
val jsonIds = json \ "ids" \\ classOf[JInt]
jsonIds take idLimit map (_.toInt)
}
def receive = {
case Get =>
//doesn't work, the error is "sender" becomes "Actor[akka://Main/deadLetters]"
// getIdList onComplete {
// case Success(idList) =>
// sender ! Result(idList)
//
// case Failure(e) => // todo
// }
//works well
val idList = getInternalIdListSync
sender ! Result(idList)
}
}
Wie Sie sehen können, sender
wird Actor[akka://Main/deadLetters]
bei Future
mit und blocking
in der Methode betitelt getIdList
. Warum das? Sollte ich das nicht benutzen?
ist es sinnvoll, async Verfahren mit Zukunft (getIdList) zu verwenden, oder sollte ich einfach Synchronisierungsmethode (getIdListSync) verwenden? –
Das hängt davon ab, was die Aufgabe des Schauspielers ist. Wenn dies die einzige Aufgabe ist, die der Aktor ausführen soll, ist die Verwendung der synchronen Variante in Ordnung. In diesem Fall sollte die Skalierung mit mehreren gleichartigen Akteuren und einem Dispatcher erfolgen. Auf der anderen Seite sollten Sie die asynchrone Variante in Betracht ziehen, wenn der Akteur während der Erstellung der Liste etwas anderes tun soll. – tmbo
Aaaa, also Multithreading (und Futures) ist nur dann skalierbar, wenn es eine andere Aufgabe (oder mehr als eine Aufgabe insgesamt) gibt, an der gearbeitet wird, während die erste ausgeführt wird, richtig? –