Question

Je suis bricoler et Akka ont besoin des conseils comment mettre en œuvre spécifique quelque chose que j'ai à l'esprit. Je veux avoir un acteur que je peux envoyer un message DownloadFile(URI, File) et télécharge. Puisque cela peut être mis en parallèle, je ne veux pas le fichier de téléchargement après fichier, mais une limite de téléchargements simultanés.

Quelle est la façon de modèle destiné quelque chose comme ça avec Akka? D'autres choses qui viennent à l'esprit sont: Qu'advient-il si l'un des acteurs « travailleur » filières pour une raison quelconque? Comment relancer le téléchargement? Etc etc.

Je sais que c'est une question très énorme, mais j'espère que quelqu'un prend le temps de répondre! Merci!

Était-ce utile?

La solution

Donner ce un coup; il crée trois - mais vous pouvez le configurer pour créer autant que vous aimez -. téléchargeurs, de sorte que trois demandes de téléchargement pourraient être traitées concurrenty

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])
}

Autres conseils

Créer une classe DownloadActor qui gère les téléchargements, Ont tous DownloadActors partagent le même Dispatcher, Configurer le répartiteur selon les besoins (fils max num, la taille de la file d'attente, etc.), Avoir tous les DownloadActors liés au même superviseur, Configurez le superviseur en fonction de vos besoins (probablement OneForOneStrategy), Créer une nouvelle DownloadActor pour chaque nouveau téléchargement ou d'utiliser un LoadBalancer avec un InfiniteIterator approprié pour distribuer les téléchargements aux DownloadActors.

Si vous utilisez AsycHttpClient pour télécharger les fichiers, il prend en charge le téléchargement de reprise.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top