2011-01-04 4 views
13

Sto armeggiando con Akka e ho bisogno di qualche consiglio su come implementare qualcosa di specifico che ho in mente. Voglio avere un attore che possa inviare un messaggio DownloadFile(URI, File) e lo scarichi. Poiché questo può essere messo in parallelo, non voglio scaricare file dopo file ma avere un limite di download simultanei.Attori di Akka: serve un esempio per comprendere alcune nozioni di base

Qual è il modo previsto di modellare qualcosa di simile con Akka? Altre cose che vengono in mente sono: cosa succede se uno degli attori "lavoratori" muore per qualche motivo? Come riprovare il download? Ecc. Ecc.

So che questa è una domanda molto grande ma spero che qualcuno impieghi il tempo per rispondere! Grazie!

risposta

22

Dai uno scatto; ne crea tre - ma è possibile configurarlo per crearne quanti ne vuoi - i downloader, in modo che le tre richieste di download possano essere elaborate contemporaneamente.

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

creare una classe DownloadActor che gestisce i download, avere tutte DownloadActors condividere lo stesso Dispatcher, Configurare il Dispatcher base alle proprie esigenze (fili max num, dimensione della coda, ecc), ho tutte DownloadActors collegato allo stesso Supervisor, Configurare il Supervisore in base alle proprie esigenze (probabilmente OneForOneStrategy), Creare un nuovo DownloadActor per ogni nuovo download o utilizzare un LoadBalancer con un InfiniteIterator appropriato per distribuire i download agli DownloadActor.

Se si utilizza AsycHttpClient per scaricare i file, supporta il ripristino del download.