2011-01-04 6 views
13

Ich bin mit Akka basteln und brauche ein paar Tipps, wie Sie etwas implementieren, das ich im Hinterkopf habe. Ich möchte einen Schauspieler haben, den ich eine DownloadFile(URI, File) Nachricht senden und herunterladen kann. Da dies parallel durchgeführt werden kann, möchte ich keine Datei nach der anderen herunterladen, sondern eine Begrenzung der gleichzeitigen Downloads haben.Akka Actors: Brauchen Sie ein Beispiel, um einige Grundlagen zu verstehen

Was ist die beabsichtigte Art, so etwas mit Akka zu modellieren? Andere Dinge, die einem einfallen, sind: Was passiert, wenn einer der "Arbeiter" -Schauspieler aus irgendeinem Grund stirbt? Wie kann ich den Download wiederholen? Usw.

Ich weiß, dass dies eine sehr große Frage ist, aber ich hoffe, dass jemand sich die Zeit nimmt, es zu beantworten! Vielen Dank!

Antwort

22

Geben Sie eine Einstellung; Es erstellt drei - Sie können es jedoch so konfigurieren, dass beliebig viele Downloader erstellt werden, sodass drei Downloadanforderungen gleichzeitig ausgeführt werden können.

sealed trait DownloaderMessage 
case class DownloadFile(uri: URI, file: File) extends DownloaderMessage 

object Downloader { 
    val dispatcher = Dispatchers.newExecutorBasedEventDrivenWorkStealingDispatcher("pool").build 
} 

class Downloader extends Actor { 
    self.lifeCycle = Permanent 
    self.dispatcher = Downloader.dispatcher 
    def receive = { 
    case DownloadFile(uri, file) => 
     // do the download 
    } 
} 

trait CyclicLoadBalancing extends LoadBalancer { this: Actor => 
    val downloaders: List[ActorRef] 
    val seq = new CyclicIterator[ActorRef](downloaders) 
} 

trait DownloadManager extends Actor { 
    self.lifeCycle = Permanent 
    self.faultHandler = OneForOneStrategy(List(classOf[Exception]), 5, 5000) 
    val downloaders: List[ActorRef] 
    override def preStart = downloaders foreach { self.startLink(_) } 
    override def postStop = self.shutdownLinkedActors() 
} 

class DownloadService extends DownloadManager with CyclicLoadBalancing { 
    val downloaders = List.fill(3)(Actor.actorOf[Downloader]) 
} 
8

eine DownloadActor Klasse erstellen, die die Downloads verwaltet, Haben alle DownloadActors den gleichen Dispatcher teilen, Konfigurieren Sie den Dispatcher nach Ihren Bedürfnissen (max num Fäden, Warteschlangengröße usw.), Haben alle DownloadActors auf den gleichen Betreuer verbunden, Konfigurieren Sie den Supervisor gemäß Ihren Anforderungen (wahrscheinlich OneForOneStrategy), Erstellen Sie einen neuen DownloadActor für jeden neuen Download oder verwenden Sie einen LoadBalancer mit einem geeigneten InfiniteIterator, um die Downloads an die DownloadActors zu verteilen.

Wenn Sie AsycHttpClient zum Herunterladen der Dateien verwenden, wird Download-Resume unterstützt.

Verwandte Themen