Akka Actors: Need an example to understand some basics

前端 未结 2 1040
我寻月下人不归
我寻月下人不归 2021-01-31 21:10

I\'m tinkering with Akka and need some advice how to implement something specific i have in mind. I want to have an actor which i can send a DownloadFile(URI, File)

相关标签:
2条回答
  • 2021-01-31 21:52

    Create a DownloadActor class that manages the downloads, Have all DownloadActors share the same Dispatcher, Configure the Dispatcher according to your needs (max num threads, queue size etc), Have all DownloadActors linked to the same Supervisor, Configure the Supervisor according to your needs (probably OneForOneStrategy), Create a new DownloadActor for each new Download or use a LoadBalancer with an appropriate InfiniteIterator to distribute the downloads to the DownloadActors.

    If you use AsycHttpClient to download the files, it supports download-resume.

    0 讨论(0)
  • 2021-01-31 22:03

    Give this a shot; it creates three - but you could configure it to create as many as you like - downloaders, so that three download requests could be processed 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])
    }
    
    0 讨论(0)
提交回复
热议问题