Akka aktorzy: potrzeba przykładu, aby zrozumieć pewne podstawy

Majstruję przy akce i potrzebuję porady, jak wdrożyć coś konkretnego, co mam na myśli. Chcę mieć aktora, którego mogę wysłać DownloadFile(URI, File) wiadomość i ją ściągnąć. Ponieważ może to być równoległe, nie chcę pobierać plików po plikach, ale mam limit jednoczesnych pobrań.

Jaki jest zamierzony sposób modelowania czegoś takiego z Akką? Inne rzeczy, które przychodzą na myśl to: co się stanie, jeśli jeden z" robotnik " aktor umiera z jakiegoś powodu? Jak ponowić pobieranie? Itd. itd.

Wiem, że to bardzo ważne pytanie, ale mam nadzieję, że ktoś znajdzie czas, aby na nie odpowiedzieć! Dziękuję!

Author: Wallkobacka, 2011-01-04

2 answers

Daj temu szansę; tworzy trzy - ale można go skonfigurować tak, aby tworzyć tyle, ile chcesz-downloadery, tak, że trzy żądania pobierania mogą być przetwarzane współbieżnie.

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])
}
 23
Author: David,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-13 20:07:53

Utwórz klasę DownloadActor, która zarządza pobieranymi plikami, Czy wszystkie osoby pobierające mają ten sam Dyspozytor, Skonfiguruj dyspozytora zgodnie z Twoimi potrzebami (Maksymalna liczba wątków, rozmiar kolejki itp), Czy wszystkie osoby pobierające są połączone z tym samym przełożonym, Skonfiguruj przełożonego zgodnie z własnymi potrzebami (prawdopodobnie jednym z), Utwórz nowy DownloadActor dla każdego nowego pobrania lub użyj LoadBalancer z odpowiednim InfiniteIterator do dystrybucji pobrań do Do pobrania.

Jeśli używasz AsycHttpClient do pobierania plików, obsługuje on download-resume.

 8
Author: Viktor Klang,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-04 16:06:38