2011-11-07 3 views
7

énoncé du problème: J'ai un portefeuille de titres qui doivent être traités en parallèle. En Java j'ai utilisé un pool de threads pour traiter chaque sécurité, et utiliser un verrou pour le compte à rebours. Une fois terminé, je fais une fusion, etc.fourchette et joindre en utilisant Akka

Donc, je signale mon SecurityProcessor (qui est un acteur), et j'attends que tous les contrats à terme soient terminés. À la fin, j'utilise un MergeHelper pour faire le post-traitement. Le SecurityProcessor prend la sécurité, fait un peu i/o et le traitement et les réponses d'une sécurité

val listOfFutures = new ListBuffer[Future[Security]]() 
    var portfolioResponse: Portfolio = _ 
    for (security <- portfolio.getSecurities.toList) { 
    val securityProcessor = actorOf[SecurityProcessor].start() 
    listOfFutures += (securityProcessor ? security) map { 
     _.asInstanceOf[Security] 
    } 
    } 
    val futures = Future.sequence(listOfFutures.toList) 
    futures.map { 
    listOfSecurities => 
     portfolioResponse = MergeHelper.merge(portfolio, listOfSecurities) 
    }.get 

Cette conception est correcte, et est-il une meilleure/refroidisseur moyen de mettre en œuvre ce problème commun à l'aide akka?

Répondre

8
val futureResult = Future.sequence(
        portfolio.getSecurities.toList map { security => (actorOf[SecurityProcessor].start() ? security).mapTo[Security] } 
       ) map { securities => MergeHelper.merge(portfolio, securities) } 
+0

vraiment aimé cette suggestion et fonctionne comme prévu que je devais partager et ajouter tas de déclarations Eventhandler.info pour déboguer un problème :( –

+0

débogage def [T] (t: T): T = {EventHandler .info (t); t} –

+0

akka est génial !! –